const fs = require('fs'); const path = require('path'); const requestUtils = require('../../../utils/requestUtils'); const sleepUtils = require('../../../utils/sleepUtils'); const dbUtils = global.dbUtils; // 从数据库中查出还缺少的歌词,并进行爬取 async function fetchAll({ args = {} }) { console.log("start fetching lyrics ..."); let whereClause = [ args.min ? `song_id > ${args.min}` : '1=1', args.max ? `song_id <= ${args.max}` : '1=1', ].join(' AND '); var sql = ` SELECT song_id FROM song WHERE ${whereClause} AND song_id NOT IN ( SELECT song_id FROM lyric ) ${args.limit ? `LIMIT ${args.limit}` : ''} `; console.log(sql); var songIds = await dbUtils.query(sql, []); songIds = songIds.map(song => song.song_id); for (let i = 0; i < songIds.length; i++) { await global.checkIsExit(); const songId = songIds[i]; console.log(`${i + 1}/${songIds.length} | lyric: ${songId} | ${args.min || "?"}-${args.max || "?"}`); try { await fetch({ songId: songId }); } catch (err) { console.error(err); } await sleepUtils.sleep(global.sleepTime); } } // 获取歌词详情 async function fetch({ songId, debug = false }) { let result = await dbUtils.query('SELECT count(*) as count FROM lyric WHERE song_id = ?', [songId]); if (result[0].count > 0 && !debug) { // 这里暂时跳过,后期可能要考虑歌词version更新的问题 console.log(`数据库中已有数据,跳过 songId: ${songId}`); return; } var url = `https://music.163.com/api/song/lyric?id=${songId}&lv=1`; // &kv=1&tv=-1 try { // var json = fs.readFileSync(path.join(__dirname, "../../temp", `lyric-${songId}.json`), 'utf8'); var json = await requestUtils.getApiResult(url); // fs.writeFileSync(path.join(__dirname, "../../temp", `lyric-${songId}.json`), json); } catch (errors) { console.error(errors); return; } try { var lyric = JSON.parse(json).lrc; // { version: xx, lyric: 'xxx' } } catch (error) { console.error(error); return; } if (typeof lyric == "undefined") { // 这首歌爬song的时候还在,但是现在不在了 // 这里数据丢了不要紧,所以不加await dbUtils.query('INSERT IGNORE INTO lyric SET ?', { song_id: songId, lyric: '', version: -1, }); return; } let lyricInfo = { songId: songId, lyric: lyric.lyric, version: lyric.version, }; // console.log("lyricInfo", lyricInfo); // 这里数据丢了不要紧,所以不加await dbUtils.query('INSERT IGNORE INTO lyric SET ?', { song_id: lyricInfo.songId, lyric: lyricInfo.lyric, version: lyricInfo.version, }); return lyricInfo; } module.exports = { fetch: fetch, fetchAll: fetchAll, }