From 92c5543b79fa3e1f606456d8d6dd178e3828c161 Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Thu, 15 Sep 2022 09:37:24 +0200 Subject: [PATCH] update HLTB API; remove unneeded dep & do it yourself! --- README.md | 2 +- package.json | 3 +- src/howlongtobeat/howlong.js | 64 ++++- test/howlongtobeat/__mocks__/howlongtobeat.js | 16 -- .../__snapshots__/howlong.test.js.snap | 2 +- test/howlongtobeat/howlong.test.js | 2 - yarn.lock | 238 +----------------- 7 files changed, 61 insertions(+), 266 deletions(-) delete mode 100644 test/howlongtobeat/__mocks__/howlongtobeat.js diff --git a/README.md b/README.md index b230987..cb676b1 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ Usage example: downloadDir: `${__dirname}/static/img/howlongtobeat_thumbs`) ``` -It will print out games and metadata it found. Uses the cool [howlongtobeat npm package](https://www.npmjs.com/package/howlongtobeat) to do its dirty work. +It will print out games and metadata it found. Working example: https://jefklakscodex.com/articles/reviews/diablo-3/ (on the left side). Check out the Hugo template to use the properties at https://github.com/wgroeneveld/jefklakscodex . diff --git a/package.json b/package.json index a5f1837..5dc4bdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jam-my-stack", - "version": "1.0.31", + "version": "1.0.32", "repository": { "url": "https://github.com/wgroeneveld/jam-my-stack", "type": "git" @@ -17,7 +17,6 @@ "ent": "^2.2.0", "fast-xml-parser": "^3.18.0", "got": "11.8.3", - "howlongtobeat": "^1.5.1", "parser-front-matter": "^1.6.4", "youtube-dl-exec": "^1.2.4" }, diff --git a/src/howlongtobeat/howlong.js b/src/howlongtobeat/howlong.js index 2a470f2..6f25806 100644 --- a/src/howlongtobeat/howlong.js +++ b/src/howlongtobeat/howlong.js @@ -1,6 +1,3 @@ -const hltb = require('howlongtobeat') -const hltbService = new hltb.HowLongToBeatService() - const { getFiles } = require('./../file-utils'); const fs = require('fs').promises; const got = require("got"); @@ -32,8 +29,8 @@ async function loadPostsWithFrontMatter(postsDirectoryPath) { } async function downloadThumbnail(url, id, dir) { - if(url.startsWith('/')) { - url = `https://howlongtobeat.com${url}` + if(url.indexOf('howlongtobeat.com') == -1) { + url = `https://howlongtobeat.com/games/${url}` } console.log(` --- downloading thumbnail ${url} of id ${id}...`) await pipeline( @@ -42,13 +39,66 @@ async function downloadThumbnail(url, id, dir) { ) } +// I'm doing this myself, getting tired of HLTB's API breakages. +// See https://github.com/ckatzorke/howlongtobeat/issues/40 +async function howLongToBeatSearch(game) { + const params = { + "searchType": "games", + "searchTerms": game.split(" "), + "searchPage": 1, + "size": 20, + "searchOptions": { + "games": { + "userId": 0, + "platform": "", + "sortCategory": "popular", + "rangeCategory": "main", + "rangeTime": { + "min": 0, + "max": 0 + }, + "gameplay": { + "perspective": "", + "flow": "", + "genre": "" + }, + "modifier": "" + }, + "users": { + "sortCategory": "postcount" + }, + "filter": "", + "sort": 0, + "randomizer": 0 + } + } + + const results = await got.post("https://www.howlongtobeat.com/api/search", { + json: params, + headers: { + 'Content-Type': "application/json", + 'Referer': 'https://howlongtobeat.com/', + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:90.0) Gecko/20100101 Firefox/90.0" + } + }).json() + console.log(results) + return results.data.map(item => { + return { + 'id': item.game_id, + 'name': item.game_name, + 'imageUrl': item.game_image, + 'howlong': (item.comp_main / 60 / 60).toFixed(1) + } + }) +} + async function fillInHowLongToBeat(posts, downloadDir) { for(post of posts) { - const results = await hltbService.search(post.game) + const results = await howLongToBeatSearch(post.game) if(results.length > 0) { const game = results[0] - post.howlongtobeat = game.gameplayMain + post.howlongtobeat = game.howlong post.howlongtobeat_id = game.id if(downloadDir) { diff --git a/test/howlongtobeat/__mocks__/howlongtobeat.js b/test/howlongtobeat/__mocks__/howlongtobeat.js deleted file mode 100644 index 54997ce..0000000 --- a/test/howlongtobeat/__mocks__/howlongtobeat.js +++ /dev/null @@ -1,16 +0,0 @@ -class HowLongToBeatService { - constructor() { - } - - async search(game) { - return [{ - gameplayMain: 93, - id: 11228, - imageUrl: "https://jefklakscodex.com/img/logo.png" - }] - } -} - -module.exports = { - HowLongToBeatService -} diff --git a/test/howlongtobeat/__snapshots__/howlong.test.js.snap b/test/howlongtobeat/__snapshots__/howlong.test.js.snap index d860c0a..8a596ca 100644 --- a/test/howlongtobeat/__snapshots__/howlong.test.js.snap +++ b/test/howlongtobeat/__snapshots__/howlong.test.js.snap @@ -4,7 +4,7 @@ exports[`howlong adds howlong to beat id and hours to frontmatter 1`] = ` "--- title: \\"wizardry 8 review\\" howlongtobeat_id: 11228 -howlongtobeat_hrs: 93 +howlongtobeat_hrs: 92.1 game_name: \\"Wizardry 8\\" --- diff --git a/test/howlongtobeat/howlong.test.js b/test/howlongtobeat/howlong.test.js index 5fbc782..29c9e5f 100644 --- a/test/howlongtobeat/howlong.test.js +++ b/test/howlongtobeat/howlong.test.js @@ -1,5 +1,3 @@ -jest.mock('howlongtobeat') - const { howlong } = require('../../src/howlongtobeat/howlong.js') const fs = require('fs'); const fsp = require('fs').promises; diff --git a/yarn.lock b/yarn.lock index 8cccdb8..3f1127e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1066,15 +1066,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.22": - version: 0.22.0 - resolution: "axios@npm:0.22.0" - dependencies: - follow-redirects: ^1.14.4 - checksum: 8238c34fe3cec0ac3a09b00c1c6b355f99d37f9d3950dc570803ef4b4a6dd4971462ec94ecd2b3a89f4b13cda2568d8ac6d96abffb71ae2f0e9962bf5806b2e0 - languageName: node - linkType: hard - "babel-jest@npm:^26.6.3": version: 26.6.3 resolution: "babel-jest@npm:26.6.3" @@ -1217,13 +1208,6 @@ __metadata: languageName: node linkType: hard -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: e827963c416fdb1dbcd57e066a43c40829518f4dcdc9f58ed04519daeebb610adacbb6cf102518bda9f08be593c5b1b49a83e36bf6b7d91b3403f7e35510eeae - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1436,34 +1420,6 @@ __metadata: languageName: node linkType: hard -"cheerio-select-tmp@npm:^0.1.0": - version: 0.1.1 - resolution: "cheerio-select-tmp@npm:0.1.1" - dependencies: - css-select: ^3.1.2 - css-what: ^4.0.0 - domelementtype: ^2.1.0 - domhandler: ^4.0.0 - domutils: ^2.4.4 - checksum: 6e9331f38749ac5a63aad4fd98baeac4cbd810600f1bcf5ed483034d800313c31a11d1227af672184487105a69dacf899752aa0902e5a9c94ee69e8d209d51f6 - languageName: node - linkType: hard - -"cheerio@npm:^1.0.0-rc.2": - version: 1.0.0-rc.5 - resolution: "cheerio@npm:1.0.0-rc.5" - dependencies: - cheerio-select-tmp: ^0.1.0 - dom-serializer: ~1.2.0 - domhandler: ^4.0.0 - entities: ~2.1.0 - htmlparser2: ^6.0.0 - parse5: ^6.0.0 - parse5-htmlparser2-tree-adapter: ^6.0.0 - checksum: 9e5c762323c3e3b56027a2e638aab6afa28191df399a57e517300a31b35e8b1665c588ab15baf9cb3a7f7ea7de7446e0e4d975cc3386027c2eb06c8ec5ed0b0d - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -1664,26 +1620,6 @@ __metadata: languageName: node linkType: hard -"css-select@npm:^3.1.2": - version: 3.1.2 - resolution: "css-select@npm:3.1.2" - dependencies: - boolbase: ^1.0.0 - css-what: ^4.0.0 - domhandler: ^4.0.0 - domutils: ^2.4.3 - nth-check: ^2.0.0 - checksum: c06346140ea596220896980b8ce62e7dbc9fc4c902a0858d97ba933f538aecc96fed57967c15793faf76f2a6bab5385650d0a3637e07f498f75c39ce2c9764ab - languageName: node - linkType: hard - -"css-what@npm:^4.0.0": - version: 4.0.0 - resolution: "css-what@npm:4.0.0" - checksum: 2116d25ed233597bfe0b2fb50b56076f5dfc1665f602f8a367bbaa8d086ce91c188d92a47118fa0daf35118456b0a0e537241f89b34b4d98161d63da63740471 - languageName: node - linkType: hard - "cssom@npm:^0.4.4": version: 0.4.4 resolution: "cssom@npm:0.4.4" @@ -1865,13 +1801,6 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:~6.0.0": - version: 6.0.0 - resolution: "detect-indent@npm:6.0.0" - checksum: ad0619414151942d278c06cd4b6b79feb96c16eebf4979ef1d03433941f1a85c9bba7daba73a73814d629923716169da5416bbc4290c232d53a2dc06f462da5f - languageName: node - linkType: hard - "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -1886,31 +1815,6 @@ __metadata: languageName: node linkType: hard -"docopt@npm:~0.6.2": - version: 0.6.2 - resolution: "docopt@npm:0.6.2" - checksum: 956f40c184511e9691deafc5e205d0261f3d90def7f6a0c9caa189020ee968da2c05af4083851f38e7ea6ffbccef2f77d4e3a5ad7a3c9c1a23f85bc3b83368bb - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1, dom-serializer@npm:~1.2.0": - version: 1.2.0 - resolution: "dom-serializer@npm:1.2.0" - dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.0.0 - entities: ^2.0.0 - checksum: 77e3bff86555c853af8a5f87f7433bdaf47fd377ed201b74c465c08445daf3832380acfe25276e6806ffad87ea42e57d4fb992021aef83c5dfae2d352b90860b - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.1.0": - version: 2.1.0 - resolution: "domelementtype@npm:2.1.0" - checksum: c3e63b6c94bf74d6375e12370f612d1cd61c0d3bc21b46684d93c797b3924de2e84278b0b5cdf3dce21f64ee94c34a005994f373c0e420759ae1856f075f0f57 - languageName: node - linkType: hard - "domexception@npm:^2.0.1": version: 2.0.1 resolution: "domexception@npm:2.0.1" @@ -1920,39 +1824,6 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^4.0.0": - version: 4.0.0 - resolution: "domhandler@npm:4.0.0" - dependencies: - domelementtype: ^2.1.0 - checksum: 22cc8e1335728a7c49434d1d12ff1563aea758c26c8ebf50fcf9e28ceb2bd0e5a15518d69abdb5db37aa7c0c347c8f68d323d12fc744a68853fb7641cbdcec89 - languageName: node - linkType: hard - -"domutils@npm:^2.4.3, domutils@npm:^2.4.4": - version: 2.4.4 - resolution: "domutils@npm:2.4.4" - dependencies: - dom-serializer: ^1.0.1 - domelementtype: ^2.0.1 - domhandler: ^4.0.0 - checksum: abee29c1aade78506fb9ccb7bd7a2720fb18a87f230a7f7f2e3438458c27dee03b8abad4f3e448ed39da86d2a573e8bc7323d8dd0f2a473f26a455c017e303ce - languageName: node - linkType: hard - -"dot-json@npm:^1.2.2": - version: 1.2.2 - resolution: "dot-json@npm:1.2.2" - dependencies: - detect-indent: ~6.0.0 - docopt: ~0.6.2 - underscore-keypath: ~0.0.22 - bin: - dot-json: bin/dot-json.js - checksum: 3113cbf01a69b1f23e66937ed5a3b4d3f4a57ada893aea40bfdb45e245596734d57abbbfa01a352cf9cae586da2d62a1503e14f597da66df26c6adc74c30538f - languageName: node - linkType: hard - "ecc-jsbn@npm:~0.1.1": version: 0.1.2 resolution: "ecc-jsbn@npm:0.1.2" @@ -2011,20 +1882,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: ebd62621a15a13f4e914322cf8b1d4aeb224fa5365910d8899615835dada8b1349dea77bbcd4db2eea100845de313c46303accafece669d929d64ebcc90f4517 - languageName: node - linkType: hard - -"entities@npm:~2.1.0": - version: 2.1.0 - resolution: "entities@npm:2.1.0" - checksum: 91d5330633b97df881bcd02e233d32067876d45abdc7c75cf058ded524d8b22f8dc7a3965813d6982ceeba918abdbd9029a0459759ee5f6f98ec953a4786612f - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.0 resolution: "env-paths@npm:2.2.0" @@ -2267,7 +2124,7 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": +"fast-levenshtein@npm:~2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: a2d03af3088b0397633e007fb3010ecfa4f91cae2116d2385653c59396a1b31467641afa672a79e6f82218518670dc144128378124e711e35dbf90bc82846f22 @@ -2351,16 +2208,6 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.4": - version: 1.15.0 - resolution: "follow-redirects@npm:1.15.0" - peerDependenciesMeta: - debug: - optional: true - checksum: 06e19a010288e3b0dcaf478a4ace2b4df20a5f3ca97c07026d63feda91121e0c0273ad3f293a6e5945ad3607b6d484a23061e79d6160b5406300e5f4357252d6 - languageName: node - linkType: hard - "for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" @@ -2708,18 +2555,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"howlongtobeat@npm:^1.5.1": - version: 1.5.1 - resolution: "howlongtobeat@npm:1.5.1" - dependencies: - axios: ^0.22 - cheerio: ^1.0.0-rc.2 - fast-levenshtein: ^2.0.6 - user-agents: ^1.0.580 - checksum: 19900d03e50365b0e9e5a682bab5cb9b03805fed9815acce21212ac20cffc9d24205b4063fa0864b38b0197c4517cf22bffd8495e0e5158bc01b50ae2884ee8d - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -2736,18 +2571,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"htmlparser2@npm:^6.0.0": - version: 6.0.0 - resolution: "htmlparser2@npm:6.0.0" - dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.0.0 - domutils: ^2.4.4 - entities: ^2.0.0 - checksum: 03819682d894316d1f8d1a11c9212bdf9c8b2e7a2adc0e19262ac8105d0a4d0577caa1f40bf52ac4876961720342e9f12b86dbf2488f0a8263cf278c03129833 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.0.0": version: 4.1.0 resolution: "http-cache-semantics@npm:4.1.0" @@ -3206,7 +3029,6 @@ fsevents@^2.1.2: ent: ^2.2.0 fast-xml-parser: ^3.18.0 got: 11.8.3 - howlongtobeat: ^1.5.1 jest: ^26.6.3 mockdate: ^3.0.2 parser-front-matter: ^1.6.4 @@ -3883,13 +3705,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"lodash.clonedeep@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.clonedeep@npm:4.5.0" - checksum: 41e2fe4c57c56a66a4775a6ddeebe9272f0ce4d257d97b3cb8724a9b01eeec9b09ce7e8603d6926baf5f48c287d988f0de4bf5aa244ea86b1f22c1e6f203cc27 - languageName: node - linkType: hard - "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -4339,15 +4154,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"nth-check@npm:^2.0.0": - version: 2.0.0 - resolution: "nth-check@npm:2.0.0" - dependencies: - boolbase: ^1.0.0 - checksum: 380a6dcf32910c783f30c62d6ae02194e8ac860faf99ff46b2248942477304351755a7ee2fa26ce289b6d078350fa14703da5cf4b3c65275032b43008a275064 - languageName: node - linkType: hard - "number-is-nan@npm:^1.0.0": version: 1.0.1 resolution: "number-is-nan@npm:1.0.1" @@ -4520,15 +4326,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"parse5-htmlparser2-tree-adapter@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" - dependencies: - parse5: ^6.0.1 - checksum: d7389a60fd1930cbbde40456a5f990468d13f4b7a5550db01adde4d61e97245e90c32de2575b531408fe7a2781111f96b1c955ff23bf2f61218db712434be3e0 - languageName: node - linkType: hard - "parse5@npm:5.1.1": version: 5.1.1 resolution: "parse5@npm:5.1.1" @@ -4536,13 +4333,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"parse5@npm:^6.0.0, parse5@npm:^6.0.1": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: e312014edd76a6dc2eac35248ad53477b2594a7b92b7a00f66169483bb87c3d1d36660daddeb720457418dfe0893eb3ad1043085047fc3699167afa6834cb4c4 - languageName: node - linkType: hard - "parser-front-matter@npm:^1.6.4": version: 1.6.4 resolution: "parser-front-matter@npm:1.6.4" @@ -5703,22 +5493,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"underscore-keypath@npm:~0.0.22": - version: 0.0.22 - resolution: "underscore-keypath@npm:0.0.22" - dependencies: - underscore: "*" - checksum: aaab5256d2be2a2ad29b28ac78a17f44b49ed3fd966d91ee91839e68c0470804618167181473c8adccb2cdd6649601d833e526d09c3b828036c1eeea1f378695 - languageName: node - linkType: hard - -"underscore@npm:*": - version: 1.12.0 - resolution: "underscore@npm:1.12.0" - checksum: c4423fa2c68de8d5e0ccfdeeb7f61f803d6600b8ec14c1f154ad28f8734e3cdf39152e0e09a6a3f1e9911f6a815074b83803a7aa4dfee6f375427ec12e80d1d4 - languageName: node - linkType: hard - "union-value@npm:^1.0.0": version: 1.0.1 resolution: "union-value@npm:1.0.1" @@ -5764,16 +5538,6 @@ fsevents@^2.1.2: languageName: node linkType: hard -"user-agents@npm:^1.0.580": - version: 1.0.581 - resolution: "user-agents@npm:1.0.581" - dependencies: - dot-json: ^1.2.2 - lodash.clonedeep: ^4.5.0 - checksum: 9104c544c5e7ed26711ed1ee908f75ad726933ea81ae652719a4997ad7e398240feeb167a81f08128226b33bbcc160005ce930936e79626582a8751a268afd21 - languageName: node - linkType: hard - "util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2"