├── data └── config.example.json ├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── question.md │ ├── feature_request.md │ └── bug_report.md └── FUNDING.yml ├── .vscode └── settings.json ├── .gitignore ├── .dockerignore ├── Dockerfile ├── LICENSE ├── logger.js ├── package.json ├── src ├── latestVersion.js └── gamePromotions.js ├── test ├── gamePromotions.test.js └── data │ ├── bundles_shadowrun-collection_2020-09-01.json │ ├── freeGamesPromotions_2020-09-01.json │ └── products_hitman_2020-09-01.json ├── README.md ├── claimer.js └── .eslintrc.json /data/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "appriseUrl": null, 3 | "delay": 1440, 4 | "loop": false, 5 | "notifyIfNoUnclaimedFreebies": false, 6 | "options": {} 7 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Use this template for asking a question. Please SEARCH before posting! 4 | title: "(CHANGE THIS!) A Question?" 5 | labels: question 6 | --- 7 | 8 | ### Details 9 | 10 | ### Background (if needed) 11 | 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.format.enable": true, 3 | "editor.formatOnSave": true, 4 | "files.eol": "\n", 5 | "eslint.alwaysShowStatus": true, 6 | "prettier.requireConfig": true, 7 | "[javascript]": { 8 | "editor.defaultFormatter": "dbaeumer.vscode-eslint" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: Revadike 2 | patreon: Revadike 3 | custom: [ 4 | "https://steamcommunity.com/tradeoffer/new/?partner=82699538&token=V7DQVtra", 5 | "https://www.paypal.me/Revadike", 6 | "https://coinrequest.io/request/mBAhcRTlknrpSJZ", 7 | "https://www.blockchain.com/btc/address/149MawSVcw2gzNNbwhW84ZCwpHY4rU2uUB" 8 | ] 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Use this template for requesting a new feature. Please SEARCH before posting! 4 | title: "(CHANGE THIS!) A Descriptive Title" 5 | labels: enhancement 6 | --- 7 | 8 | ### Current Behavior (if any) 9 | 10 | 11 | ### Desired Behavior 12 | 13 | 14 | ### Motivation / Use Case for Changing the Behavior 15 | 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.bat 2 | *.log 3 | *.lnk 4 | node_modules 5 | package-lock.json 6 | DeviceAuthGenerator.exe 7 | device_auths.json 8 | deviceAuths.json 9 | history.json 10 | data/* 11 | !data/config.example.json 12 | .egstore/* 13 | .vscode/* 14 | !.vscode/settings.json 15 | !.vscode/tasks.json 16 | !.vscode/launch.json 17 | !.vscode/extensions.json 18 | *.code-workspace 19 | .idea 20 | .github 21 | # for python virtual env to test apprise 22 | venv 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Use this template for reporting a bug. Please SEARCH before posting! 4 | title: "(CHANGE THIS!) A Descriptive Title" 5 | labels: bug 6 | --- 7 | 8 | ### Expected Behavior 9 | 10 | 11 | ### Actual Behavior 12 | 13 | 14 | ### Steps to Reproduce the Problem 15 | 16 | 1. 17 | 2. 18 | 3. 19 | 20 | 21 | ### Specifications 22 | 23 | - `epicgames-freebies-claimer` Version: 24 | - Platform / OS: 25 | - Node Version: 26 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # From gitignore (modified) 2 | *.bat 3 | *.log 4 | *.lnk 5 | node_modules 6 | package-lock.json 7 | DeviceAuthGenerator.exe 8 | **device_auths.json** 9 | history.json 10 | .egstore 11 | .vscode 12 | *.code-workspace 13 | .idea 14 | .github 15 | 16 | # Folders 17 | .git 18 | test 19 | venv 20 | 21 | # Other files 22 | *Dockerfile* 23 | *dockerignore* 24 | .gitignore 25 | LICENSE 26 | README* 27 | .eslintrc.json 28 | .editorconfig 29 | 30 | # Ignore all files in data folder except for the example config 31 | data 32 | !data/config.example.json 33 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Builder stage 2 | FROM node:16-alpine3.12 as builder 3 | # Install dependencies for building node modules 4 | # python3, g++, make: required by node-gyp 5 | # git: required by npm 6 | WORKDIR /app 7 | COPY ./package.json ./package.json 8 | RUN apk add --no-cache --virtual build-deps \ 9 | python3=~3.8 \ 10 | make=~4.3 \ 11 | g++=~9.3 \ 12 | git=~2.26 \ 13 | && npm install --only=production \ 14 | && apk del build-deps 15 | 16 | # App stage 17 | FROM node:16-alpine3.12 as app 18 | 19 | # Install apprise 20 | RUN apk add --no-cache \ 21 | python3=~3.8 \ 22 | py3-pip=~20.1 \ 23 | py3-cryptography=~2.9 \ 24 | && pip3 --no-cache-dir install apprise==0.9.6 25 | 26 | WORKDIR /app 27 | COPY . /app 28 | COPY --from=builder /app/node_modules ./node_modules 29 | 30 | CMD ["npm", "start", "--no-update-notifier"] 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Revadike 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /logger.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const colors = require("colors"); 3 | const fs = require("fs"); 4 | const path = require("path"); 5 | 6 | module.exports = { 7 | "format": " {{timestamp}} | {{title}} | {{message}}", 8 | "dateformat": "yyyy-mm-dd | HH:MM:ss.l", 9 | "filters": { 10 | "log": colors.white, 11 | "trace": colors.magenta, 12 | "debug": colors.blue, 13 | "info": colors.green, 14 | "warn": colors.magenta, 15 | "error": [colors.red, colors.bold], 16 | }, 17 | "preprocess": (data) => { 18 | data.title = data.title.toUpperCase(); 19 | while (data.title.length < 5) { data.title += " "; } 20 | data.args = [...data.args]; 21 | if (data.args[0] && data.args[0].logpath) { 22 | data.logpath = data.args[0].logpath; 23 | data.args.shift(); 24 | } 25 | }, 26 | "transport": (data) => { 27 | // eslint-disable-next-line no-console 28 | console.log(data.output); 29 | 30 | const streamoptions = { 31 | "flags": "a", 32 | "encoding": "utf8", 33 | }; 34 | fs.createWriteStream(path.join(__dirname, "claimer.log"), streamoptions).write(`\r\n${data.rawoutput}`); 35 | if (data.logpath) { 36 | fs.createWriteStream(data.logpath, streamoptions).write(`\r\n${data.rawoutput}`); 37 | } 38 | }, 39 | }; 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "epicgames-freebies-claimer", 3 | "version": "1.5.8", 4 | "description": "Claim free game promotions from the Epic Game Store", 5 | "author": { 6 | "name": "Revadike", 7 | "email": "revadike@outlook.com", 8 | "url": "https://revadike.com" 9 | }, 10 | "contributors": [ 11 | "davispuh", 12 | "drosoCode", 13 | "ffuubarbuzz", 14 | "jackblk", 15 | "JourneyOver", 16 | "lingsamuel", 17 | "lupohan44", 18 | "MusTangLee", 19 | "wzxjohn", 20 | "zaevi" 21 | ], 22 | "funding": [ 23 | { 24 | "type": "patreon", 25 | "url": "https://patreon.com/Revadike" 26 | }, 27 | { 28 | "type": "steam", 29 | "url": "https://steamcommunity.com/tradeoffer/new/?partner=82699538&token=V7DQVtra" 30 | }, 31 | { 32 | "type": "paypal", 33 | "url": "https://www.paypal.me/Revadike" 34 | } 35 | ], 36 | "main": "claimer.js", 37 | "scripts": { 38 | "test": "mocha", 39 | "start": "node claimer.js" 40 | }, 41 | "license": "MIT", 42 | "repository": { 43 | "type": "git", 44 | "url": "git+https://github.com/revadike/epicgames-freebies-claimer.git" 45 | }, 46 | "bugs": { 47 | "url": "https://github.com/revadike/epicgames-freebies-claimer/issues" 48 | }, 49 | "homepage": "https://github.com/revadike/epicgames-freebies-claimer", 50 | "url": "https://github.com/revadike/epicgames-freebies-claimer", 51 | "devDependencies": { 52 | "@babel/core": "latest", 53 | "@babel/eslint-parser": "latest", 54 | "chai": "*", 55 | "eslint": "latest", 56 | "mocha": "*" 57 | }, 58 | "dependencies": { 59 | "colors": "1.4.0", 60 | "epicgames-client": "Revadike/node-epicgames-client#develop", 61 | "tracer": "^1.0.3" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/latestVersion.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const HTTPS = require("https"); 4 | 5 | // taken & modified from https://stackoverflow.com/a/38543075/8068153 6 | function httpsRequest(params, postData) { 7 | return new Promise((res, rej) => { 8 | let req = HTTPS.request(params, (response) => { 9 | // reject on bad status 10 | if (response.statusCode < 200 || response.statusCode >= 300) { 11 | rej(new Error(`HTTP Error ${response.statusCode}`)); 12 | } 13 | 14 | // cumulate data 15 | let body = []; 16 | response.on("data", (chunk) => { 17 | body.push(chunk); 18 | }); 19 | 20 | // resolve on end 21 | response.on("end", () => { 22 | try { 23 | body = JSON.parse(Buffer.concat(body).toString()); 24 | // Get latest release, remove "v" prefix. 25 | return res(body[0].tag_name.substring(1)); 26 | } catch (e) { 27 | return rej(e); 28 | } 29 | }); 30 | }); 31 | 32 | // reject on request error 33 | req.on("error", (err) => { 34 | // This is not a "Second reject", just a different sort of failure 35 | rej(err); 36 | }); 37 | 38 | // Sometimes github actions network will have hiccup... 39 | // https://github.com/Revadike/epicgames-freebies-claimer/issues/152 40 | req.on("timeout", () => { 41 | req.destroy(); 42 | rej(new Error("Request timeout")); 43 | }); 44 | 45 | if (postData) { 46 | req.write(postData); 47 | } 48 | 49 | // IMPORTANT 50 | req.end(); 51 | }); 52 | } 53 | 54 | function latestVersion() { 55 | return httpsRequest({ 56 | "host": "api.github.com", 57 | "path": "/repos/Revadike/epicgames-freebies-claimer/releases", 58 | "method": "GET", 59 | "headers": { "user-agent": "EFC" }, 60 | "timeout": 3000, 61 | }); 62 | } 63 | 64 | module.exports = { latestVersion }; 65 | -------------------------------------------------------------------------------- /test/gamePromotions.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | "use strict"; 3 | 4 | const { readFileSync } = require("fs"); 5 | const { resolve } = require("path"); 6 | const gamePromotions = require("../src/gamePromotions.js"); 7 | const { expect } = require("chai"); 8 | 9 | function readData(name, date = null) { 10 | let filename = name.replace("/", "_"); 11 | if (date) { 12 | filename += `_${date}`; 13 | } 14 | return JSON.parse(readFileSync(resolve(__dirname, "data", `${filename}.json`)).toString()); 15 | } 16 | 17 | let client = {}; 18 | // eslint-disable-next-line 19 | client.getBundleForSlug = async function(slug) { return readData(`bundles_${slug}`, this.date); }; 20 | // eslint-disable-next-line 21 | client.getProductForSlug = async function(slug) { return readData(`products_${slug}`, this.date); }; 22 | 23 | describe("freeGamesPromotions", () => { 24 | let target = async(date) => { 25 | client.date = date; 26 | client.freeGamesPromotions = () => readData("freeGamesPromotions", date); 27 | 28 | return (await gamePromotions.freeGamesPromotions(client)) 29 | .map((o) => ({ "title": o.title, "id": o.id, "namespace": o.namespace })); 30 | }; 31 | 32 | let date = "2020-09-01"; 33 | context(`On ${date}`, () => { 34 | it("should return current 100% discounted games", async() => { 35 | let freeGames = await target(date); 36 | 37 | expect(freeGames).to.deep.include({ 38 | "title": "Shadowrun Collection", 39 | "id": "c5cb60ecc6554c6a8d9a682b87ab04bb", 40 | "namespace": "bd8a7e894699493fb21503837f7b66c5", 41 | }); 42 | 43 | expect(freeGames).to.deep.include({ 44 | "title": "HITMAN", 45 | "id": "e8efad3d47a14284867fef2c347c321d", 46 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 47 | }); 48 | 49 | expect(freeGames).to.have.lengthOf(2); 50 | }); 51 | 52 | it("should not return coming discounted games", async() => { 53 | let freeGames = await target(date); 54 | 55 | expect(freeGames).to.not.deep.include({ "namespace": "5c0d568c71174cff8026db2606771d96" }); 56 | }); 57 | 58 | it("should not return other free games", async() => { 59 | let freeGames = await target(date); 60 | 61 | expect(freeGames).to.not.deep.include({ "namespace": "d6a3cae34c5d4562832610b5b8664576" }); 62 | }); 63 | }); 64 | }); 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EpicGames Freebies Claimer 2 | ![image](https://user-images.githubusercontent.com/4411977/74479432-6a6d1b00-4eaf-11ea-930f-1b89e7135887.png) 3 | 4 | ## ⚠️Status⚠️ 5 | EpicGames has made captchas mandatory for claiming free games. Currently, epicgames freebies claimer cannot handle this, so [it is not working](https://github.com/Revadike/epicgames-freebies-claimer/issues/172). I am trying to fix it by implementating anti captcha solutions. You can track my progression [here](https://github.com/Revadike/epicgames-freebies-claimer/pull/184). Any help would be greatly appreciated! 6 | 7 | ## Description 8 | Claim [available free game promotions](https://www.epicgames.com/store/free-games) from the Epic Games Store. 9 | 10 | ## Requirements 11 | * [DeviceAuthGenerator](https://github.com/jackblk/DeviceAuthGenerator/releases) 12 | * [Git](https://git-scm.com/downloads) 13 | * [Node.js](https://nodejs.org/download/) (with build tools checked) 14 | > Node version >= 15 15 | 16 | ## Instructions - Quick 17 | 0. (Optional) ☆ Star this project :) 18 | 1. Download/clone this repository 19 | 2. Run `npm install` 20 | 3. Generate `data/device_auths.json` (using [DeviceAuthGenerator](https://github.com/jackblk/DeviceAuthGenerator)) 21 | 4. (Optional) Copy `data/config.example.json` to `data/config.json` and edit it 22 | 5. Run `npm start` 23 | 24 | ## Instructions - Detailed 25 | Check out the [wiki](https://github.com/Revadike/epicgames-freebies-claimer/wiki), written by @lucifudge. 26 | 27 | ## Instructions - Docker 28 | Check out the [wiki](https://github.com/Revadike/epicgames-freebies-claimer/wiki/User-Guide-(Docker)), written by @jackblk. 29 | 30 | ## FAQ 31 | ### Why should I use this? 32 | This is for the truly lazy, you know who you are. ;) 33 | Also, this is a good alternative, in case you don't like using Epic's client or website (and I don't blame you). 34 | 35 | ### Why should I even bother claiming these free games? 36 | To which I will say, why not? Most of these games are actually outstanding games! Even if you don't like Epic and their shenanigans, you will be pleased to know that Epic actually funds all the free copies that are given away: ["But we actually found it was more economical to pay developers [a lump sum] to distribute their game free for two weeks..."](https://arstechnica.com/gaming/2019/03/epic-ceo-youre-going-to-see-lower-prices-on-epic-games-store/) 37 | 38 | ## Changelog 39 | 40 | [Full changelog in Wiki](https://github.com/Revadike/epicgames-freebies-claimer/releases) 41 | 42 | ## Happy Freebie Claiming! 43 | ![image](https://user-images.githubusercontent.com/4411977/122922274-bb263b00-d363-11eb-8b82-8a3ed6e7e29d.png) 44 | -------------------------------------------------------------------------------- /src/gamePromotions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | async function getAddonForSlug(client, slug) { 4 | // eslint-disable-next-line max-len 5 | const URL = "https://www.epicgames.com/graphql?operationName=getMappingByPageSlug&variables=%7B%22pageSlug%22:%22{{slug}}%22%7D&extensions=%7B%22persistedQuery%22:%7B%22version%22:1,%22sha256Hash%22:%225a08e9869c983776596498e0c4052c55f9e54c79e18a303cd5eb9a46be55c7d7%22%7D%7D"; 6 | 7 | try { 8 | const { data } = await client.http.sendGet( 9 | URL.replace("{{slug}}", slug), 10 | ); 11 | 12 | return data; 13 | } catch (err) { 14 | client.debug.print(new Error(err)); 15 | } 16 | 17 | return false; 18 | } 19 | 20 | async function getOfferId(client, promo, locale = "en-US") { 21 | let id = null; 22 | let namespace = null; 23 | let slug = (promo.productSlug || promo.urlSlug).split("/")[0]; 24 | let isBundle = (promo) => Boolean(promo.categories.find((cat) => cat.path === "bundles")); 25 | let isAddon = (promo) => promo.offerType === "EDITION" || Boolean(promo.categories.find((cat) => cat.path === "addons")); 26 | 27 | if (isAddon(promo)) { 28 | let result = await getAddonForSlug(client, slug, locale); 29 | // eslint-disable-next-line prefer-destructuring 30 | id = result.data.StorePageMapping.mapping.mappings.offerId; 31 | } else if (isBundle(promo)) { 32 | let result = await client.getBundleForSlug(slug, locale); 33 | let page = result.pages ? result.pages.find((p) => p.offer.id === promo.id) || result.pages[0] : result; 34 | // eslint-disable-next-line prefer-destructuring 35 | id = page.offer.id; 36 | // eslint-disable-next-line prefer-destructuring 37 | namespace = page.offer.namespace; 38 | } else { 39 | let result = await client.getProductForSlug(slug, locale); 40 | let page = result.pages ? result.pages.find((p) => p.offer.id === promo.id) || result.pages[0] : result; 41 | // eslint-disable-next-line prefer-destructuring 42 | id = page.offer.id; 43 | // eslint-disable-next-line prefer-destructuring 44 | namespace = page.offer.namespace; 45 | } 46 | 47 | return { namespace, id }; 48 | } 49 | 50 | async function freeGamesPromotions(client, country = "US", allowCountries = "US", locale = "en-US") { 51 | let { data } = await client.freeGamesPromotions(country, allowCountries, locale); 52 | let { elements } = data.Catalog.searchStore; 53 | let free = elements.filter((offer) => offer.promotions 54 | && offer.promotions.promotionalOffers.length > 0 55 | && offer.promotions.promotionalOffers[0].promotionalOffers.find((p) => p.discountSetting.discountPercentage === 0)); 56 | 57 | let freeOffers = await Promise.all(free.map(async(promo) => { 58 | let { title } = promo; 59 | let { namespace, id } = await getOfferId(client, promo, locale); 60 | namespace = namespace || promo.namespace; 61 | return { title, id, namespace }; 62 | })); 63 | 64 | return freeOffers; 65 | } 66 | 67 | module.exports = { freeGamesPromotions }; 68 | -------------------------------------------------------------------------------- /claimer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { writeFile, writeFileSync, existsSync, readFileSync } = require("fs"); 4 | if (!existsSync(`${__dirname}/data/config.json`)) { 5 | writeFileSync(`${__dirname}/data/config.json`, readFileSync(`${__dirname}/data/config.example.json`)); 6 | } 7 | if (!existsSync(`${__dirname}/data/history.json`)) { 8 | writeFileSync(`${__dirname}/data/history.json`, "{}"); 9 | } 10 | 11 | const { "Launcher": EpicGames } = require("epicgames-client"); 12 | const { freeGamesPromotions } = require(`${__dirname}/src/gamePromotions`); 13 | const { latestVersion } = require(`${__dirname}/src/latestVersion.js`); 14 | const Auths = require(`${__dirname}/data/device_auths.json`); 15 | const Config = require(`${__dirname}/data/config.json`); 16 | const Fork = require("child_process"); 17 | const History = require(`${__dirname}/data/history.json`); 18 | const Logger = require("tracer").console(`${__dirname}/logger.js`); 19 | const Package = require(`${__dirname}/package.json`); 20 | 21 | function appriseNotify(appriseUrl, notificationMessages) { 22 | if (!appriseUrl || notificationMessages.length === 0) { 23 | return; 24 | } 25 | 26 | let notification = notificationMessages.join("\n"); 27 | try { 28 | let s = Fork.spawnSync("apprise", [ 29 | "-vv", 30 | "-t", 31 | `Epicgames Freebies Claimer ${Package.version}`, 32 | "-b", 33 | notification, 34 | appriseUrl, 35 | ]); 36 | 37 | let output = s.stdout ? s.stdout.toString() : "ERROR: Maybe apprise not found?"; 38 | if (output && output.includes("ERROR")) { 39 | Logger.error(`Failed to send push notification (${output})`); 40 | } else if (output) { 41 | Logger.info("Push notification sent"); 42 | } else { 43 | Logger.warn("No output from apprise"); 44 | } 45 | } catch (err) { 46 | Logger.error(`Failed to send push notification (${err})`); 47 | } 48 | } 49 | 50 | function write(path, data) { 51 | // eslint-disable-next-line no-extra-parens 52 | return new Promise((res, rej) => writeFile(path, data, (err) => (err ? rej(err) : res(true)))); 53 | } 54 | 55 | function sleep(delay) { 56 | return new Promise((res) => setTimeout(res, delay * 60000)); 57 | } 58 | 59 | (async() => { 60 | let { options, delay, loop, appriseUrl, notifyIfNoUnclaimedFreebies } = Config; 61 | 62 | do { 63 | Logger.info(`Epicgames Freebies Claimer (${Package.version}) by ${Package.author.name || Package.author}`); 64 | 65 | let latest = await latestVersion().catch((err) => { 66 | Logger.error(`Failed to check for updates (${err})`); 67 | }); 68 | 69 | if (latest && latest !== Package.version) { 70 | Logger.warn(`There is a new release available (${latest}): ${Package.url}`); 71 | } 72 | 73 | let notificationMessages = []; 74 | for (let email in Auths) { 75 | let { country } = Auths[email]; 76 | let claimedPromos = History[email] || []; 77 | let newlyClaimedPromos = []; 78 | let useDeviceAuth = true; 79 | let rememberDevicesPath = `${__dirname}/data/device_auths.json`; 80 | let clientOptions = { email, ...options, rememberDevicesPath }; 81 | let client = new EpicGames(clientOptions); 82 | 83 | if (!await client.init()) { 84 | let errMess = "Error while initialize process."; 85 | notificationMessages.push(errMess); 86 | Logger.error(errMess); 87 | break; 88 | } 89 | 90 | // Check before logging in 91 | let freePromos = await freeGamesPromotions(client, country, country); 92 | let unclaimedPromos = freePromos.filter((offer) => !claimedPromos.find( 93 | (_offer) => _offer.id === offer.id && _offer.namespace === offer.namespace, 94 | )); 95 | 96 | Logger.info(`Found ${unclaimedPromos.length} unclaimed freebie(s) for ${email}`); 97 | if (unclaimedPromos.length === 0) { 98 | if (notifyIfNoUnclaimedFreebies) { 99 | notificationMessages.push(`${email} has no unclaimed freebies`); 100 | } 101 | continue; 102 | } 103 | 104 | let success = await client.login({ useDeviceAuth }).catch(() => false); 105 | if (!success) { 106 | let errMess = `Failed to login as ${email}`; 107 | notificationMessages.push(errMess); 108 | Logger.error(errMess); 109 | continue; 110 | } 111 | 112 | Logger.info(`Logged in as ${client.account.name} (${client.account.id})`); 113 | Auths[email].country = client.account.country; 114 | write(rememberDevicesPath, JSON.stringify(Auths, null, 4)).catch(() => false); // ignore fails 115 | 116 | for (let offer of unclaimedPromos) { 117 | try { 118 | let purchased = await client.purchase(offer, 1); 119 | if (purchased) { 120 | Logger.info(`Successfully claimed ${offer.title} (${purchased})`); 121 | newlyClaimedPromos.push(offer.title); 122 | } else { 123 | Logger.warn(`${offer.title} was already claimed for this account`); 124 | } 125 | // Also remember already claimed offers 126 | offer.date = Date.now(); 127 | claimedPromos.push(offer); 128 | } catch (err) { 129 | notificationMessages.push(`${email} failed to claim ${offer.title}`); 130 | Logger.error(`Failed to claim ${offer.title} (${err})`); 131 | if (err.response 132 | && err.response.body 133 | && err.response.body.errorCode === "errors.com.epicgames.purchase.purchase.captcha.challenge") { 134 | // It's pointless to try next one as we'll be asked for captcha again. 135 | let errMess = "Aborting! Captcha detected."; 136 | notificationMessages.push(errMess); 137 | Logger.error(errMess); 138 | break; 139 | } 140 | } 141 | } 142 | 143 | History[email] = claimedPromos; 144 | 145 | // Setting up notification message for current account 146 | if (newlyClaimedPromos.length > 0) { 147 | notificationMessages.push(`${email} claimed ${newlyClaimedPromos.length} freebies: ${ 148 | newlyClaimedPromos.join(", ")}`); 149 | } else { 150 | notificationMessages.push(`${email} has claimed 0 freebies`); 151 | } 152 | 153 | await client.logout(); 154 | Logger.info(`Logged ${client.account.name} out of Epic Games`); 155 | } 156 | appriseNotify(appriseUrl, notificationMessages); 157 | 158 | await write(`${__dirname}/data/history.json`, JSON.stringify(History, null, 4)); 159 | if (loop) { 160 | Logger.info(`Waiting ${delay} minutes`); 161 | await sleep(delay); 162 | } else { 163 | process.exit(0); 164 | } 165 | } while (loop); 166 | })().catch((err) => { 167 | Logger.error(err); 168 | process.exit(1); 169 | }); 170 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true, 5 | "es2017": true, 6 | "es2020": true 7 | }, 8 | "extends": "eslint:recommended", 9 | "parser": "@babel/eslint-parser", 10 | "parserOptions": { 11 | "requireConfigFile": false 12 | }, 13 | "rules": { 14 | "accessor-pairs": "error", 15 | "array-bracket-newline": ["error", { "multiline": true }], 16 | "array-bracket-spacing": ["error", "never", { "arraysInArrays": true }], 17 | "array-callback-return": "error", 18 | "array-element-newline": ["error", { 19 | "ArrayExpression": "consistent", 20 | "ArrayPattern": { "multiline": true } 21 | }], 22 | "arrow-body-style": "error", 23 | "arrow-parens": "error", 24 | "arrow-spacing": "error", 25 | "block-scoped-var": "error", 26 | "block-spacing": "error", 27 | "brace-style": ["error", "1tbs", { "allowSingleLine": true }], 28 | "camelcase": "error", 29 | "class-methods-use-this": "error", 30 | "comma-dangle": ["error", "always-multiline"], 31 | "comma-spacing": "error", 32 | "comma-style": "error", 33 | "complexity": "error", 34 | "computed-property-spacing": "error", 35 | "consistent-return": "error", 36 | "consistent-this": "error", 37 | "curly": "error", 38 | "default-param-last": "error", 39 | "dot-location": ["error", "property"], 40 | "dot-notation": "error", 41 | "eol-last": "error", 42 | "eqeqeq": ["error", "smart"], 43 | "func-call-spacing": "error", 44 | "func-name-matching": "error", 45 | "func-names": "error", 46 | "func-style": ["error", "declaration", { "allowArrowFunctions": true }], 47 | "function-call-argument-newline": ["error", "consistent"], 48 | "function-paren-newline": ["error", "consistent"], 49 | "generator-star-spacing": "error", 50 | "grouped-accessor-pairs": ["error", "getBeforeSet"], 51 | "implicit-arrow-linebreak": "error", 52 | "indent": ["error", 4, { "SwitchCase": 1 }], 53 | "init-declarations": "error", 54 | "key-spacing": ["error", { "align": "value" }], 55 | "keyword-spacing": "error", 56 | "linebreak-style": "error", 57 | "lines-between-class-members": ["error", "always"], 58 | "max-classes-per-file": "error", 59 | "max-depth": ["error", 5], 60 | "max-len": ["error", 130], 61 | "max-nested-callbacks": ["error", 4], 62 | "max-statements-per-line": ["error", { "max": 2 }], 63 | "new-parens": "error", 64 | "newline-per-chained-call": "error", 65 | "no-alert": "error", 66 | "no-array-constructor": "error", 67 | "no-caller": "error", 68 | "no-case-declarations": "error", 69 | "no-confusing-arrow": "error", 70 | "no-console": "error", 71 | "no-constructor-return": "error", 72 | "no-dupe-else-if": "error", 73 | "no-duplicate-imports": "error", 74 | "no-else-return": "error", 75 | "no-extra-parens": ["error", "all", { "nestedBinaryExpressions": false }], 76 | "no-empty-function": "error", 77 | "no-eq-null": "error", 78 | "no-eval": "error", 79 | "no-extend-native": "error", 80 | "no-floating-decimal": "error", 81 | "no-implicit-coercion": "error", 82 | "no-implied-eval": "error", 83 | "no-invalid-this": "error", 84 | "no-iterator": "error", 85 | "no-labels": "error", 86 | "no-lone-blocks": "error", 87 | "no-lonely-if": "error", 88 | "no-loop-func": "error", 89 | "no-mixed-operators": "error", 90 | "no-multi-assign": "error", 91 | "no-multi-spaces": "error", 92 | "no-multi-str": "error", 93 | "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0, "maxBOF": 0 }], 94 | "no-negated-condition": "error", 95 | "no-nested-ternary": "error", 96 | "no-new": "error", 97 | "no-new-func": "error", 98 | "no-new-object": "error", 99 | "no-new-wrappers": "error", 100 | "no-octal": "error", 101 | "no-octal-escape": "error", 102 | "no-proto": "error", 103 | "no-redeclare": "error", 104 | "no-return-assign": "error", 105 | "no-return-await": "error", 106 | "no-script-url": "error", 107 | "no-self-compare": "error", 108 | "no-sequences": "error", 109 | "no-setter-return": "error", 110 | "no-tabs": "error", 111 | "no-template-curly-in-string": "error", 112 | "no-throw-literal": "error", 113 | "no-trailing-spaces": "error", 114 | "no-undef-init": "error", 115 | "no-undefined": "error", 116 | "no-unneeded-ternary": ["error", { "defaultAssignment": false }], 117 | "no-unused-expressions": "error", 118 | "no-use-before-define": "error", 119 | "no-useless-call": "error", 120 | "no-useless-computed-key": "error", 121 | "no-useless-concat": "error", 122 | "no-useless-constructor": "error", 123 | "no-useless-rename": "error", 124 | "no-useless-return": "error", 125 | "no-var": "error", 126 | "no-void": "error", 127 | "no-with": "error", 128 | "no-whitespace-before-property": "error", 129 | "nonblock-statement-body-position": "error", 130 | "object-curly-newline": ["error", { "multiline": true }], 131 | "object-curly-spacing": ["error", "always"], 132 | "object-property-newline": ["error", { "allowAllPropertiesOnSameLine": true }], 133 | "object-shorthand": "error", 134 | "one-var-declaration-per-line": "error", 135 | "operator-assignment": "error", 136 | "operator-linebreak": ["error", "before"], 137 | "padded-blocks": ["error", { "blocks": "never", "classes": "always", "switches": "never" }, { "allowSingleLineBlocks": true }], 138 | "padding-line-between-statements": [ 139 | "error", 140 | { "blankLine": "always", "prev": "function", "next": "function" } 141 | ], 142 | "prefer-arrow-callback": "error", 143 | "prefer-destructuring": ["error", { "array": false, "object": true }], 144 | "prefer-exponentiation-operator": "error", 145 | "prefer-numeric-literals": "error", 146 | "prefer-object-spread": "error", 147 | "prefer-promise-reject-errors": "error", 148 | "prefer-regex-literals": "error", 149 | "prefer-rest-params": "error", 150 | "prefer-spread": "error", 151 | "prefer-template": "error", 152 | "quote-props": "error", 153 | "quotes": ["error", "double", { "avoidEscape": true }], 154 | "radix": ["error", "as-needed"], 155 | "require-await": "error", 156 | "rest-spread-spacing": "error", 157 | "semi": ["error", "always"], 158 | "semi-spacing": "error", 159 | "semi-style": "error", 160 | "sort-imports": "error", 161 | "space-before-blocks": "error", 162 | "space-before-function-paren": ["error", "never"], 163 | "space-in-parens": "error", 164 | "space-infix-ops": "error", 165 | "space-unary-ops": "error", 166 | "spaced-comment": "error", 167 | "switch-colon-spacing": "error", 168 | "symbol-description": "error", 169 | "template-curly-spacing": "error", 170 | "template-tag-spacing": "error", 171 | "unicode-bom": "error", 172 | "vars-on-top": "error", 173 | "wrap-iife": ["error", "inside"], 174 | "yield-star-spacing": "error", 175 | "yoda": "error" 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /test/data/bundles_shadowrun-collection_2020-09-01.json: -------------------------------------------------------------------------------- 1 | { 2 | "offer": { 3 | "regionRestrictions": { 4 | "_type": "Store Region Filtering" 5 | }, 6 | "_type": "Diesel Offer", 7 | "namespace": "bd8a7e894699493fb21503837f7b66c5", 8 | "id": "c5cb60ecc6554c6a8d9a682b87ab04bb", 9 | "hasOffer": true 10 | }, 11 | "jcr:isCheckedOut": true, 12 | "data": { 13 | "productLinks": { 14 | "_type": "Diesel Product Lins" 15 | }, 16 | "socialLinks": { 17 | "_type": "Diesel Social Links", 18 | "title": "Follow Shadowrun ", 19 | "linkHomepage": "https://www.paradoxplaza.com/shadowrun-all/" 20 | }, 21 | "requirements": { 22 | "languages": [ 23 | "Audio: English", 24 | "Text: English" 25 | ], 26 | "systems": [ 27 | { 28 | "_type": "Diesel System Detail", 29 | "systemType": "Windows", 30 | "details": [ 31 | { 32 | "_type": "Diesel System Detail Item", 33 | "title": "OS", 34 | "minimum": "Windows XP SP3/Vista/Windows 7 & 8", 35 | "recommended": "Windows XP SP3/Vista/Windows 7 & 8" 36 | }, 37 | { 38 | "_type": "Diesel System Detail Item", 39 | "title": "Processor", 40 | "minimum": "x86-compatible 1.8GHz or faster processor", 41 | "recommended": "x86-compatible 2GHz or faster processor" 42 | }, 43 | { 44 | "_type": "Diesel System Detail Item", 45 | "title": "Memory", 46 | "minimum": "2 GB RAM", 47 | "recommended": "4 GB RAM" 48 | }, 49 | { 50 | "_type": "Diesel System Detail Item", 51 | "title": "Storage", 52 | "minimum": "30 GB available space", 53 | "recommended": "30 GB available space" 54 | }, 55 | { 56 | "_type": "Diesel System Detail Item", 57 | "title": "Direct X", 58 | "minimum": "Version 9.0", 59 | "recommended": "Version 9.0" 60 | }, 61 | { 62 | "_type": "Diesel System Detail Item", 63 | "title": "Graphics", 64 | "minimum": "DirectX compatible 3D graphics card with at least 256MB of addressable memory", 65 | "recommended": " DirectX compatible 3D graphics card with 512MB of addressable memory" 66 | } 67 | ] 68 | } 69 | ], 70 | "accountRequirements": "NO_REQUIREMENTS", 71 | "_type": "Diesel System Details", 72 | "rating": { 73 | "_type": "Diesel Rating" 74 | } 75 | }, 76 | "footer": { 77 | "_type": "Diesel Product Footer", 78 | "privacyPolicyLink": { 79 | "_type": "Diesel Link" 80 | } 81 | }, 82 | "meta": { 83 | "releaseDate": "2020-08-20T13:00:00.000Z", 84 | "_type": "Epic Store Meta", 85 | "publisher": [ 86 | "Paradox Interactive" 87 | ], 88 | "logo": { 89 | "src": "https://cdn2.unrealengine.com/logo-400x400-400x400-777098045.png", 90 | "_type": "Epic Store Image" 91 | }, 92 | "developer": [ 93 | "Harebrained Schemes" 94 | ], 95 | "platform": [ 96 | "Windows" 97 | ] 98 | }, 99 | "_type": "Store Bundle Detail", 100 | "about": { 101 | "image": { 102 | "src": "https://cdn2.unrealengine.com/landscape-image-shadowcoll-2560x1440-777100077.jpg", 103 | "_type": "Diesel Image" 104 | }, 105 | "developerAttribution": "Harebrained Schemes", 106 | "_type": "Diesel Product About", 107 | "publisherAttribution": " Paradox Interactive", 108 | "description": "# Shadowrun Returns\n\nThe unique cyberpunk-meets-fantasy world of Shadowrun has gained a huge cult following since its creation nearly 25 years ago. Creator Jordan Weisman returns to the world of Shadowrun, modernizing this classic game setting as a single player, turn-based tactical RPG. In the urban sprawl of the Seattle metroplex, the search for a mysterious killer sets you on a trail that leads from the darkest slums to the city’s most powerful megacorps.\n\nYou will need to tread carefully, enlist the aid of other runners, and master powerful forces of technology and magic in order to emerge from the shadows of Seattle unscathed.\n\n# Shadowrun Dragonfall - Director Cut\n\nShadowrun: Dragonfall - Director’s Cut is a standalone release of Harebrained Schemes' critically-acclaimed Dragonfall campaign, which first premiered as a major expansion for Shadowrun Returns. The Director's Cut adds a host of new content and enhancements to the original game: 5 all-new missions, alternate endings, new music, a redesigned interface, team customization options, a revamped combat system, and more - making it the definitive version of this one-of-a-kind cyberpunk RPG experience.\n\n# Shadowrun Hong Kong - Extended Edition\n\nShadowrun: Hong Kong - Extended Edition is the capstone title in Harebrained Schemes' Shadowrun series - and includes the all-new, 6+ hr Shadows of Hong Kong Bonus Campaign. Experience the most impressive Shadowrun RPG yet, hailed as one of the best cRPG / strategy games of 2015!", 109 | "shortDescription": "Shadowrun Collection includes Shadowrun Returns (Base Game), Shadowrun Dragonfall - Director Cut (Base Game) and Shadowrun Hong Kong - Extended Edition (Base Game)", 110 | "title": "Shadowrun Collection", 111 | "developerLogo": { 112 | "_type": "Diesel Image" 113 | } 114 | }, 115 | "banner": { 116 | "showPromotion": false, 117 | "_type": "Epic Store Product Banner", 118 | "link": { 119 | "_type": "Diesel Link" 120 | } 121 | }, 122 | "includes": { 123 | "_type": "Store Bundle Includes", 124 | "items": [ 125 | { 126 | "image": { 127 | "src": "https://cdn2.unrealengine.com/egs-shadowrunreturns-harebrainedschemes-s1-2560x1440-768642852.jpg", 128 | "_type": "Epic Store Image" 129 | }, 130 | "_type": "Store Bundle Included Section", 131 | "link": { 132 | "src": "/product/shadowrun-returns", 133 | "_type": "Diesel Link", 134 | "title": "Shadowrun Returns" 135 | }, 136 | "description": "The unique cyberpunk-meets-fantasy world of Shadowrun has gained a huge cult following since its creation. Creator Jordan Weisman returns to the world of Shadowrun, modernizing this classic game setting as a single player, turn-based tactical RPG.", 137 | "title": "Shadowrun Returns" 138 | }, 139 | { 140 | "image": { 141 | "src": "https://cdn2.unrealengine.com/egs-shadowrundragonfalldirectorcut-harebrainedschemes-s1-2560x1440-769294674.jpg", 142 | "_type": "Epic Store Image" 143 | }, 144 | "_type": "Store Bundle Included Section", 145 | "link": { 146 | "src": "/product/shadowrun-dragonfall", 147 | "_type": "Diesel Link", 148 | "title": "Shadowrun: Dragonfall" 149 | }, 150 | "description": "Harebrained Schemes' biggest Shadowrun game to date, and the definitive Shadowrun RPG experience available on PC. A standalone title with tons of new content & improvements!", 151 | "title": "Shadowrun: Dragonfall - Director’s Cut" 152 | }, 153 | { 154 | "image": { 155 | "src": "https://cdn2.unrealengine.com/egs-shadowrunhongkongextendededition-harebrainedschemes-s1-2560x1440-768923401.jpg", 156 | "_type": "Epic Store Image" 157 | }, 158 | "_type": "Store Bundle Included Section", 159 | "link": { 160 | "src": "/product/shadowrun-hong-kong", 161 | "_type": "Diesel Link", 162 | "title": "Shadowrun Hong Kong - Extended Edition" 163 | }, 164 | "description": "Shadowrun: Hong Kong - Extended Edition is the capstone title in Harebrained Schemes' Shadowrun series - and includes the all-new, 6+ hr Shadows of Hong Kong Bonus Campaign.", 165 | "title": "Shadowrun Hong Kong - Extended Edition" 166 | } 167 | ] 168 | }, 169 | "carousel": { 170 | "_type": "Diesel Carousel", 171 | "items": [ 172 | { 173 | "image": { 174 | "src": "https://cdn2.unrealengine.com/landscape-image-shadowcoll-2560x1440-777100077.jpg", 175 | "_type": "Diesel Image" 176 | }, 177 | "_type": "Diesel Carousel Item - Image OR Video", 178 | "video": { 179 | "loop": false, 180 | "_type": "Diesel Video", 181 | "hasFullScreen": false, 182 | "hasControls": false, 183 | "muted": false, 184 | "autoplay": false 185 | } 186 | }, 187 | { 188 | "image": { 189 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-01-1920x1080-785870290.jpg", 190 | "_type": "Diesel Image" 191 | }, 192 | "_type": "Diesel Carousel Item - Image OR Video", 193 | "video": { 194 | "loop": false, 195 | "_type": "Diesel Video", 196 | "hasFullScreen": false, 197 | "hasControls": false, 198 | "muted": false, 199 | "autoplay": false 200 | } 201 | }, 202 | { 203 | "image": { 204 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-02-1920x1080-785870323.jpg", 205 | "_type": "Diesel Image" 206 | }, 207 | "_type": "Diesel Carousel Item - Image OR Video", 208 | "video": { 209 | "loop": false, 210 | "_type": "Diesel Video", 211 | "hasFullScreen": false, 212 | "hasControls": false, 213 | "muted": false, 214 | "autoplay": false 215 | } 216 | }, 217 | { 218 | "image": { 219 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-03-1920x1080-785870474.jpg", 220 | "_type": "Diesel Image" 221 | }, 222 | "_type": "Diesel Carousel Item - Image OR Video", 223 | "video": { 224 | "loop": false, 225 | "_type": "Diesel Video", 226 | "hasFullScreen": false, 227 | "hasControls": false, 228 | "muted": false, 229 | "autoplay": false 230 | } 231 | }, 232 | { 233 | "image": { 234 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-04-1920x1080-785870331.jpg", 235 | "_type": "Diesel Image" 236 | }, 237 | "_type": "Diesel Carousel Item - Image OR Video", 238 | "video": { 239 | "loop": false, 240 | "_type": "Diesel Video", 241 | "hasFullScreen": false, 242 | "hasControls": false, 243 | "muted": false, 244 | "autoplay": false 245 | } 246 | }, 247 | { 248 | "image": { 249 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-05-1920x1080-785870547.jpg", 250 | "_type": "Diesel Image" 251 | }, 252 | "_type": "Diesel Carousel Item - Image OR Video", 253 | "video": { 254 | "loop": false, 255 | "_type": "Diesel Video", 256 | "hasFullScreen": false, 257 | "hasControls": false, 258 | "muted": false, 259 | "autoplay": false 260 | } 261 | }, 262 | { 263 | "image": { 264 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-06-1920x1080-785870233.jpg", 265 | "_type": "Diesel Image" 266 | }, 267 | "_type": "Diesel Carousel Item - Image OR Video", 268 | "video": { 269 | "loop": false, 270 | "_type": "Diesel Video", 271 | "hasFullScreen": false, 272 | "hasControls": false, 273 | "muted": false, 274 | "autoplay": false 275 | } 276 | }, 277 | { 278 | "image": { 279 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-07-1920x1080-785870678.jpg", 280 | "_type": "Diesel Image" 281 | }, 282 | "_type": "Diesel Carousel Item - Image OR Video", 283 | "video": { 284 | "loop": false, 285 | "_type": "Diesel Video", 286 | "hasFullScreen": false, 287 | "hasControls": false, 288 | "muted": false, 289 | "autoplay": false 290 | } 291 | }, 292 | { 293 | "image": { 294 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-08-1920x1080-785870757.jpg", 295 | "_type": "Diesel Image" 296 | }, 297 | "_type": "Diesel Carousel Item - Image OR Video", 298 | "video": { 299 | "loop": false, 300 | "_type": "Diesel Video", 301 | "hasFullScreen": false, 302 | "hasControls": false, 303 | "muted": false, 304 | "autoplay": false 305 | } 306 | }, 307 | { 308 | "image": { 309 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-09-1920x1080-785870879.jpg", 310 | "_type": "Diesel Image" 311 | }, 312 | "_type": "Diesel Carousel Item - Image OR Video", 313 | "video": { 314 | "loop": false, 315 | "_type": "Diesel Video", 316 | "hasFullScreen": false, 317 | "hasControls": false, 318 | "muted": false, 319 | "autoplay": false 320 | } 321 | }, 322 | { 323 | "image": { 324 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-10-1920x1080-785870817.jpg", 325 | "_type": "Diesel Image" 326 | }, 327 | "_type": "Diesel Carousel Item - Image OR Video", 328 | "video": { 329 | "loop": false, 330 | "_type": "Diesel Video", 331 | "hasFullScreen": false, 332 | "hasControls": false, 333 | "muted": false, 334 | "autoplay": false 335 | } 336 | }, 337 | { 338 | "image": { 339 | "src": "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-11-1920x1080-785871134.jpg", 340 | "_type": "Diesel Image" 341 | }, 342 | "_type": "Diesel Carousel Item - Image OR Video", 343 | "video": { 344 | "loop": false, 345 | "_type": "Diesel Video", 346 | "hasFullScreen": false, 347 | "hasControls": false, 348 | "muted": false, 349 | "autoplay": false 350 | } 351 | } 352 | ] 353 | }, 354 | "seo": { 355 | "image": { 356 | "_type": "Epic Store Image" 357 | }, 358 | "twitter": { 359 | "_type": "SEO Twitter Metadata" 360 | }, 361 | "_type": "Epic Store Product SEO", 362 | "og": { 363 | "_type": "SEO OG Metadata" 364 | } 365 | }, 366 | "gallery": { 367 | "_type": "Diesel Gallery" 368 | } 369 | }, 370 | "hideMeta": false, 371 | "namespace": "bd8a7e894699493fb21503837f7b66c5", 372 | "_title": "Shadowrun Collection", 373 | "ageGate": { 374 | "regionRestrictions": [ 375 | { 376 | "country": "KR", 377 | "ageLimit": 18, 378 | "_type": "Epic Store Age Gate Region" 379 | } 380 | ], 381 | "hasAgeGate": false, 382 | "_type": "Epic Store Age Gate" 383 | }, 384 | "theme": { 385 | "buttonPrimaryBg": "#000000", 386 | "accentColor": "#000000", 387 | "_type": "Diesel Theme", 388 | "colorScheme": "dark" 389 | }, 390 | "_noIndex": false, 391 | "_images_": [ 392 | "https://cdn2.unrealengine.com/egs-shadowrunhongkongextendededition-harebrainedschemes-s1-2560x1440-768923401.jpg", 393 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-08-1920x1080-785870757.jpg", 394 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-11-1920x1080-785871134.jpg", 395 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-07-1920x1080-785870678.jpg", 396 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-09-1920x1080-785870879.jpg", 397 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-06-1920x1080-785870233.jpg", 398 | "https://cdn2.unrealengine.com/landscape-image-shadowcoll-2560x1440-777100077.jpg", 399 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-04-1920x1080-785870331.jpg", 400 | "https://cdn2.unrealengine.com/egs-shadowrundragonfalldirectorcut-harebrainedschemes-s1-2560x1440-769294674.jpg", 401 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-10-1920x1080-785870817.jpg", 402 | "https://cdn2.unrealengine.com/egs-shadowrunreturns-harebrainedschemes-s1-2560x1440-768642852.jpg", 403 | "https://cdn2.unrealengine.com/logo-400x400-400x400-777098045.png", 404 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-03-1920x1080-785870474.jpg", 405 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-02-1920x1080-785870323.jpg", 406 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-01-1920x1080-785870290.jpg", 407 | "https://cdn2.unrealengine.com/egs-shadowruncollection-harebrainedschemes-g1a-05-1920x1080-785870547.jpg" 408 | ], 409 | "jcr:baseVersion": "a7ca237317f1e7b3a4135d-6edc-42cd-944a-bc5055b1d856", 410 | "_urlPattern": "/bundles/shadowrun-collection", 411 | "_slug": "shadowrun-collection", 412 | "_activeDate": "2020-08-18T17:09:45.287Z", 413 | "lastModified": "2020-08-27T14:54:12.843Z", 414 | "_locale": "en-US", 415 | "_id": "098c5cec-e9ee-4923-b5c3-e89d4dbee8ab" 416 | } -------------------------------------------------------------------------------- /test/data/freeGamesPromotions_2020-09-01.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "Catalog": { 4 | "searchStore": { 5 | "elements": [ 6 | { 7 | "title": "Into The Breach", 8 | "id": "a08681e2143d4c218167e45d76db8de0", 9 | "namespace": "5c0d568c71174cff8026db2606771d96", 10 | "description": "Into The Breach", 11 | "effectiveDate": "2019-12-19T16:00:00.000Z", 12 | "keyImages": [ 13 | { 14 | "type": "DieselStoreFrontWide", 15 | "url": "https://cdn1.epicgames.com/undefined/offer/EGS_SubsetGames_IntotheBreach_S1-2560x1440-dba55f96ffe7af34552ed2215f921bdc.jpg" 16 | }, 17 | { 18 | "type": "DieselStoreFrontTall", 19 | "url": "https://cdn1.epicgames.com/undefined/offer/EGS_SubsetGames_IntotheBreach_S2-1280x1440-22e899c71d5a2bf7bc9353cc3f6e46d2.jpg" 20 | }, 21 | { 22 | "type": "DieselGameBoxLogo", 23 | "url": "https://cdn1.epicgames.com/undefined/offer/EGS_SubsetGames_IntotheBreach_IC1-200x200-49a3bf4ab351e9aa255e2e52c8368346.png" 24 | }, 25 | { 26 | "type": "OfferImageTall", 27 | "url": "https://cdn1.epicgames.com/undefined/offer/EGS_SubsetGames_IntotheBreach_S2-1280x1440-22e899c71d5a2bf7bc9353cc3f6e46d2.jpg" 28 | }, 29 | { 30 | "type": "Thumbnail", 31 | "url": "https://cdn1.epicgames.com/5c0d568c71174cff8026db2606771d96/offer/EGS_SubsetGames_IntotheBreach_IC2-128x128-c12d3fbc49d67a6faee2d2e2bd7f945d.png" 32 | }, 33 | { 34 | "type": "CodeRedemption_340x440", 35 | "url": "https://cdn1.epicgames.com/5c0d568c71174cff8026db2606771d96/offer/EGS_SubsetGames_IntotheBreach_S4-510x680-8a865e9778acb1745f4d70a6411ac370.jpg" 36 | }, 37 | { 38 | "type": "OfferImageWide", 39 | "url": "https://cdn1.epicgames.com/undefined/offer/EGS_SubsetGames_IntotheBreach_S1-2560x1440-dba55f96ffe7af34552ed2215f921bdc.jpg" 40 | } 41 | ], 42 | "seller": { 43 | "id": "o-y2xjbnp5qy433qzldqbvncb3n8z3l6", 44 | "name": "Subset Games" 45 | }, 46 | "productSlug": "into-the-breach/home", 47 | "urlSlug": "blobfishgeneralaudience", 48 | "url": null, 49 | "items": [ 50 | { 51 | "id": "2b19e544e510468a96a4f918a00d52e9", 52 | "namespace": "5c0d568c71174cff8026db2606771d96" 53 | } 54 | ], 55 | "customAttributes": [ 56 | { 57 | "key": "com.epicgames.app.blacklist", 58 | "value": "{}" 59 | }, 60 | { 61 | "key": "publisherName", 62 | "value": "Subset Games" 63 | }, 64 | { 65 | "key": "com.epicgames.app.productSlug", 66 | "value": "into-the-breach/home" 67 | } 68 | ], 69 | "categories": [ 70 | { 71 | "path": "freegames" 72 | }, 73 | { 74 | "path": "games" 75 | }, 76 | { 77 | "path": "games/edition/base" 78 | }, 79 | { 80 | "path": "games/edition" 81 | }, 82 | { 83 | "path": "applications" 84 | } 85 | ], 86 | "tags": [ 87 | { 88 | "id": "1370" 89 | }, 90 | { 91 | "id": "1386" 92 | }, 93 | { 94 | "id": "1083" 95 | }, 96 | { 97 | "id": "1115" 98 | }, 99 | { 100 | "id": "9547" 101 | } 102 | ], 103 | "price": { 104 | "totalPrice": { 105 | "discountPrice": 1499, 106 | "originalPrice": 1499, 107 | "voucherDiscount": 0, 108 | "discount": 0, 109 | "currencyCode": "USD", 110 | "currencyInfo": { 111 | "decimals": 2 112 | }, 113 | "fmtPrice": { 114 | "originalPrice": "$14.99", 115 | "discountPrice": "$14.99", 116 | "intermediatePrice": "$14.99" 117 | } 118 | }, 119 | "lineOffers": [ 120 | { 121 | "appliedRules": [] 122 | } 123 | ] 124 | }, 125 | "promotions": { 126 | "promotionalOffers": [], 127 | "upcomingPromotionalOffers": [ 128 | { 129 | "promotionalOffers": [ 130 | { 131 | "startDate": "2020-09-10T15:00:00.000Z", 132 | "endDate": "2020-09-24T15:00:00.000Z", 133 | "discountSetting": { 134 | "discountType": "PERCENTAGE", 135 | "discountPercentage": 50 136 | } 137 | }, 138 | { 139 | "startDate": "2020-09-03T15:00:00.000Z", 140 | "endDate": "2020-09-10T15:00:00.000Z", 141 | "discountSetting": { 142 | "discountType": "PERCENTAGE", 143 | "discountPercentage": 0 144 | } 145 | } 146 | ] 147 | } 148 | ] 149 | } 150 | }, 151 | { 152 | "title": "Shadowrun Collection", 153 | "id": "c5cb60ecc6554c6a8d9a682b87ab04bb", 154 | "namespace": "bd8a7e894699493fb21503837f7b66c5", 155 | "description": "Shadowrun Collection", 156 | "effectiveDate": "2020-08-27T15:00:00.000Z", 157 | "keyImages": [ 158 | { 159 | "type": "OfferImageWide", 160 | "url": "https://cdn1.epicgames.com/undefined/offer/Landscape Image_Shadowcoll-2560x1440-6418de83cb9ac99fc8eeb574ea65aac3.jpg" 161 | }, 162 | { 163 | "type": "OfferImageTall", 164 | "url": "https://cdn1.epicgames.com/undefined/offer/Portrait image1200x1600-1200x1600-791ecaaee8dcdfc1c796c5dd21783e06.jpg" 165 | }, 166 | { 167 | "type": "CodeRedemption_340x440", 168 | "url": "https://cdn1.epicgames.com/undefined/offer/Portrait image1200x1600-1200x1600-791ecaaee8dcdfc1c796c5dd21783e06.jpg" 169 | }, 170 | { 171 | "type": "DieselStoreFrontTall", 172 | "url": "https://cdn1.epicgames.com/undefined/offer/Portrait image1200x1600-1200x1600-791ecaaee8dcdfc1c796c5dd21783e06.jpg" 173 | }, 174 | { 175 | "type": "DieselStoreFrontWide", 176 | "url": "https://cdn1.epicgames.com/undefined/offer/Landscape Image_Shadowcoll-2560x1440-6418de83cb9ac99fc8eeb574ea65aac3.jpg" 177 | }, 178 | { 179 | "type": "Thumbnail", 180 | "url": "https://cdn1.epicgames.com/bd8a7e894699493fb21503837f7b66c5/offer/EGS_ShadowrunCollection_HarebrainedSchemes_G1A_00-1920x1080-17feba164bafaad2306b5afc98e55783.jpg" 181 | } 182 | ], 183 | "seller": { 184 | "id": "o-tjvfg6rejs6h86qa7k9aa64rrgbxxb", 185 | "name": "Paradox Interactive" 186 | }, 187 | "productSlug": "shadowrun-collection", 188 | "urlSlug": "shadowrun-collection", 189 | "url": null, 190 | "items": [ 191 | { 192 | "id": "794469cd9a0441b58330e74458640d03", 193 | "namespace": "0d66818e2304485f8dc3ae90c8b622b4" 194 | }, 195 | { 196 | "id": "1f469cce8b4945ca87411bbc36880080", 197 | "namespace": "805a1b31b65f4c3db221ab242f894482" 198 | }, 199 | { 200 | "id": "be5db329712c4b4f8b4094a4c0003408", 201 | "namespace": "a8400ce7530e4479b32dcaf0e92fce57" 202 | } 203 | ], 204 | "customAttributes": [ 205 | { 206 | "key": "com.epicgames.app.blacklist", 207 | "value": "[]" 208 | }, 209 | { 210 | "key": "publisherName", 211 | "value": "Paradox Interactive" 212 | }, 213 | { 214 | "key": "developerName", 215 | "value": "Harebrained Schemes" 216 | }, 217 | { 218 | "key": "com.epicgames.app.productSlug", 219 | "value": "shadowrun-collection" 220 | } 221 | ], 222 | "categories": [ 223 | { 224 | "path": "bundles" 225 | }, 226 | { 227 | "path": "freegames" 228 | }, 229 | { 230 | "path": "games" 231 | }, 232 | { 233 | "path": "bundles/games" 234 | }, 235 | { 236 | "path": "applications" 237 | } 238 | ], 239 | "tags": [ 240 | { 241 | "id": "1216" 242 | }, 243 | { 244 | "id": "1367" 245 | }, 246 | { 247 | "id": "1336" 248 | }, 249 | { 250 | "id": "9547" 251 | } 252 | ], 253 | "price": { 254 | "totalPrice": { 255 | "discountPrice": 0, 256 | "originalPrice": 4999, 257 | "voucherDiscount": 0, 258 | "discount": 4999, 259 | "currencyCode": "USD", 260 | "currencyInfo": { 261 | "decimals": 2 262 | }, 263 | "fmtPrice": { 264 | "originalPrice": "$49.99", 265 | "discountPrice": "0", 266 | "intermediatePrice": "0" 267 | } 268 | }, 269 | "lineOffers": [ 270 | { 271 | "appliedRules": [ 272 | { 273 | "id": "2a5cee52f133463c8f6cb94b32893cc8", 274 | "endDate": "2020-09-03T15:00:00.000Z", 275 | "discountSetting": { 276 | "discountType": "PERCENTAGE" 277 | } 278 | } 279 | ] 280 | } 281 | ] 282 | }, 283 | "promotions": { 284 | "promotionalOffers": [ 285 | { 286 | "promotionalOffers": [ 287 | { 288 | "startDate": "2020-08-27T15:00:00.000Z", 289 | "endDate": "2020-09-03T15:00:00.000Z", 290 | "discountSetting": { 291 | "discountType": "PERCENTAGE", 292 | "discountPercentage": 0 293 | } 294 | } 295 | ] 296 | } 297 | ], 298 | "upcomingPromotionalOffers": [] 299 | } 300 | }, 301 | { 302 | "title": "3 out of 10, EP 4: \"Thank You For Being An Asset\"", 303 | "id": "00ae234a8e4a4a80b6b3c124ae738372", 304 | "namespace": "d6a3cae34c5d4562832610b5b8664576", 305 | "description": "3 out of 10, EP 4: \"Thank You For Being An Asset\"", 306 | "effectiveDate": "2020-08-27T15:00:00.000Z", 307 | "keyImages": [ 308 | { 309 | "type": "OfferImageWide", 310 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S1-2560x1440-fcaf73701007096c6abc01415788d4c3.jpg" 311 | }, 312 | { 313 | "type": "OfferImageTall", 314 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S2-1200x1600-1a465a21d91318bd7d0f6a7b968d4797.jpg" 315 | }, 316 | { 317 | "type": "DieselStoreFrontTall", 318 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S2-1200x1600-1a465a21d91318bd7d0f6a7b968d4797.jpg" 319 | }, 320 | { 321 | "type": "DieselStoreFrontWide", 322 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S1-2560x1440-fcaf73701007096c6abc01415788d4c3.jpg" 323 | }, 324 | { 325 | "type": "CodeRedemption_340x440", 326 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S2-1200x1600-1a465a21d91318bd7d0f6a7b968d4797.jpg" 327 | }, 328 | { 329 | "type": "Thumbnail", 330 | "url": "https://cdn1.epicgames.com/d6a3cae34c5d4562832610b5b8664576/offer/EGS_3outof10EP4ThankYouForBeingAnAsset_TerriblePostureGamesInc_S2-1200x1600-1a465a21d91318bd7d0f6a7b968d4797.jpg" 331 | } 332 | ], 333 | "seller": { 334 | "id": "o-2yllrrr7vufkhal9nk3cswwgug977c", 335 | "name": "Terrible Posture Games, Inc." 336 | }, 337 | "productSlug": "3-out-of-10-ep-4", 338 | "urlSlug": "3-out-of-10-ep", 339 | "url": null, 340 | "items": [ 341 | { 342 | "id": "821516f0ed8448b89b7fe0e1e4628e03", 343 | "namespace": "d6a3cae34c5d4562832610b5b8664576" 344 | } 345 | ], 346 | "customAttributes": [ 347 | { 348 | "key": "com.epicgames.app.blacklist", 349 | "value": "KR" 350 | }, 351 | { 352 | "key": "developerName", 353 | "value": "Terrible Posture Games, Inc." 354 | }, 355 | { 356 | "key": "com.epicgames.app.productSlug", 357 | "value": "3-out-of-10-ep-4" 358 | } 359 | ], 360 | "categories": [ 361 | { 362 | "path": "freegames" 363 | }, 364 | { 365 | "path": "games" 366 | }, 367 | { 368 | "path": "games/edition" 369 | }, 370 | { 371 | "path": "games/edition/base" 372 | }, 373 | { 374 | "path": "applications" 375 | } 376 | ], 377 | "tags": [ 378 | { 379 | "id": "1381" 380 | }, 381 | { 382 | "id": "9547" 383 | }, 384 | { 385 | "id": "1116" 386 | }, 387 | { 388 | "id": "9549" 389 | }, 390 | { 391 | "id": "1117" 392 | } 393 | ], 394 | "price": { 395 | "totalPrice": { 396 | "discountPrice": 0, 397 | "originalPrice": 0, 398 | "voucherDiscount": 0, 399 | "discount": 0, 400 | "currencyCode": "USD", 401 | "currencyInfo": { 402 | "decimals": 2 403 | }, 404 | "fmtPrice": { 405 | "originalPrice": "0", 406 | "discountPrice": "0", 407 | "intermediatePrice": "0" 408 | } 409 | }, 410 | "lineOffers": [ 411 | { 412 | "appliedRules": [] 413 | } 414 | ] 415 | }, 416 | "promotions": null 417 | }, 418 | { 419 | "title": "HITMAN", 420 | "id": "e8efad3d47a14284867fef2c347c321d", 421 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 422 | "description": "HITMAN", 423 | "effectiveDate": "2020-08-27T15:00:00.000Z", 424 | "keyImages": [ 425 | { 426 | "type": "OfferImageWide", 427 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S3-1360x766-6becb0825ddf48b1511a6f8e9be02f9f.jpg" 428 | }, 429 | { 430 | "type": "OfferImageTall", 431 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-cb3bc2b2ef92dd133e1baa2edde5e232.jpg" 432 | }, 433 | { 434 | "type": "Thumbnail", 435 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-cb3bc2b2ef92dd133e1baa2edde5e232.jpg" 436 | }, 437 | { 438 | "type": "CodeRedemption_340x440", 439 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-cb3bc2b2ef92dd133e1baa2edde5e232.jpg" 440 | }, 441 | { 442 | "type": "DieselStoreFrontTall", 443 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-cb3bc2b2ef92dd133e1baa2edde5e232.jpg" 444 | }, 445 | { 446 | "type": "DieselStoreFrontWide", 447 | "url": "https://cdn1.epicgames.com/3c06b15a8a2845c0b725d4f952fe00aa/offer/EGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S3-1360x766-6becb0825ddf48b1511a6f8e9be02f9f.jpg" 448 | } 449 | ], 450 | "seller": { 451 | "id": "o-ank8fbh38u9uzqbag2a5yt5xexb4yr", 452 | "name": "IO Interactive" 453 | }, 454 | "productSlug": "hitman/standard-edition", 455 | "urlSlug": "hitman-standard", 456 | "url": null, 457 | "items": [ 458 | { 459 | "id": "0a73eaedcac84bd28b567dbec764c5cb", 460 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa" 461 | } 462 | ], 463 | "customAttributes": [ 464 | { 465 | "key": "com.epicgames.app.blacklist", 466 | "value": "[]" 467 | }, 468 | { 469 | "key": "developerName", 470 | "value": "IO Interactive" 471 | }, 472 | { 473 | "key": "com.epicgames.app.productSlug", 474 | "value": "hitman/standard-edition" 475 | } 476 | ], 477 | "categories": [ 478 | { 479 | "path": "freegames" 480 | }, 481 | { 482 | "path": "games" 483 | }, 484 | { 485 | "path": "games/edition" 486 | }, 487 | { 488 | "path": "games/edition/base" 489 | }, 490 | { 491 | "path": "applications" 492 | } 493 | ], 494 | "tags": [ 495 | { 496 | "id": "1216" 497 | }, 498 | { 499 | "id": "1336" 500 | }, 501 | { 502 | "id": "1210" 503 | }, 504 | { 505 | "id": "1370" 506 | }, 507 | { 508 | "id": "9547" 509 | }, 510 | { 511 | "id": "1084" 512 | }, 513 | { 514 | "id": "1342" 515 | } 516 | ], 517 | "price": { 518 | "totalPrice": { 519 | "discountPrice": 0, 520 | "originalPrice": 5999, 521 | "voucherDiscount": 0, 522 | "discount": 5999, 523 | "currencyCode": "USD", 524 | "currencyInfo": { 525 | "decimals": 2 526 | }, 527 | "fmtPrice": { 528 | "originalPrice": "$59.99", 529 | "discountPrice": "0", 530 | "intermediatePrice": "0" 531 | } 532 | }, 533 | "lineOffers": [ 534 | { 535 | "appliedRules": [ 536 | { 537 | "id": "2d600b05f5d64833aa24faee7406da58", 538 | "endDate": "2020-09-03T15:00:00.000Z", 539 | "discountSetting": { 540 | "discountType": "PERCENTAGE" 541 | } 542 | } 543 | ] 544 | } 545 | ] 546 | }, 547 | "promotions": { 548 | "promotionalOffers": [ 549 | { 550 | "promotionalOffers": [ 551 | { 552 | "startDate": "2020-08-27T15:00:00.000Z", 553 | "endDate": "2020-09-03T15:00:00.000Z", 554 | "discountSetting": { 555 | "discountType": "PERCENTAGE", 556 | "discountPercentage": 0 557 | } 558 | } 559 | ] 560 | } 561 | ], 562 | "upcomingPromotionalOffers": [] 563 | } 564 | } 565 | ], 566 | "paging": { 567 | "count": 1000, 568 | "total": 4 569 | } 570 | } 571 | } 572 | }, 573 | "extensions": { 574 | "cacheControl": { 575 | "version": 1, 576 | "hints": [ 577 | { 578 | "path": [ 579 | "Catalog" 580 | ], 581 | "maxAge": 0 582 | }, 583 | { 584 | "path": [ 585 | "Catalog", 586 | "searchStore" 587 | ], 588 | "maxAge": 0 589 | }, 590 | { 591 | "path": [ 592 | "Catalog", 593 | "searchStore", 594 | "elements" 595 | ], 596 | "maxAge": 0 597 | }, 598 | { 599 | "path": [ 600 | "Catalog", 601 | "searchStore", 602 | "elements", 603 | 0, 604 | "keyImages" 605 | ], 606 | "maxAge": 0 607 | }, 608 | { 609 | "path": [ 610 | "Catalog", 611 | "searchStore", 612 | "elements", 613 | 0, 614 | "seller" 615 | ], 616 | "maxAge": 0 617 | }, 618 | { 619 | "path": [ 620 | "Catalog", 621 | "searchStore", 622 | "elements", 623 | 0, 624 | "items" 625 | ], 626 | "maxAge": 0 627 | }, 628 | { 629 | "path": [ 630 | "Catalog", 631 | "searchStore", 632 | "elements", 633 | 0, 634 | "customAttributes" 635 | ], 636 | "maxAge": 0 637 | }, 638 | { 639 | "path": [ 640 | "Catalog", 641 | "searchStore", 642 | "elements", 643 | 0, 644 | "categories" 645 | ], 646 | "maxAge": 0 647 | }, 648 | { 649 | "path": [ 650 | "Catalog", 651 | "searchStore", 652 | "elements", 653 | 0, 654 | "tags" 655 | ], 656 | "maxAge": 0 657 | }, 658 | { 659 | "path": [ 660 | "Catalog", 661 | "searchStore", 662 | "elements", 663 | 0, 664 | "price" 665 | ], 666 | "maxAge": 0 667 | }, 668 | { 669 | "path": [ 670 | "Catalog", 671 | "searchStore", 672 | "elements", 673 | 0, 674 | "promotions" 675 | ], 676 | "maxAge": 0 677 | }, 678 | { 679 | "path": [ 680 | "Catalog", 681 | "searchStore", 682 | "elements", 683 | 1, 684 | "keyImages" 685 | ], 686 | "maxAge": 0 687 | }, 688 | { 689 | "path": [ 690 | "Catalog", 691 | "searchStore", 692 | "elements", 693 | 1, 694 | "seller" 695 | ], 696 | "maxAge": 0 697 | }, 698 | { 699 | "path": [ 700 | "Catalog", 701 | "searchStore", 702 | "elements", 703 | 1, 704 | "items" 705 | ], 706 | "maxAge": 0 707 | }, 708 | { 709 | "path": [ 710 | "Catalog", 711 | "searchStore", 712 | "elements", 713 | 1, 714 | "customAttributes" 715 | ], 716 | "maxAge": 0 717 | }, 718 | { 719 | "path": [ 720 | "Catalog", 721 | "searchStore", 722 | "elements", 723 | 1, 724 | "categories" 725 | ], 726 | "maxAge": 0 727 | }, 728 | { 729 | "path": [ 730 | "Catalog", 731 | "searchStore", 732 | "elements", 733 | 1, 734 | "tags" 735 | ], 736 | "maxAge": 0 737 | }, 738 | { 739 | "path": [ 740 | "Catalog", 741 | "searchStore", 742 | "elements", 743 | 1, 744 | "price" 745 | ], 746 | "maxAge": 0 747 | }, 748 | { 749 | "path": [ 750 | "Catalog", 751 | "searchStore", 752 | "elements", 753 | 1, 754 | "promotions" 755 | ], 756 | "maxAge": 0 757 | }, 758 | { 759 | "path": [ 760 | "Catalog", 761 | "searchStore", 762 | "elements", 763 | 2, 764 | "keyImages" 765 | ], 766 | "maxAge": 0 767 | }, 768 | { 769 | "path": [ 770 | "Catalog", 771 | "searchStore", 772 | "elements", 773 | 2, 774 | "seller" 775 | ], 776 | "maxAge": 0 777 | }, 778 | { 779 | "path": [ 780 | "Catalog", 781 | "searchStore", 782 | "elements", 783 | 2, 784 | "items" 785 | ], 786 | "maxAge": 0 787 | }, 788 | { 789 | "path": [ 790 | "Catalog", 791 | "searchStore", 792 | "elements", 793 | 2, 794 | "customAttributes" 795 | ], 796 | "maxAge": 0 797 | }, 798 | { 799 | "path": [ 800 | "Catalog", 801 | "searchStore", 802 | "elements", 803 | 2, 804 | "categories" 805 | ], 806 | "maxAge": 0 807 | }, 808 | { 809 | "path": [ 810 | "Catalog", 811 | "searchStore", 812 | "elements", 813 | 2, 814 | "tags" 815 | ], 816 | "maxAge": 0 817 | }, 818 | { 819 | "path": [ 820 | "Catalog", 821 | "searchStore", 822 | "elements", 823 | 2, 824 | "price" 825 | ], 826 | "maxAge": 0 827 | }, 828 | { 829 | "path": [ 830 | "Catalog", 831 | "searchStore", 832 | "elements", 833 | 2, 834 | "promotions" 835 | ], 836 | "maxAge": 0 837 | }, 838 | { 839 | "path": [ 840 | "Catalog", 841 | "searchStore", 842 | "elements", 843 | 3, 844 | "keyImages" 845 | ], 846 | "maxAge": 0 847 | }, 848 | { 849 | "path": [ 850 | "Catalog", 851 | "searchStore", 852 | "elements", 853 | 3, 854 | "seller" 855 | ], 856 | "maxAge": 0 857 | }, 858 | { 859 | "path": [ 860 | "Catalog", 861 | "searchStore", 862 | "elements", 863 | 3, 864 | "items" 865 | ], 866 | "maxAge": 0 867 | }, 868 | { 869 | "path": [ 870 | "Catalog", 871 | "searchStore", 872 | "elements", 873 | 3, 874 | "customAttributes" 875 | ], 876 | "maxAge": 0 877 | }, 878 | { 879 | "path": [ 880 | "Catalog", 881 | "searchStore", 882 | "elements", 883 | 3, 884 | "categories" 885 | ], 886 | "maxAge": 0 887 | }, 888 | { 889 | "path": [ 890 | "Catalog", 891 | "searchStore", 892 | "elements", 893 | 3, 894 | "tags" 895 | ], 896 | "maxAge": 0 897 | }, 898 | { 899 | "path": [ 900 | "Catalog", 901 | "searchStore", 902 | "elements", 903 | 3, 904 | "price" 905 | ], 906 | "maxAge": 0 907 | }, 908 | { 909 | "path": [ 910 | "Catalog", 911 | "searchStore", 912 | "elements", 913 | 3, 914 | "promotions" 915 | ], 916 | "maxAge": 0 917 | }, 918 | { 919 | "path": [ 920 | "Catalog", 921 | "searchStore", 922 | "paging" 923 | ], 924 | "maxAge": 0 925 | }, 926 | { 927 | "path": [ 928 | "Catalog", 929 | "searchStore", 930 | "elements", 931 | 3, 932 | "price", 933 | "totalPrice" 934 | ], 935 | "maxAge": 0 936 | }, 937 | { 938 | "path": [ 939 | "Catalog", 940 | "searchStore", 941 | "elements", 942 | 3, 943 | "price", 944 | "totalPrice", 945 | "currencyInfo" 946 | ], 947 | "maxAge": 0 948 | }, 949 | { 950 | "path": [ 951 | "Catalog", 952 | "searchStore", 953 | "elements", 954 | 3, 955 | "price", 956 | "totalPrice", 957 | "fmtPrice" 958 | ], 959 | "maxAge": 0 960 | }, 961 | { 962 | "path": [ 963 | "Catalog", 964 | "searchStore", 965 | "elements", 966 | 3, 967 | "price", 968 | "lineOffers" 969 | ], 970 | "maxAge": 0 971 | }, 972 | { 973 | "path": [ 974 | "Catalog", 975 | "searchStore", 976 | "elements", 977 | 3, 978 | "price", 979 | "lineOffers", 980 | 0, 981 | "appliedRules" 982 | ], 983 | "maxAge": 0 984 | }, 985 | { 986 | "path": [ 987 | "Catalog", 988 | "searchStore", 989 | "elements", 990 | 3, 991 | "price", 992 | "lineOffers", 993 | 0, 994 | "appliedRules", 995 | 0, 996 | "discountSetting" 997 | ], 998 | "maxAge": 0 999 | }, 1000 | { 1001 | "path": [ 1002 | "Catalog", 1003 | "searchStore", 1004 | "elements", 1005 | 0, 1006 | "price", 1007 | "totalPrice" 1008 | ], 1009 | "maxAge": 0 1010 | }, 1011 | { 1012 | "path": [ 1013 | "Catalog", 1014 | "searchStore", 1015 | "elements", 1016 | 0, 1017 | "price", 1018 | "totalPrice", 1019 | "currencyInfo" 1020 | ], 1021 | "maxAge": 0 1022 | }, 1023 | { 1024 | "path": [ 1025 | "Catalog", 1026 | "searchStore", 1027 | "elements", 1028 | 0, 1029 | "price", 1030 | "totalPrice", 1031 | "fmtPrice" 1032 | ], 1033 | "maxAge": 0 1034 | }, 1035 | { 1036 | "path": [ 1037 | "Catalog", 1038 | "searchStore", 1039 | "elements", 1040 | 0, 1041 | "price", 1042 | "lineOffers" 1043 | ], 1044 | "maxAge": 0 1045 | }, 1046 | { 1047 | "path": [ 1048 | "Catalog", 1049 | "searchStore", 1050 | "elements", 1051 | 0, 1052 | "price", 1053 | "lineOffers", 1054 | 0, 1055 | "appliedRules" 1056 | ], 1057 | "maxAge": 0 1058 | }, 1059 | { 1060 | "path": [ 1061 | "Catalog", 1062 | "searchStore", 1063 | "elements", 1064 | 1, 1065 | "price", 1066 | "totalPrice" 1067 | ], 1068 | "maxAge": 0 1069 | }, 1070 | { 1071 | "path": [ 1072 | "Catalog", 1073 | "searchStore", 1074 | "elements", 1075 | 1, 1076 | "price", 1077 | "totalPrice", 1078 | "currencyInfo" 1079 | ], 1080 | "maxAge": 0 1081 | }, 1082 | { 1083 | "path": [ 1084 | "Catalog", 1085 | "searchStore", 1086 | "elements", 1087 | 1, 1088 | "price", 1089 | "totalPrice", 1090 | "fmtPrice" 1091 | ], 1092 | "maxAge": 0 1093 | }, 1094 | { 1095 | "path": [ 1096 | "Catalog", 1097 | "searchStore", 1098 | "elements", 1099 | 1, 1100 | "price", 1101 | "lineOffers" 1102 | ], 1103 | "maxAge": 0 1104 | }, 1105 | { 1106 | "path": [ 1107 | "Catalog", 1108 | "searchStore", 1109 | "elements", 1110 | 1, 1111 | "price", 1112 | "lineOffers", 1113 | 0, 1114 | "appliedRules" 1115 | ], 1116 | "maxAge": 0 1117 | }, 1118 | { 1119 | "path": [ 1120 | "Catalog", 1121 | "searchStore", 1122 | "elements", 1123 | 1, 1124 | "price", 1125 | "lineOffers", 1126 | 0, 1127 | "appliedRules", 1128 | 0, 1129 | "discountSetting" 1130 | ], 1131 | "maxAge": 0 1132 | }, 1133 | { 1134 | "path": [ 1135 | "Catalog", 1136 | "searchStore", 1137 | "elements", 1138 | 2, 1139 | "price", 1140 | "totalPrice" 1141 | ], 1142 | "maxAge": 0 1143 | }, 1144 | { 1145 | "path": [ 1146 | "Catalog", 1147 | "searchStore", 1148 | "elements", 1149 | 2, 1150 | "price", 1151 | "totalPrice", 1152 | "currencyInfo" 1153 | ], 1154 | "maxAge": 0 1155 | }, 1156 | { 1157 | "path": [ 1158 | "Catalog", 1159 | "searchStore", 1160 | "elements", 1161 | 2, 1162 | "price", 1163 | "totalPrice", 1164 | "fmtPrice" 1165 | ], 1166 | "maxAge": 0 1167 | }, 1168 | { 1169 | "path": [ 1170 | "Catalog", 1171 | "searchStore", 1172 | "elements", 1173 | 2, 1174 | "price", 1175 | "lineOffers" 1176 | ], 1177 | "maxAge": 0 1178 | }, 1179 | { 1180 | "path": [ 1181 | "Catalog", 1182 | "searchStore", 1183 | "elements", 1184 | 2, 1185 | "price", 1186 | "lineOffers", 1187 | 0, 1188 | "appliedRules" 1189 | ], 1190 | "maxAge": 0 1191 | }, 1192 | { 1193 | "path": [ 1194 | "Catalog", 1195 | "searchStore", 1196 | "elements", 1197 | 3, 1198 | "promotions", 1199 | "promotionalOffers" 1200 | ], 1201 | "maxAge": 0 1202 | }, 1203 | { 1204 | "path": [ 1205 | "Catalog", 1206 | "searchStore", 1207 | "elements", 1208 | 3, 1209 | "promotions", 1210 | "promotionalOffers", 1211 | 0, 1212 | "promotionalOffers" 1213 | ], 1214 | "maxAge": 0 1215 | }, 1216 | { 1217 | "path": [ 1218 | "Catalog", 1219 | "searchStore", 1220 | "elements", 1221 | 3, 1222 | "promotions", 1223 | "promotionalOffers", 1224 | 0, 1225 | "promotionalOffers", 1226 | 0, 1227 | "discountSetting" 1228 | ], 1229 | "maxAge": 0 1230 | }, 1231 | { 1232 | "path": [ 1233 | "Catalog", 1234 | "searchStore", 1235 | "elements", 1236 | 3, 1237 | "promotions", 1238 | "upcomingPromotionalOffers" 1239 | ], 1240 | "maxAge": 0 1241 | }, 1242 | { 1243 | "path": [ 1244 | "Catalog", 1245 | "searchStore", 1246 | "elements", 1247 | 1, 1248 | "promotions", 1249 | "promotionalOffers" 1250 | ], 1251 | "maxAge": 0 1252 | }, 1253 | { 1254 | "path": [ 1255 | "Catalog", 1256 | "searchStore", 1257 | "elements", 1258 | 1, 1259 | "promotions", 1260 | "promotionalOffers", 1261 | 0, 1262 | "promotionalOffers" 1263 | ], 1264 | "maxAge": 0 1265 | }, 1266 | { 1267 | "path": [ 1268 | "Catalog", 1269 | "searchStore", 1270 | "elements", 1271 | 1, 1272 | "promotions", 1273 | "promotionalOffers", 1274 | 0, 1275 | "promotionalOffers", 1276 | 0, 1277 | "discountSetting" 1278 | ], 1279 | "maxAge": 0 1280 | }, 1281 | { 1282 | "path": [ 1283 | "Catalog", 1284 | "searchStore", 1285 | "elements", 1286 | 1, 1287 | "promotions", 1288 | "upcomingPromotionalOffers" 1289 | ], 1290 | "maxAge": 0 1291 | }, 1292 | { 1293 | "path": [ 1294 | "Catalog", 1295 | "searchStore", 1296 | "elements", 1297 | 0, 1298 | "promotions", 1299 | "promotionalOffers" 1300 | ], 1301 | "maxAge": 0 1302 | }, 1303 | { 1304 | "path": [ 1305 | "Catalog", 1306 | "searchStore", 1307 | "elements", 1308 | 0, 1309 | "promotions", 1310 | "upcomingPromotionalOffers" 1311 | ], 1312 | "maxAge": 0 1313 | }, 1314 | { 1315 | "path": [ 1316 | "Catalog", 1317 | "searchStore", 1318 | "elements", 1319 | 0, 1320 | "promotions", 1321 | "upcomingPromotionalOffers", 1322 | 0, 1323 | "promotionalOffers" 1324 | ], 1325 | "maxAge": 0 1326 | }, 1327 | { 1328 | "path": [ 1329 | "Catalog", 1330 | "searchStore", 1331 | "elements", 1332 | 0, 1333 | "promotions", 1334 | "upcomingPromotionalOffers", 1335 | 0, 1336 | "promotionalOffers", 1337 | 0, 1338 | "discountSetting" 1339 | ], 1340 | "maxAge": 0 1341 | }, 1342 | { 1343 | "path": [ 1344 | "Catalog", 1345 | "searchStore", 1346 | "elements", 1347 | 0, 1348 | "promotions", 1349 | "upcomingPromotionalOffers", 1350 | 0, 1351 | "promotionalOffers", 1352 | 1, 1353 | "discountSetting" 1354 | ], 1355 | "maxAge": 0 1356 | } 1357 | ] 1358 | } 1359 | } 1360 | } -------------------------------------------------------------------------------- /test/data/products_hitman_2020-09-01.json: -------------------------------------------------------------------------------- 1 | { 2 | "productRatings": { 3 | "ratings": [ 4 | { 5 | "image": { 6 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ra1-370x208-370x208-829765488.png", 7 | "_type": "Epic Store Image" 8 | }, 9 | "countryCodes": "US,CA,MX", 10 | "_type": "Epic Store Rating", 11 | "title": "MATURE 17 +" 12 | }, 13 | { 14 | "image": { 15 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FPEGI_18_Rating-208x254-f12521f5a5231d533ff539144709543cdf68f031.jpg", 16 | "_type": "Epic Store Image" 17 | }, 18 | "countryCodes": "AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB", 19 | "_type": "Epic Store Rating", 20 | "title": "PEGI 18" 21 | }, 22 | { 23 | "image": { 24 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FUSK_18-400x400-7ac38d8b4b29de7c5f10a52ebf17f124e361279e.png", 25 | "_type": "Epic Store Image" 26 | }, 27 | "countryCodes": "DE", 28 | "_type": "Epic Store Rating", 29 | "title": "USK ab 18" 30 | }, 31 | { 32 | "image": { 33 | "src": "https://cdn2.unrealengine.com/18-v-l-d-c-540x117-672303047.png", 34 | "_type": "Epic Store Image" 35 | }, 36 | "countryCodes": "KR", 37 | "_type": "Epic Store Rating", 38 | "title": "청소년이용불가" 39 | }, 40 | { 41 | "image": { 42 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2F800px-CERO_Z.svg-800x984-ffd454acb3d6f8fac8bdf1bf2a2d01da0d79f858.png", 43 | "_type": "Epic Store Image" 44 | }, 45 | "countryCodes": "JP", 46 | "_type": "Epic Store Rating", 47 | "title": "CERO Z" 48 | } 49 | ], 50 | "_type": "Epic Store Product Ratings" 51 | }, 52 | "disableNewAddons": true, 53 | "modMarketplaceEnabled": false, 54 | "_title": "hitman", 55 | "regionBlock": "", 56 | "_noIndex": false, 57 | "_images_": [ 58 | "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FUSK_18-400x400-7ac38d8b4b29de7c5f10a52ebf17f124e361279e.png", 59 | "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FPEGI_18_Rating-208x254-f12521f5a5231d533ff539144709543cdf68f031.jpg", 60 | "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2F800px-CERO_Z.svg-800x984-ffd454acb3d6f8fac8bdf1bf2a2d01da0d79f858.png", 61 | "https://cdn2.unrealengine.com/18-v-l-d-c-540x117-672303047.png", 62 | "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ra1-370x208-370x208-829765488.png" 63 | ], 64 | "productName": "Hitman 2016", 65 | "jcr:isCheckedOut": true, 66 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 67 | "theme": { 68 | "_type": "Diesel Theme" 69 | }, 70 | "reviewOptOut": false, 71 | "jcr:baseVersion": "a7ca237317f1e70c6be6ee-ac48-4ffa-8863-cd50adc9bed9", 72 | "externalNavLinks": { 73 | "_type": "Epic Store Links" 74 | }, 75 | "_urlPattern": "/productv2/hitman", 76 | "_slug": "hitman", 77 | "_activeDate": "2020-02-04T14:41:51.564Z", 78 | "lastModified": "2020-08-24T19:36:27.729Z", 79 | "_locale": "en-US", 80 | "_id": "1d6ce96e-6985-4739-8ced-52fff723eea6", 81 | "pages": [ 82 | { 83 | "productRatings": { 84 | "ratings": [ 85 | { 86 | "image": { 87 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ra1-370x208-370x208-829765488.png", 88 | "_type": "Epic Store Image" 89 | }, 90 | "countryCodes": "US,CA,MX", 91 | "_type": "Epic Store Rating", 92 | "title": "MATURE 17 +" 93 | }, 94 | { 95 | "image": { 96 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FPEGI_18_Rating-208x254-f12521f5a5231d533ff539144709543cdf68f031.jpg", 97 | "_type": "Epic Store Image" 98 | }, 99 | "countryCodes": "AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB", 100 | "_type": "Epic Store Rating", 101 | "title": "PEGI 18" 102 | }, 103 | { 104 | "image": { 105 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FUSK_18-400x400-7ac38d8b4b29de7c5f10a52ebf17f124e361279e.png", 106 | "_type": "Epic Store Image" 107 | }, 108 | "countryCodes": "DE", 109 | "_type": "Epic Store Rating", 110 | "title": "USK ab 18" 111 | }, 112 | { 113 | "image": { 114 | "src": "https://cdn2.unrealengine.com/18-v-l-d-c-540x117-672303047.png", 115 | "_type": "Epic Store Image" 116 | }, 117 | "countryCodes": "KR", 118 | "_type": "Epic Store Rating", 119 | "title": "청소년이용불가" 120 | }, 121 | { 122 | "image": { 123 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2F800px-CERO_Z.svg-800x984-ffd454acb3d6f8fac8bdf1bf2a2d01da0d79f858.png", 124 | "_type": "Epic Store Image" 125 | }, 126 | "countryCodes": "JP", 127 | "_type": "Epic Store Rating", 128 | "title": "CERO Z" 129 | } 130 | ], 131 | "_type": "Epic Store Product Ratings" 132 | }, 133 | "disableNewAddons": true, 134 | "modMarketplaceEnabled": false, 135 | "_title": "standard-edition", 136 | "regionBlock": "", 137 | "_noIndex": false, 138 | "_images_": [ 139 | "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ic3-200x200-551403813.png", 140 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg", 141 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_02-1920x1080-358b2bef1a14735c36266bda2ec57d9dab95bb71.jpg", 142 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_IC1-200x200-1b87a2cf091a73488e4b5d743144db480f1ff7e6.png", 143 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-90e70a51380bd7f19f78154d45f460707499e3ad.jpg", 144 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S1-2560x1440-ee0a95f41d75bdb9a2661ebdea9b349c68ce35d2.jpg", 145 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_01-1920x1080-7a0feff0ff3bc28827a99f45b655042f7f9a810b.jpg", 146 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S3-1360x766-11872ddd2ff281a9fd221e6fa70655cd7f9643c5.jpg", 147 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_00-1920x1080-badcc937b70155e57bf86e075283ed1060962bb7.jpg", 148 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_03-1920x1080-539bda3e1756c22417d7cb754b6fabd0ae4672ba.jpg" 149 | ], 150 | "productName": "Hitman 2016", 151 | "jcr:isCheckedOut": true, 152 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 153 | "theme": { 154 | "buttonPrimaryBg": "#FFFFFF", 155 | "customPrimaryBg": "#000000", 156 | "accentColor": "#FFFFFF", 157 | "_type": "Diesel Theme", 158 | "colorScheme": "dark" 159 | }, 160 | "reviewOptOut": false, 161 | "jcr:baseVersion": "a7ca237317f1e74ac78de1-9002-4fda-a397-1c1dec155d8f", 162 | "externalNavLinks": { 163 | "_type": "Epic Store Links" 164 | }, 165 | "_urlPattern": "/productv2/hitman/standard-edition", 166 | "_slug": "standard-edition", 167 | "_activeDate": "2020-02-04T14:45:10.836Z", 168 | "lastModified": "2020-08-27T14:47:26.721Z", 169 | "_locale": "en-US", 170 | "_id": "4e6879fa-e30a-45da-a459-aab53bc8a4cd", 171 | "offer": { 172 | "regionRestrictions": { 173 | "_type": "Store Region Filtering" 174 | }, 175 | "_type": "Diesel Offer", 176 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 177 | "id": "e8efad3d47a14284867fef2c347c321d", 178 | "type": "", 179 | "hasOffer": true 180 | }, 181 | "item": { 182 | "catalogId": "", 183 | "appName": "", 184 | "_type": "Diesel Product Item", 185 | "namespace": "", 186 | "hasItem": false 187 | }, 188 | "data": { 189 | "productLinks": { 190 | "_type": "Diesel Product Lins" 191 | }, 192 | "socialLinks": { 193 | "linkTwitter": "https://twitter.com/hitman", 194 | "linkTwitch": "http://www.twitch.tv/hitman", 195 | "linkFacebook": "https://www.facebook.com/hitman", 196 | "linkYoutube": "https://www.youtube.com/user/hitman?hl=en&gl=US", 197 | "_type": "Diesel Social Links", 198 | "linkReddit": "https://www.reddit.com/r/HiTMAN/", 199 | "title": "Follow HITMAN", 200 | "linkHomepage": "https://hitman.com" 201 | }, 202 | "requirements": { 203 | "languages": [ 204 | "AUDIO - English", 205 | "TEXT - English, French, German, Italian, Spanish - Spain, Japanese, Polish, Portuguese - Brazil, Russian, Chinese - Simplified" 206 | ], 207 | "systems": [ 208 | { 209 | "_type": "Diesel System Detail", 210 | "systemType": "Windows", 211 | "details": [ 212 | { 213 | "_type": "Diesel System Detail Item", 214 | "title": "OS", 215 | "minimum": "OS 64-bit Windows 7", 216 | "recommended": "OS 64-bit Windows 7 / 64-bit Windows 8 (8.1) or Windows 10" 217 | }, 218 | { 219 | "_type": "Diesel System Detail Item", 220 | "title": "Processor", 221 | "minimum": "Intel CPU Core i5-2500K 3.3GHz / AMD CPU Phenom II X4 940", 222 | "recommended": "Intel CPU Core i7 3770 3,4 GHz / AMD CPU AMD FX-8350 4 GHz" 223 | }, 224 | { 225 | "_type": "Diesel System Detail Item", 226 | "title": "Memory", 227 | "minimum": "8", 228 | "recommended": "8" 229 | }, 230 | { 231 | "_type": "Diesel System Detail Item", 232 | "title": "Graphics", 233 | "minimum": "NVIDIA GeForce GTX 660 / Radeon HD 7870", 234 | "recommended": "Nvidia GPU GeForce GTX 770 / AMD GPU Radeon R9 290" 235 | }, 236 | { 237 | "_type": "Diesel System Detail Item", 238 | "title": "DirectX", 239 | "minimum": "11", 240 | "recommended": "11" 241 | }, 242 | { 243 | "_type": "Diesel System Detail Item", 244 | "title": "Storage", 245 | "minimum": "50 ", 246 | "recommended": "50" 247 | } 248 | ] 249 | } 250 | ], 251 | "_type": "Diesel System Details", 252 | "rating": { 253 | "_type": "Diesel Rating" 254 | } 255 | }, 256 | "navOrder": 2, 257 | "footer": { 258 | "_type": "Diesel Product Footer", 259 | "copy": "HITMAN™ © 2020 IO Interactive A/S. Published by IO Interactive A/S. IO INTERACTIVE, the IO logo, HITMAN™, the HITMAN™ logos, and WORLD OF ASSASSINATION are trademarks or registered trademarks owned by or exclusively licensed to IO Interactive A/S. All rights reserved. All other trademarks are the property of their respective owners.", 260 | "privacyPolicyLink": { 261 | "src": "https://www.ioi.dk/privacy-policy/", 262 | "_type": "Diesel Link", 263 | "title": "IO Interactive A/S Privacy Policy" 264 | } 265 | }, 266 | "_type": "Diesel Product Detail", 267 | "about": { 268 | "image": { 269 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-90e70a51380bd7f19f78154d45f460707499e3ad.jpg", 270 | "_type": "Diesel Image" 271 | }, 272 | "developerAttribution": "IO Interactive A/S", 273 | "_type": "Diesel Product About", 274 | "publisherAttribution": "IO Interactive A/S", 275 | "description": "Featuring all of the Season One locations and episodes from the Prologue, Paris, Sapienza, Marrakesh, Bangkok, Colorado, and Hokkaido. As Agent 47, you will perform contract hits on powerful, high-profile targets in an intense spy-thriller story across a world of assassination.\n\nAs you complete missions and contracts new weapons, items and equipment become available for use across all locations. Learn the tools of the trade as you earn your way to Silent Assassin status.", 276 | "shortDescription": "Experiment and have fun in the ultimate playground as Agent 47 to become the master assassin. Travel around the globe to exotic locations and eliminate your targets with everything from a katana or a sniper rifle to an exploding golf ball.", 277 | "title": "HITMAN", 278 | "developerLogo": { 279 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ic3-200x200-551403813.png", 280 | "_type": "Diesel Image" 281 | } 282 | }, 283 | "banner": { 284 | "showPromotion": false, 285 | "_type": "Epic Store Product Banner", 286 | "link": { 287 | "_type": "Diesel Link" 288 | } 289 | }, 290 | "hero": { 291 | "logoImage": { 292 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_IC1-200x200-1b87a2cf091a73488e4b5d743144db480f1ff7e6.png", 293 | "_type": "Diesel Image" 294 | }, 295 | "portraitBackgroundImageUrl": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S2-860x1148-90e70a51380bd7f19f78154d45f460707499e3ad.jpg", 296 | "_type": "Diesel Hero", 297 | "action": { 298 | "_type": "Diesel Action" 299 | }, 300 | "video": { 301 | "loop": false, 302 | "_type": "Diesel Video", 303 | "hasFullScreen": false, 304 | "hasControls": false, 305 | "muted": false, 306 | "autoplay": false 307 | }, 308 | "isFullBleed": false, 309 | "altContentPosition": false, 310 | "backgroundImageUrl": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S1-2560x1440-ee0a95f41d75bdb9a2661ebdea9b349c68ce35d2.jpg" 311 | }, 312 | "carousel": { 313 | "_type": "Diesel Carousel", 314 | "items": [ 315 | { 316 | "image": { 317 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_S3-1360x766-11872ddd2ff281a9fd221e6fa70655cd7f9643c5.jpg", 318 | "_type": "Diesel Image" 319 | }, 320 | "_type": "Diesel Carousel Item - Image OR Video", 321 | "video": { 322 | "loop": false, 323 | "_type": "Diesel Video", 324 | "hasFullScreen": false, 325 | "hasControls": false, 326 | "muted": false, 327 | "autoplay": false 328 | } 329 | } 330 | ] 331 | }, 332 | "editions": { 333 | "_type": "Epic Store Editions", 334 | "enableImages": false 335 | }, 336 | "meta": { 337 | "releaseDate": "2020-03-13T15:00:00.000Z", 338 | "_type": "Epic Store Meta", 339 | "publisher": [ 340 | "IO Interactive A/S" 341 | ], 342 | "logo": { 343 | "_type": "Epic Store Image" 344 | }, 345 | "developer": [ 346 | "IO Interactive A/S" 347 | ], 348 | "platform": [ 349 | "Windows" 350 | ], 351 | "tags": [ 352 | "ACTION", 353 | "STEALTH" 354 | ] 355 | }, 356 | "markdown": { 357 | "_type": "Epic Store Markdown" 358 | }, 359 | "dlc": { 360 | "contingentOffer": { 361 | "regionRestrictions": { 362 | "_type": "Store Region Filtering" 363 | }, 364 | "_type": "Diesel Offer", 365 | "hasOffer": false 366 | }, 367 | "_type": "Epic Store DLC", 368 | "dlc": [ 369 | { 370 | "regionRestrictions": { 371 | "_type": "Store Region Filtering" 372 | }, 373 | "image": { 374 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg", 375 | "_type": "Diesel Image" 376 | }, 377 | "_type": "Product DLC", 378 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 379 | "description": "Upgrade your copy of HITMAN to the GOTY Edition now and get immediate access to the Patient Zero campaign plus all the other new content included in the GOTY Edition", 380 | "offerId": "e573ab5b700a418bade0407694c125d6", 381 | "tag": "dlc", 382 | "title": "HITMAN - Game of the Year Upgrade", 383 | "type": "addon", 384 | "slug": "product/hitman/game-of-the-year-upgrade" 385 | } 386 | ], 387 | "enableImages": true 388 | }, 389 | "seo": { 390 | "image": { 391 | "_type": "Epic Store Image" 392 | }, 393 | "twitter": { 394 | "_type": "SEO Twitter Metadata" 395 | }, 396 | "_type": "Epic Store Product SEO", 397 | "og": { 398 | "_type": "SEO OG Metadata" 399 | } 400 | }, 401 | "productSections": [ 402 | { 403 | "productSection": "DLC", 404 | "_type": "Diesel Product Section" 405 | }, 406 | { 407 | "productSection": "REQUIREMENTS", 408 | "_type": "Diesel Product Section" 409 | }, 410 | { 411 | "productSection": "SOCIAL_LINKS", 412 | "_type": "Diesel Product Section" 413 | }, 414 | { 415 | "productSection": "ABOUT", 416 | "_type": "Diesel Product Section" 417 | }, 418 | { 419 | "productSection": "CAROUSEL", 420 | "_type": "Diesel Product Section" 421 | }, 422 | { 423 | "productSection": "FOOTER", 424 | "_type": "Diesel Product Section" 425 | }, 426 | { 427 | "productSection": "GALLERY", 428 | "_type": "Diesel Product Section" 429 | }, 430 | { 431 | "productSection": "HERO", 432 | "_type": "Diesel Product Section" 433 | } 434 | ], 435 | "gallery": { 436 | "_type": "Diesel Gallery", 437 | "galleryImages": [ 438 | { 439 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_00-1920x1080-badcc937b70155e57bf86e075283ed1060962bb7.jpg", 440 | "_type": "Diesel Gallery Image", 441 | "row": 1 442 | }, 443 | { 444 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_01-1920x1080-7a0feff0ff3bc28827a99f45b655042f7f9a810b.jpg", 445 | "_type": "Diesel Gallery Image", 446 | "row": 2 447 | }, 448 | { 449 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_02-1920x1080-358b2bef1a14735c36266bda2ec57d9dab95bb71.jpg", 450 | "_type": "Diesel Gallery Image", 451 | "row": 2 452 | }, 453 | { 454 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_G1A_03-1920x1080-539bda3e1756c22417d7cb754b6fabd0ae4672ba.jpg", 455 | "_type": "Diesel Gallery Image", 456 | "row": 3 457 | } 458 | ] 459 | }, 460 | "navTitle": "HITMAN" 461 | }, 462 | "ageGate": { 463 | "hasAgeGate": true, 464 | "_type": "Epic Store Age Gate" 465 | }, 466 | "tag": "edition", 467 | "type": "offer" 468 | }, 469 | { 470 | "productRatings": { 471 | "ratings": [ 472 | { 473 | "image": { 474 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ra1-370x208-370x208-829765488.png", 475 | "_type": "Epic Store Image" 476 | }, 477 | "countryCodes": "US,CA,MX", 478 | "_type": "Epic Store Rating", 479 | "title": "MATURE 17 +" 480 | }, 481 | { 482 | "image": { 483 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FPEGI_18_Rating-208x254-f12521f5a5231d533ff539144709543cdf68f031.jpg", 484 | "_type": "Epic Store Image" 485 | }, 486 | "countryCodes": "AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB", 487 | "_type": "Epic Store Rating", 488 | "title": "PEGI 18" 489 | }, 490 | { 491 | "image": { 492 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FUSK_18-400x400-7ac38d8b4b29de7c5f10a52ebf17f124e361279e.png", 493 | "_type": "Epic Store Image" 494 | }, 495 | "countryCodes": "DE", 496 | "_type": "Epic Store Rating", 497 | "title": "USK ab 18" 498 | }, 499 | { 500 | "image": { 501 | "src": "https://cdn2.unrealengine.com/18-v-l-d-c-540x117-672303047.png", 502 | "_type": "Epic Store Image" 503 | }, 504 | "countryCodes": "KR", 505 | "_type": "Epic Store Rating", 506 | "title": "청소년이용불가" 507 | }, 508 | { 509 | "image": { 510 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2F800px-CERO_Z.svg-800x984-ffd454acb3d6f8fac8bdf1bf2a2d01da0d79f858.png", 511 | "_type": "Epic Store Image" 512 | }, 513 | "countryCodes": "JP", 514 | "_type": "Epic Store Rating", 515 | "title": "CERO Z" 516 | } 517 | ], 518 | "_type": "Epic Store Product Ratings" 519 | }, 520 | "disableNewAddons": true, 521 | "modMarketplaceEnabled": false, 522 | "_title": "home", 523 | "regionBlock": "", 524 | "_noIndex": false, 525 | "_images_": [ 526 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_01-1920x1080-f73e7dc1b12fdc311fa56ca569b891f5a6fb721c.jpg", 527 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_05-1920x1080-539bda3e1756c22417d7cb754b6fabd0ae4672ba.jpg", 528 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-g1a-07-1920x1080-623151153.jpg", 529 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_03-1920x1080-52c8d8cd02e0c51a26c00af79b926a3d66865676.jpg", 530 | "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-s5-1920x1080-551403315.jpg", 531 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_IC1-200x200-015b336a367d6c1059a94cfd77c0e947ef217439.png", 532 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg", 533 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_02-1920x1080-badcc937b70155e57bf86e075283ed1060962bb7.jpg", 534 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s2-1200x1600-718536009.jpg", 535 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_IC4-200x200-1ab71aa040d81bd4259caec68389a82c5be1e6c6.png", 536 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_00-1920x1080-62460b6fbe740e14604f30c6e7efcc1e5493482c.jpg", 537 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_04-1920x1080-358b2bef1a14735c36266bda2ec57d9dab95bb71.jpg", 538 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s1-2560x1440-718536276.jpg" 539 | ], 540 | "productName": "Hitman 2016", 541 | "jcr:isCheckedOut": true, 542 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 543 | "theme": { 544 | "buttonPrimaryBg": "#FFDF00", 545 | "customPrimaryBg": "", 546 | "accentColor": "#FFDF00", 547 | "_type": "Diesel Theme", 548 | "colorScheme": "dark" 549 | }, 550 | "reviewOptOut": false, 551 | "jcr:baseVersion": "a7ca237317f1e7021bb5b6-954c-4ddf-938b-429638093aae", 552 | "externalNavLinks": { 553 | "_type": "Epic Store Links" 554 | }, 555 | "_urlPattern": "/productv2/hitman/home", 556 | "_slug": "home", 557 | "_activeDate": "2020-02-04T14:45:10.836Z", 558 | "lastModified": "2020-08-24T15:12:01.434Z", 559 | "_locale": "en-US", 560 | "_id": "ad158d2a-71de-4be1-afe6-1ae16160bbd6", 561 | "offer": { 562 | "regionRestrictions": { 563 | "_type": "Store Region Filtering" 564 | }, 565 | "_type": "Diesel Offer", 566 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 567 | "id": "f536990dc8164c829b410861caf17add", 568 | "type": "edition", 569 | "hasOffer": true 570 | }, 571 | "item": { 572 | "catalogId": "", 573 | "appName": "", 574 | "_type": "Diesel Product Item", 575 | "namespace": "", 576 | "hasItem": false 577 | }, 578 | "data": { 579 | "productLinks": { 580 | "_type": "Diesel Product Lins" 581 | }, 582 | "socialLinks": { 583 | "linkNaver": "", 584 | "linkTwitter": "https://twitter.com/hitman", 585 | "linkFacebook": "https://www.facebook.com/hitman", 586 | "_type": "Diesel Social Links", 587 | "linkVk": "", 588 | "linkDiscord": "", 589 | "linkReddit": "https://www.reddit.com/r/HiTMAN/", 590 | "title": "Follow HITMAN", 591 | "linkTwitch": "http://www.twitch.tv/hitman", 592 | "linkYoutube": "https://www.youtube.com/user/hitman?hl=en&gl=US", 593 | "linkYouku": "", 594 | "linkWeibo": "", 595 | "linkHomepage": "https://hitman.com", 596 | "linkInstagram": "" 597 | }, 598 | "requirements": { 599 | "languages": [ 600 | "AUDIO - English", 601 | "TEXT - English, French, German, Italian, Spanish - Spain, Japanese, Polish, Portuguese - Brazil, Russian, Chinese - Simplified" 602 | ], 603 | "systems": [ 604 | { 605 | "_type": "Diesel System Detail", 606 | "systemType": "Windows", 607 | "details": [ 608 | { 609 | "_type": "Diesel System Detail Item", 610 | "title": "OS", 611 | "minimum": "OS 64-bit Windows 7", 612 | "recommended": "OS 64-bit Windows 7 / 64-bit Windows 8 (8.1) or Windows 10" 613 | }, 614 | { 615 | "_type": "Diesel System Detail Item", 616 | "title": "Processor", 617 | "minimum": "Intel CPU Core i5-2500K 3.3GHz / AMD CPU Phenom II X4 940", 618 | "recommended": "Intel CPU Core i7 3770 3,4 GHz / AMD CPU AMD FX-8350 4 GHz" 619 | }, 620 | { 621 | "_type": "Diesel System Detail Item", 622 | "title": "Memory", 623 | "minimum": "8", 624 | "recommended": "8" 625 | }, 626 | { 627 | "_type": "Diesel System Detail Item", 628 | "title": "Graphics", 629 | "minimum": "NVIDIA GeForce GTX 660 / Radeon HD 7870", 630 | "recommended": "Nvidia GPU GeForce GTX 770 / AMD GPU Radeon R9 290" 631 | }, 632 | { 633 | "_type": "Diesel System Detail Item", 634 | "title": "DirectX", 635 | "minimum": "11", 636 | "recommended": "11" 637 | }, 638 | { 639 | "_type": "Diesel System Detail Item", 640 | "title": "Storage", 641 | "minimum": "50 ", 642 | "recommended": "50" 643 | } 644 | ] 645 | } 646 | ], 647 | "_type": "Diesel System Details", 648 | "rating": { 649 | "_type": "Diesel Rating" 650 | } 651 | }, 652 | "navOrder": 1, 653 | "footer": { 654 | "_type": "Diesel Product Footer", 655 | "copy": "HITMAN™ © 2020 IO Interactive A/S. Published by IO Interactive A/S. IO INTERACTIVE, the IO logo, HITMAN™, the HITMAN™ logos, and WORLD OF ASSASSINATION are trademarks or registered trademarks owned by or exclusively licensed to IO Interactive A/S. All rights reserved. All other trademarks are the property of their respective owners.", 656 | "privacyPolicyLink": { 657 | "src": "https://www.ioi.dk/privacy-policy/", 658 | "_type": "Diesel Link", 659 | "title": "IO Interactive A/S Privacy Policy" 660 | } 661 | }, 662 | "_type": "Diesel Product Detail", 663 | "about": { 664 | "image": { 665 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s2-1200x1600-718536009.jpg", 666 | "_type": "Diesel Image" 667 | }, 668 | "developerAttribution": "IO Interactive A/S", 669 | "_type": "Diesel Product About", 670 | "publisherAttribution": "IO Interactive A/S", 671 | "description": "Experiment and have fun in the ultimate playground as Agent 47 to become the master assassin. Travel around the globe to exotic locations and eliminate your targets with everything from a katana or a sniper rifle to an exploding golf ball or some expired spaghetti sauce.\n\nThe HITMAN - Game of The Year Edition includes:\n\n- All missions & locations from the award-winning first season of HITMAN\n- \"Patient Zero\" Bonus campaign \n- 3 new Themed Escalation Contracts\n- 3 new Outfits\n- 3 new Weapons", 672 | "shortDescription": "The HITMAN - Game of The Year Edition includes: All missions & locations from the award-winning first season of HITMAN; \"Patient Zero\" Bonus campaign; 3 new Themed Escalation Contracts; 3 new Outfits; 3 new Weapons", 673 | "title": "HITMAN - Game of The Year Edition", 674 | "developerLogo": { 675 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fhome%2FEGS_IOInteractiveAS_HITMANTheCompleteFirstSeason_IC4-200x200-1ab71aa040d81bd4259caec68389a82c5be1e6c6.png", 676 | "_type": "Diesel Image" 677 | } 678 | }, 679 | "banner": { 680 | "showPromotion": false, 681 | "_type": "Epic Store Product Banner", 682 | "link": { 683 | "_type": "Diesel Link" 684 | } 685 | }, 686 | "hero": { 687 | "logoImage": { 688 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_IC1-200x200-015b336a367d6c1059a94cfd77c0e947ef217439.png", 689 | "_type": "Diesel Image" 690 | }, 691 | "portraitBackgroundImageUrl": "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s2-1200x1600-718536009.jpg", 692 | "_type": "Diesel Hero", 693 | "action": { 694 | "_type": "Diesel Action" 695 | }, 696 | "video": { 697 | "loop": false, 698 | "_type": "Diesel Video", 699 | "hasFullScreen": false, 700 | "hasControls": false, 701 | "muted": false, 702 | "autoplay": false 703 | }, 704 | "title": "HITMAN - Game of The Yeard Edition", 705 | "isFullBleed": false, 706 | "altContentPosition": false, 707 | "backgroundImageUrl": "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s1-2560x1440-718536276.jpg" 708 | }, 709 | "carousel": { 710 | "_type": "Diesel Carousel", 711 | "items": [ 712 | { 713 | "image": { 714 | "_type": "Diesel Image" 715 | }, 716 | "_type": "Diesel Carousel Item - Image OR Video", 717 | "video": { 718 | "epicStillDurationSeconds": 2, 719 | "recipes": "{\n \"en-US\": [\n {\n \"recipe\": \"video-fmp4\",\n \"mediaRefId\": \"93334210324545ea8c74d4c40e3d913d\"\n },\n {\n \"recipe\": \"video-webm\",\n \"mediaRefId\": \"7366cb6cc7784c709f0abafaf6677c05\"\n },\n {\n \"recipe\": \"video-hls\",\n \"mediaRefId\": \"145d7ac5a75d45a08ae1504bf6d74660\"\n }\n ]\n}", 720 | "epicStillType": "PREPEND", 721 | "loop": true, 722 | "_type": "Diesel Video", 723 | "hasFullScreen": true, 724 | "hasControls": true, 725 | "title": "HITMAN GOTY Trailer", 726 | "type": "epicHosted", 727 | "muted": false, 728 | "autoplay": true 729 | } 730 | } 731 | ] 732 | }, 733 | "editions": { 734 | "editions": [ 735 | { 736 | "regionRestrictions": { 737 | "_type": "Store Region Filtering" 738 | }, 739 | "image": { 740 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-s1-2560x1440-718536276.jpg", 741 | "_type": "Diesel Image" 742 | }, 743 | "_type": "Product Edition", 744 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 745 | "description": "The HITMAN - Game of The Year Edition includes: All missions & locations from the award-winning first season of HITMAN; \"Patient Zero\" Bonus campaign; 3 new Themed Escalation Contracts; 3 new Outfits; 3 new Weapons", 746 | "offerId": "f536990dc8164c829b410861caf17add", 747 | "tag": "edition", 748 | "title": "HITMAN - Game of the Year Edition", 749 | "slug": "product/hitman/home" 750 | }, 751 | { 752 | "regionRestrictions": { 753 | "_type": "Store Region Filtering" 754 | }, 755 | "image": { 756 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-s5-1920x1080-551403315.jpg", 757 | "_type": "Diesel Image" 758 | }, 759 | "_type": "Product Edition", 760 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 761 | "description": "Experiment and have fun in the ultimate playground as Agent 47 to become the master assassin. Travel around the globe to exotic locations and eliminate your targets with everything from a katana or a sniper rifle to an exploding golf ball.", 762 | "offerId": "e8efad3d47a14284867fef2c347c321d", 763 | "tag": "edition", 764 | "title": "HITMAN", 765 | "slug": "product/hitman/standard-edition" 766 | } 767 | ], 768 | "_type": "Epic Store Editions", 769 | "enableImages": true 770 | }, 771 | "meta": { 772 | "releaseDate": "2020-08-27T15:00:00.000Z", 773 | "_type": "Epic Store Meta", 774 | "publisher": [ 775 | "IO Interactive A/S" 776 | ], 777 | "logo": { 778 | "_type": "Epic Store Image" 779 | }, 780 | "developer": [ 781 | "IO Interactive A/S" 782 | ], 783 | "customReleaseDate": "Coming Soon", 784 | "platform": [ 785 | "Windows" 786 | ], 787 | "tags": [ 788 | "ACTION", 789 | "STEALTH" 790 | ] 791 | }, 792 | "markdown": { 793 | "_type": "Epic Store Markdown" 794 | }, 795 | "dlc": { 796 | "contingentOffer": { 797 | "regionRestrictions": { 798 | "_type": "Store Region Filtering" 799 | }, 800 | "_type": "Diesel Offer", 801 | "hasOffer": false 802 | }, 803 | "_type": "Epic Store DLC", 804 | "dlc": [ 805 | { 806 | "regionRestrictions": { 807 | "_type": "Store Region Filtering" 808 | }, 809 | "image": { 810 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg", 811 | "_type": "Diesel Image" 812 | }, 813 | "_type": "Product DLC", 814 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 815 | "description": "Upgrade your copy of HITMAN to the GOTY Edition now and get immediate access to the Patient Zero campaign plus all the other new content included in the GOTY Edition", 816 | "offerId": "e573ab5b700a418bade0407694c125d6", 817 | "tag": "dlc", 818 | "title": "HITMAN - Game of the Year Upgrade", 819 | "type": "addon", 820 | "slug": "product/hitman/game-of-the-year-upgrade" 821 | } 822 | ], 823 | "enableImages": true 824 | }, 825 | "seo": { 826 | "image": { 827 | "_type": "Epic Store Image" 828 | }, 829 | "twitter": { 830 | "_type": "SEO Twitter Metadata" 831 | }, 832 | "_type": "Epic Store Product SEO", 833 | "og": { 834 | "_type": "SEO OG Metadata" 835 | } 836 | }, 837 | "productSections": [ 838 | { 839 | "productSection": "DLC", 840 | "_type": "Diesel Product Section" 841 | }, 842 | { 843 | "productSection": "EDITIONS", 844 | "_type": "Diesel Product Section" 845 | }, 846 | { 847 | "productSection": "REQUIREMENTS", 848 | "_type": "Diesel Product Section" 849 | }, 850 | { 851 | "productSection": "SOCIAL_LINKS", 852 | "_type": "Diesel Product Section" 853 | }, 854 | { 855 | "productSection": "ABOUT", 856 | "_type": "Diesel Product Section" 857 | }, 858 | { 859 | "productSection": "CAROUSEL", 860 | "_type": "Diesel Product Section" 861 | }, 862 | { 863 | "productSection": "FOOTER", 864 | "_type": "Diesel Product Section" 865 | }, 866 | { 867 | "productSection": "GALLERY", 868 | "_type": "Diesel Product Section" 869 | }, 870 | { 871 | "productSection": "HERO", 872 | "_type": "Diesel Product Section" 873 | } 874 | ], 875 | "gallery": { 876 | "_type": "Diesel Gallery", 877 | "galleryImages": [ 878 | { 879 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_00-1920x1080-62460b6fbe740e14604f30c6e7efcc1e5493482c.jpg", 880 | "_type": "Diesel Gallery Image", 881 | "row": 1 882 | }, 883 | { 884 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_01-1920x1080-f73e7dc1b12fdc311fa56ca569b891f5a6fb721c.jpg", 885 | "_type": "Diesel Gallery Image", 886 | "row": 2 887 | }, 888 | { 889 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_02-1920x1080-badcc937b70155e57bf86e075283ed1060962bb7.jpg", 890 | "_type": "Diesel Gallery Image", 891 | "row": 2 892 | }, 893 | { 894 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_03-1920x1080-52c8d8cd02e0c51a26c00af79b926a3d66865676.jpg", 895 | "_type": "Diesel Gallery Image", 896 | "row": 3 897 | }, 898 | { 899 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_04-1920x1080-358b2bef1a14735c36266bda2ec57d9dab95bb71.jpg", 900 | "_type": "Diesel Gallery Image", 901 | "row": 4 902 | }, 903 | { 904 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-edition%2FEGS_IOInteractiveAS_HITMANGameofTheYeardEdition_G1A_05-1920x1080-539bda3e1756c22417d7cb754b6fabd0ae4672ba.jpg", 905 | "_type": "Diesel Gallery Image", 906 | "row": 4 907 | }, 908 | { 909 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyeardedition-iointeractiveas-bundles-g1a-07-1920x1080-623151153.jpg", 910 | "_type": "Diesel Gallery Image", 911 | "row": 5 912 | } 913 | ] 914 | }, 915 | "navTitle": "HITMAN - Game of the Year Edition" 916 | }, 917 | "ageGate": { 918 | "hasAgeGate": true, 919 | "_type": "Epic Store Age Gate" 920 | }, 921 | "tag": "edition", 922 | "type": "productHome" 923 | }, 924 | { 925 | "productRatings": { 926 | "ratings": [ 927 | { 928 | "image": { 929 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ra1-370x208-370x208-829765488.png", 930 | "_type": "Epic Store Image" 931 | }, 932 | "countryCodes": "US,CA,MX", 933 | "_type": "Epic Store Rating", 934 | "title": "MATURE 17 +" 935 | }, 936 | { 937 | "image": { 938 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FPEGI_18_Rating-208x254-f12521f5a5231d533ff539144709543cdf68f031.jpg", 939 | "_type": "Epic Store Image" 940 | }, 941 | "countryCodes": "AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB", 942 | "_type": "Epic Store Rating", 943 | "title": "PEGI 18" 944 | }, 945 | { 946 | "image": { 947 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2FUSK_18-400x400-7ac38d8b4b29de7c5f10a52ebf17f124e361279e.png", 948 | "_type": "Epic Store Image" 949 | }, 950 | "countryCodes": "DE", 951 | "_type": "Epic Store Rating", 952 | "title": "USK ab 18" 953 | }, 954 | { 955 | "image": { 956 | "src": "https://cdn2.unrealengine.com/18-v-l-d-c-540x117-672303047.png", 957 | "_type": "Epic Store Image" 958 | }, 959 | "countryCodes": "KR", 960 | "_type": "Epic Store Rating", 961 | "title": "청소년이용불가" 962 | }, 963 | { 964 | "image": { 965 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproduct%2Fratings%2F800px-CERO_Z.svg-800x984-ffd454acb3d6f8fac8bdf1bf2a2d01da0d79f858.png", 966 | "_type": "Epic Store Image" 967 | }, 968 | "countryCodes": "JP", 969 | "_type": "Epic Store Rating", 970 | "title": "CERO Z" 971 | } 972 | ], 973 | "_type": "Epic Store Product Ratings" 974 | }, 975 | "disableNewAddons": true, 976 | "modMarketplaceEnabled": false, 977 | "_title": "game-of-the-year-upgrade", 978 | "regionBlock": "", 979 | "_noIndex": false, 980 | "_images_": [ 981 | "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ic3-200x200-551403813.png", 982 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G1A_00-1920x1080-62460b6fbe740e14604f30c6e7efcc1e5493482c.jpg", 983 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg", 984 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s2-1200x1600-623107765.jpg", 985 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G1A_01-1920x1080-f73e7dc1b12fdc311fa56ca569b891f5a6fb721c.jpg", 986 | "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-g1a-03-1920x1080-623104941.jpg", 987 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G2_00-1462x932-15144c2d011f8268027f21cac7558c34ff5d7034.jpg", 988 | "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_IC1-200x200-1edab34af5099dd98909cfb711aadfc72522c46d.png" 989 | ], 990 | "productName": "Hitman 2016", 991 | "jcr:isCheckedOut": true, 992 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 993 | "theme": { 994 | "buttonPrimaryBg": "#FFDF00", 995 | "customPrimaryBg": "#000000", 996 | "accentColor": "#FFDF00", 997 | "_type": "Diesel Theme", 998 | "colorScheme": "dark" 999 | }, 1000 | "reviewOptOut": false, 1001 | "jcr:baseVersion": "a7ca237317f1e7996085f3-eb98-4417-8600-24401aee097e", 1002 | "externalNavLinks": { 1003 | "_type": "Epic Store Links" 1004 | }, 1005 | "_urlPattern": "/productv2/hitman/game-of-the-year-upgrade", 1006 | "_slug": "game-of-the-year-upgrade", 1007 | "_activeDate": "2020-02-04T14:45:10.836Z", 1008 | "lastModified": "2020-08-27T15:22:25.169Z", 1009 | "_locale": "en-US", 1010 | "_id": "88fd9512-f03b-4d62-91b1-deb156bdf420", 1011 | "offer": { 1012 | "regionRestrictions": { 1013 | "_type": "Store Region Filtering" 1014 | }, 1015 | "_type": "Diesel Offer", 1016 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 1017 | "id": "e573ab5b700a418bade0407694c125d6", 1018 | "tag": "dlc", 1019 | "type": "addOn", 1020 | "hasOffer": true 1021 | }, 1022 | "item": { 1023 | "catalogId": "92cd8e3c23a6400986db14bef51caa51", 1024 | "appName": "Barbet", 1025 | "_type": "Diesel Product Item", 1026 | "namespace": "3c06b15a8a2845c0b725d4f952fe00aa", 1027 | "hasItem": true 1028 | }, 1029 | "data": { 1030 | "productLinks": { 1031 | "_type": "Diesel Product Lins" 1032 | }, 1033 | "socialLinks": { 1034 | "linkNaver": "", 1035 | "linkTwitter": "https://twitter.com/hitman", 1036 | "linkFacebook": "https://www.facebook.com/hitman", 1037 | "_type": "Diesel Social Links", 1038 | "linkVk": "", 1039 | "linkDiscord": "", 1040 | "linkReddit": "https://www.reddit.com/r/HiTMAN/", 1041 | "title": "Follow HITMAN", 1042 | "linkTwitch": "http://www.twitch.tv/hitman", 1043 | "linkYoutube": "https://www.youtube.com/user/hitman?hl=en&gl=US", 1044 | "linkYouku": "", 1045 | "linkWeibo": "", 1046 | "linkHomepage": "https://hitman.com", 1047 | "linkInstagram": "" 1048 | }, 1049 | "requirements": { 1050 | "languages": [ 1051 | "AUDIO - English", 1052 | "TEXT - English, French, German, Italian, Spanish - Spain, Japanese, Polish, Portuguese - Brazil, Russian, Chinese - Simplified" 1053 | ], 1054 | "systems": [ 1055 | { 1056 | "_type": "Diesel System Detail", 1057 | "systemType": "Windows", 1058 | "details": [ 1059 | { 1060 | "_type": "Diesel System Detail Item", 1061 | "title": "OS", 1062 | "minimum": "OS 64-bit Windows 7", 1063 | "recommended": "OS 64-bit Windows 7 / 64-bit Windows 8 (8.1) or Windows 10" 1064 | }, 1065 | { 1066 | "_type": "Diesel System Detail Item", 1067 | "title": "Processor", 1068 | "minimum": "Intel CPU Core i5-2500K 3.3GHz / AMD CPU Phenom II X4 940", 1069 | "recommended": "Intel CPU Core i7 3770 3,4 GHz / AMD CPU AMD FX-8350 4 GHz" 1070 | }, 1071 | { 1072 | "_type": "Diesel System Detail Item", 1073 | "title": "Memory", 1074 | "minimum": "8", 1075 | "recommended": "8" 1076 | }, 1077 | { 1078 | "_type": "Diesel System Detail Item", 1079 | "title": "Graphics", 1080 | "minimum": "NVIDIA GeForce GTX 660 / Radeon HD 7870", 1081 | "recommended": "Nvidia GPU GeForce GTX 770 / AMD GPU Radeon R9 290" 1082 | }, 1083 | { 1084 | "_type": "Diesel System Detail Item", 1085 | "title": "DirectX", 1086 | "minimum": "11", 1087 | "recommended": "11" 1088 | }, 1089 | { 1090 | "_type": "Diesel System Detail Item", 1091 | "title": "Storage", 1092 | "minimum": "50 ", 1093 | "recommended": "50" 1094 | } 1095 | ] 1096 | } 1097 | ], 1098 | "_type": "Diesel System Details", 1099 | "rating": { 1100 | "_type": "Diesel Rating" 1101 | } 1102 | }, 1103 | "navOrder": 3, 1104 | "footer": { 1105 | "_type": "Diesel Product Footer", 1106 | "copy": "HITMAN™ © 2020 IO Interactive A/S. Published by IO Interactive A/S. IO INTERACTIVE, the IO logo, HITMAN™, the HITMAN™ logos, and WORLD OF ASSASSINATION are trademarks or registered trademarks owned by or exclusively licensed to IO Interactive A/S. All rights reserved. All other trademarks are the property of their respective owners.", 1107 | "privacyPolicyLink": { 1108 | "src": "https://www.ioi.dk/privacy-policy/", 1109 | "_type": "Diesel Link", 1110 | "title": "IO Interactive A/S Privacy Policy" 1111 | } 1112 | }, 1113 | "_type": "Diesel Product Detail", 1114 | "about": { 1115 | "image": { 1116 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G2_00-1462x932-15144c2d011f8268027f21cac7558c34ff5d7034.jpg", 1117 | "_type": "Diesel Image" 1118 | }, 1119 | "developerAttribution": "IO Interactive A/S", 1120 | "_type": "Diesel Product About", 1121 | "publisherAttribution": "IO Interactive A/S", 1122 | "description": "Upgrade your copy of HITMAN to the GOTY Edition now and get immediate access to the Patient Zero campaign plus all the other new content included in the GOTY Edition.\n\n# The HITMAN - Game of The Year Edition Upgrade includes:\n- \"Patient Zero\" campaign featuring 4 brand new missions including new gameplay mechanics and features\n- 3 new Themed Escalation Contracts\n- 3 new Outfits\n- 3 new Weapons\n\n![Hitman image](https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-g2-00-1462x932-623107394.jpg)", 1123 | "shortDescription": "Upgrade your copy of HITMAN to the GOTY Edition now and get immediate access to the Patient Zero campaign plus all the other new content included in the GOTY Edition", 1124 | "title": "HITMAN - Game of the Year Upgrade", 1125 | "developerLogo": { 1126 | "src": "https://cdn2.unrealengine.com/egs-hitman-iointeractiveas-ic3-200x200-551403813.png", 1127 | "_type": "Diesel Image" 1128 | } 1129 | }, 1130 | "banner": { 1131 | "showPromotion": false, 1132 | "_type": "Epic Store Product Banner", 1133 | "link": { 1134 | "_type": "Diesel Link" 1135 | } 1136 | }, 1137 | "hero": { 1138 | "logoImage": { 1139 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_IC1-200x200-1edab34af5099dd98909cfb711aadfc72522c46d.png", 1140 | "_type": "Diesel Image" 1141 | }, 1142 | "portraitBackgroundImageUrl": "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s2-1200x1600-623107765.jpg", 1143 | "_type": "Diesel Hero", 1144 | "action": { 1145 | "_type": "Diesel Action" 1146 | }, 1147 | "video": { 1148 | "loop": false, 1149 | "_type": "Diesel Video", 1150 | "hasFullScreen": false, 1151 | "hasControls": false, 1152 | "muted": false, 1153 | "autoplay": false 1154 | }, 1155 | "isFullBleed": false, 1156 | "altContentPosition": false, 1157 | "backgroundImageUrl": "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-s1-2560x1440-623108052.jpg" 1158 | }, 1159 | "carousel": { 1160 | "_type": "Diesel Carousel", 1161 | "items": [ 1162 | { 1163 | "image": { 1164 | "_type": "Diesel Image" 1165 | }, 1166 | "_type": "Diesel Carousel Item - Image OR Video", 1167 | "video": { 1168 | "epicStillDurationSeconds": 2, 1169 | "recipes": "{\n \"en-US\": [\n {\n \"recipe\": \"video-fmp4\",\n \"mediaRefId\": \"93334210324545ea8c74d4c40e3d913d\"\n },\n {\n \"recipe\": \"video-webm\",\n \"mediaRefId\": \"7366cb6cc7784c709f0abafaf6677c05\"\n },\n {\n \"recipe\": \"video-hls\",\n \"mediaRefId\": \"145d7ac5a75d45a08ae1504bf6d74660\"\n }\n ]\n}", 1170 | "epicStillType": "PREPEND", 1171 | "loop": true, 1172 | "_type": "Diesel Video", 1173 | "hasFullScreen": true, 1174 | "hasControls": true, 1175 | "title": "HITMAN GOTY Trailer", 1176 | "type": "epicHosted", 1177 | "muted": false, 1178 | "autoplay": true 1179 | } 1180 | } 1181 | ] 1182 | }, 1183 | "editions": { 1184 | "_type": "Epic Store Editions", 1185 | "enableImages": false 1186 | }, 1187 | "meta": { 1188 | "releaseDate": "2020-03-13T15:00:00.000Z", 1189 | "_type": "Epic Store Meta", 1190 | "publisher": [ 1191 | "IO Interactive A/S" 1192 | ], 1193 | "logo": { 1194 | "_type": "Epic Store Image" 1195 | }, 1196 | "developer": [ 1197 | "IO Interactive A/S" 1198 | ], 1199 | "platform": [ 1200 | "Windows" 1201 | ], 1202 | "tags": [ 1203 | "ACTION", 1204 | "STEALTH" 1205 | ] 1206 | }, 1207 | "markdown": { 1208 | "_type": "Epic Store Markdown" 1209 | }, 1210 | "dlc": { 1211 | "contingentOffer": { 1212 | "regionRestrictions": { 1213 | "_type": "Store Region Filtering" 1214 | }, 1215 | "_type": "Diesel Offer", 1216 | "hasOffer": false 1217 | }, 1218 | "_type": "Epic Store DLC", 1219 | "enableImages": false 1220 | }, 1221 | "seo": { 1222 | "image": { 1223 | "_type": "Epic Store Image" 1224 | }, 1225 | "twitter": { 1226 | "_type": "SEO Twitter Metadata" 1227 | }, 1228 | "_type": "Epic Store Product SEO", 1229 | "og": { 1230 | "_type": "SEO OG Metadata" 1231 | } 1232 | }, 1233 | "productSections": [ 1234 | { 1235 | "productSection": "REQUIREMENTS", 1236 | "_type": "Diesel Product Section" 1237 | }, 1238 | { 1239 | "productSection": "SOCIAL_LINKS", 1240 | "_type": "Diesel Product Section" 1241 | }, 1242 | { 1243 | "productSection": "ABOUT", 1244 | "_type": "Diesel Product Section" 1245 | }, 1246 | { 1247 | "productSection": "CAROUSEL", 1248 | "_type": "Diesel Product Section" 1249 | }, 1250 | { 1251 | "productSection": "FOOTER", 1252 | "_type": "Diesel Product Section" 1253 | }, 1254 | { 1255 | "productSection": "GALLERY", 1256 | "_type": "Diesel Product Section" 1257 | }, 1258 | { 1259 | "productSection": "HERO", 1260 | "_type": "Diesel Product Section" 1261 | } 1262 | ], 1263 | "gallery": { 1264 | "_type": "Diesel Gallery", 1265 | "galleryImages": [ 1266 | { 1267 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G1A_00-1920x1080-62460b6fbe740e14604f30c6e7efcc1e5493482c.jpg", 1268 | "_type": "Diesel Gallery Image", 1269 | "row": 1 1270 | }, 1271 | { 1272 | "src": "https://cdn2.unrealengine.com/Diesel%2Fproductv2%2Fhitman%2Fgame-of-the-year-upgrade%2FEGS_IOInteractiveAS_HITMANGameofTheYearUpgrade_G1A_01-1920x1080-f73e7dc1b12fdc311fa56ca569b891f5a6fb721c.jpg", 1273 | "_type": "Diesel Gallery Image", 1274 | "row": 1 1275 | }, 1276 | { 1277 | "src": "https://cdn2.unrealengine.com/egs-hitmangameoftheyearupgrade-iointeractiveas-dlc-g1a-03-1920x1080-623104941.jpg", 1278 | "_type": "Diesel Gallery Image", 1279 | "row": 2 1280 | } 1281 | ] 1282 | }, 1283 | "navTitle": "HITMAN - Game of the Year Upgrade" 1284 | }, 1285 | "ageGate": { 1286 | "hasAgeGate": true, 1287 | "_type": "Epic Store Age Gate" 1288 | }, 1289 | "tag": "dlc", 1290 | "type": "addon" 1291 | } 1292 | ] 1293 | } --------------------------------------------------------------------------------