also download thumbnails from howlongtobeat
This commit is contained in:
parent
1bd64eed52
commit
cb36a4d666
|
@ -121,6 +121,8 @@ Usage example:
|
||||||
|
|
||||||
Adds https://howlongtobeat.com/ game length (`MainGame`) and an ID to your front matter (keys `howlongtobeat_id` and `howlongtobeat_hrs`), provided you first added a property called `game_name`. (This gets substituted).
|
Adds https://howlongtobeat.com/ game length (`MainGame`) and an ID to your front matter (keys `howlongtobeat_id` and `howlongtobeat_hrs`), provided you first added a property called `game_name`. (This gets substituted).
|
||||||
|
|
||||||
|
It also downloads a thumbnail of the cover image if you provided the dir as an option.
|
||||||
|
|
||||||
So, Frontmatter like this:
|
So, Frontmatter like this:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -145,7 +147,9 @@ In your Hugo template, add a link to `https://howlongtobeat.com/game?id={howlong
|
||||||
Usage example:
|
Usage example:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
await howlong(`${__dirname}/content/articles`)
|
await howlong({
|
||||||
|
postDir: `${__dirname}/content/articles`,
|
||||||
|
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. Uses the cool [howlongtobeat npm package](https://www.npmjs.com/package/howlongtobeat) to do its dirty work.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "jam-my-stack",
|
"name": "jam-my-stack",
|
||||||
"version": "1.0.19",
|
"version": "1.0.20",
|
||||||
"repository": {
|
"repository": {
|
||||||
"url": "https://github.com/wgroeneveld/jam-my-stack",
|
"url": "https://github.com/wgroeneveld/jam-my-stack",
|
||||||
"type": "git"
|
"type": "git"
|
||||||
|
|
|
@ -3,12 +3,15 @@ const hltbService = new hltb.HowLongToBeatService()
|
||||||
|
|
||||||
const { getFiles } = require('./../file-utils');
|
const { getFiles } = require('./../file-utils');
|
||||||
const fs = require('fs').promises;
|
const fs = require('fs').promises;
|
||||||
|
const got = require("got");
|
||||||
const {promisify} = require('util');
|
const {promisify} = require('util');
|
||||||
const frontMatterParser = require('parser-front-matter');
|
const frontMatterParser = require('parser-front-matter');
|
||||||
|
|
||||||
const parse = promisify(frontMatterParser.parse.bind(frontMatterParser));
|
const parse = promisify(frontMatterParser.parse.bind(frontMatterParser));
|
||||||
|
|
||||||
|
const stream = require('stream');
|
||||||
|
const pipeline = promisify(stream.pipeline);
|
||||||
|
const { createWriteStream } = require("fs");
|
||||||
|
|
||||||
async function loadPostsWithFrontMatter(postsDirectoryPath) {
|
async function loadPostsWithFrontMatter(postsDirectoryPath) {
|
||||||
const postNames = await getFiles(postsDirectoryPath);
|
const postNames = await getFiles(postsDirectoryPath);
|
||||||
|
@ -27,22 +30,37 @@ async function loadPostsWithFrontMatter(postsDirectoryPath) {
|
||||||
return posts;
|
return posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fillInHowLongToBeat(posts) {
|
async function downloadThumbnail(url, id, dir) {
|
||||||
|
console.log(` --- downloading thumbnail ${url} of id ${id}...`)
|
||||||
|
await pipeline(
|
||||||
|
got.stream(url),
|
||||||
|
createWriteStream(`${dir}/${id}.jpg`)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fillInHowLongToBeat(posts, downloadDir) {
|
||||||
for(post of posts) {
|
for(post of posts) {
|
||||||
const results = await hltbService.search(post.game)
|
const results = await hltbService.search(post.game)
|
||||||
|
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
post.howlongtobeat = results[0].gameplayMain
|
const game = results[0]
|
||||||
post.howlongtobeat_id = results[0].id
|
post.howlongtobeat = game.gameplayMain
|
||||||
}
|
post.howlongtobeat_id = game.id
|
||||||
|
|
||||||
|
if(downloadDir) {
|
||||||
|
await downloadThumbnail(game.imageUrl, game.id, downloadDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run(dir) {
|
async function run(options) {
|
||||||
console.log(`-- SCANNING not yet processed articles in ${dir} for game_name --`)
|
const { postDir, downloadDir } = options
|
||||||
let posts = await loadPostsWithFrontMatter(dir)
|
|
||||||
|
console.log(`-- SCANNING not yet processed articles in ${postDir} for game_name --`)
|
||||||
|
let posts = await loadPostsWithFrontMatter(postDir)
|
||||||
posts = posts.filter(post => post.game && !post.howlongtobeat_id)
|
posts = posts.filter(post => post.game && !post.howlongtobeat_id)
|
||||||
await fillInHowLongToBeat(posts)
|
await fillInHowLongToBeat(posts, downloadDir)
|
||||||
|
|
||||||
for(post of posts) {
|
for(post of posts) {
|
||||||
let data = await fs.readFile(post.file, 'utf8')
|
let data = await fs.readFile(post.file, 'utf8')
|
||||||
|
|
|
@ -5,7 +5,8 @@ class HowLongToBeatService {
|
||||||
async search(game) {
|
async search(game) {
|
||||||
return [{
|
return [{
|
||||||
gameplayMain: 93,
|
gameplayMain: 93,
|
||||||
id: 11228
|
id: 11228,
|
||||||
|
imageUrl: "https://jefklakscodex.com/img/logo.png"
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,9 @@ game_name: "Wizardry 8"
|
||||||
blabla nice one 9/10 GG!
|
blabla nice one 9/10 GG!
|
||||||
`
|
`
|
||||||
|
|
||||||
|
jest.disableAutomock()
|
||||||
|
jest.unmock('got')
|
||||||
|
|
||||||
const dumpdir = `${__dirname}/howlong-stub`
|
const dumpdir = `${__dirname}/howlong-stub`
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
if(fs.existsSync(dumpdir)) {
|
if(fs.existsSync(dumpdir)) {
|
||||||
|
@ -23,9 +26,22 @@ beforeEach(async () => {
|
||||||
await fsp.writeFile(`${dumpdir}/howlongtobeat-sample.md`, mdsample, 'utf-8')
|
await fsp.writeFile(`${dumpdir}/howlongtobeat-sample.md`, mdsample, 'utf-8')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('howlong adds howlong to beat id and hours to frontmatter', async () => {
|
test('howlong adds howlong to beat id and hours to frontmatter', async() => {
|
||||||
await howlong(dumpdir)
|
await howlong({
|
||||||
|
postDir: dumpdir,
|
||||||
|
downloadDir: dumpdir
|
||||||
|
})
|
||||||
|
|
||||||
const actualmd = await fsp.readFile(`${dumpdir}/howlongtobeat-sample.md`, 'utf-8')
|
const actualmd = await fsp.readFile(`${dumpdir}/howlongtobeat-sample.md`, 'utf-8')
|
||||||
expect(actualmd).toMatchSnapshot()
|
expect(actualmd).toMatchSnapshot()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('howlong downloads the thumbnail as ID.jpg into downloaddir', async() => {
|
||||||
|
await howlong({
|
||||||
|
postDir: dumpdir,
|
||||||
|
downloadDir: dumpdir
|
||||||
|
})
|
||||||
|
|
||||||
|
const actualmd = await fsp.readFile(`${dumpdir}/11228.jpg`, 'utf-8')
|
||||||
|
expect(actualmd).not.toBeUndefined()
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in New Issue