hexo-bangumi-gallery
Version:
A Hexo plugin, show your anime list in your blog.
103 lines (88 loc) • 3.46 kB
JavaScript
const packageInfo = require('../package.json')
const axios = require('axios')
const logger = require('../utils/logger')
const formatter = require('../utils/data-formatter')
const SUBJECT_TYPE_KEY = ['', 'book', 'bangumi', 'music', 'game']
const COLLECTION_TYPE = [1, 2, 3]
const COLLECTION_TYPE_KEY = ['', 'plan', 'completed', 'doing']
const BASE_URL = 'https://api.bgm.tv'
const LIMIT = 100
const USER_AGENT = `ChiyukiRuon/hexo-bangumi-gallery/${packageInfo.version} (Web) (https://github.com/ChiyukiRuon/hexo-bangumi-gallery)`
/**
* 获取 bgm.tv 数据
*
* @param {string} userId 用户 ID
* @param {1|2|3|4} subjectType 条目类型
* @param {Object} config Hexo 配置
* @return void
* @author ChiyukiRuon
* */
async function getBgmData (userId, subjectType, config) {
logger.info(`Fetching ${SUBJECT_TYPE_KEY[subjectType]} info from bgm.tv for user ${userId}`)
let plan = [] // COLLECTION_TYPE = 1
let completed = [] // COLLECTION_TYPE = 2
let doing = [] // COLLECTION_TYPE = 3
if (!userId || userId === '') {
logger.error('User ID is empty')
return
}
if (subjectType < 1 || subjectType > 4) {
logger.error('Subject Type is invalid')
return
}
for (const type of COLLECTION_TYPE) {
logger.info(`Fetching ${SUBJECT_TYPE_KEY[subjectType]}: ${COLLECTION_TYPE_KEY[type]}`)
let totalPage = 0
let currentPage = 0
do {
try {
const res = await axios.get(`${BASE_URL}/v0/users/${userId}/collections?subject_type=${subjectType}&type=${type}&limit=${LIMIT}&offset=${currentPage * LIMIT}`, {
headers: {
'User-Agent': USER_AGENT,
'Content-Type': 'application/json'
}
})
if (totalPage === 0) totalPage = Math.ceil(res.data.total / LIMIT)
switch (type) {
case 1:
plan = plan.concat(res.data.data)
break
case 2:
completed = completed.concat(res.data.data)
break
case 3:
doing = doing.concat(res.data.data)
break
}
currentPage++
} catch (err) {
logger.error(`Error fetching ${SUBJECT_TYPE_KEY[subjectType]} info from bgm.tv`)
logger.error(err)
break
}
} while (currentPage < totalPage)
}
switch (subjectType) {
case 1:
formatter.formatBookData({ plan, completed, doing}, 'bgm', config)
break
case 2:
formatter.formatBangumiData({ plan, completed, doing }, 'bgm', config)
break
case 3:
formatter.formatMusicData({ plan, completed, doing }, config)
break
case 4:
formatter.formatGameData({ plan, completed, doing }, config)
break
default:
logger.error('Invalid bangumi type')
break
}
logger.info(`Fetch ${SUBJECT_TYPE_KEY[subjectType]} info successfully.`)
logger.info(`Total(${SUBJECT_TYPE_KEY[subjectType]}): ${plan.length + completed.length + doing.length}. Plan: ${plan.length}, completed: ${completed.length}, doing: ${doing.length}`)
}
module.exports = {
getBgmData
}