update HLTB API; remove unneeded dep & do it yourself!

This commit is contained in:
Wouter Groeneveld 2022-09-15 09:37:24 +02:00
parent db3cea5c0d
commit 92c5543b79
7 changed files with 61 additions and 266 deletions

View File

@ -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 .

View File

@ -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"
},

View File

@ -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) {

View File

@ -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
}

View File

@ -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\\"
---

View File

@ -1,5 +1,3 @@
jest.mock('howlongtobeat')
const { howlong } = require('../../src/howlongtobeat/howlong.js')
const fs = require('fs');
const fsp = require('fs').promises;

238
yarn.lock
View File

@ -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"