diff --git a/netease_music/index.js b/netease_music/index.js index 0ad7cf0..cee2cfe 100644 --- a/netease_music/index.js +++ b/netease_music/index.js @@ -21,7 +21,7 @@ const artistInfoUtils = require('./src/getInfo/artistInfoUtils'); const albumInfoUtils = require('./src/getInfo/albumInfoUtils'); const lyricInfoUtils = require('./src/getInfo/lyricInfoUtils'); const commentUtils = require('./src/getInfo/commentUtils'); -// const playlistUtils = require('./src/getInfo/playlistUtils'); +const playlistUtils = require('./src/getInfo/playlistUtils'); /** * 测试 @@ -34,12 +34,14 @@ async function test() { // let res = await albumInfoUtils.fetch({ albumId: "9156", debug: true }); // let res = await artistInfoUtils.fetch({ artistId: "12023508" }); // let res = await songInfoUtils.fetch({ songId: "437608327" }); - // let res = await playlistUtils.fetch({ songId: "2320041657", debug: true }); + // let res = await playlistUtils.fetch({ playlistId: "4980157066", debug: true }); // let res = await albumInfoUtils.getFromDatabase({ albumId: "9156" }); // let res = await artistInfoUtils.getFromDatabase({ artistId: "12023508" }); // let res = await songInfoUtils.getFromDatabase({ songId: "437608327" }); + let res = await dbUtils.query('INSERT IGNORE INTO song (`song_id`, `title`, `image`, `pub_date`) VALUES ?', + [[[100, '4', '3', '4'], [200, '23', '4', '5']]]); console.log(res); } diff --git a/netease_music/src/getInfo/albumInfoUtils.js b/netease_music/src/getInfo/albumInfoUtils.js index 1ddcb17..107b51a 100644 --- a/netease_music/src/getInfo/albumInfoUtils.js +++ b/netease_music/src/getInfo/albumInfoUtils.js @@ -49,7 +49,7 @@ async function fetchAll({ args = {}, isUpdate = false }) { for (let i = 0; i < albumIds.length; i++) { await global.checkIsExit(); const albumId = albumIds[i]; - console.log(`${i + 1}/${albumIds.length} | album: ${albumId} | ${args.min ?? "?"}-${args.max ?? "?"}`); + console.log(`${i + 1}/${albumIds.length} | album: ${albumId} | ${args.min || "?"}-${args.max || "?"}`); try { await fetch({ albumId: albumId, update: isUpdate }); } catch (err) { diff --git a/netease_music/src/getInfo/artistInfoUtils.js b/netease_music/src/getInfo/artistInfoUtils.js index bf7a191..a3e3582 100644 --- a/netease_music/src/getInfo/artistInfoUtils.js +++ b/netease_music/src/getInfo/artistInfoUtils.js @@ -40,7 +40,7 @@ async function fetchAll({ args = {} }) { for (let i = 0; i < artistIds.length; i++) { await global.checkIsExit(); const artistId = artistIds[i]; - console.log(`${i + 1}/${artistIds.length} | artist: ${artistId} | ${args.min ?? "?"}-${args.max ?? "?"}`); + console.log(`${i + 1}/${artistIds.length} | artist: ${artistId} | ${args.min || "?"}-${args.max || "?"}`); try { await fetch({ artistId: artistId }); } catch (err) { diff --git a/netease_music/src/getInfo/commentUtils.js b/netease_music/src/getInfo/commentUtils.js index 4717b27..eb53692 100644 --- a/netease_music/src/getInfo/commentUtils.js +++ b/netease_music/src/getInfo/commentUtils.js @@ -37,7 +37,7 @@ async function fetchAll({ args = {} }) { for (let i = 0; i < songIds.length; i++) { await global.checkIsExit(); const songId = songIds[i]; - console.log(`${i + 1}/${songIds.length} | comment: ${songId} | ${args.min ?? "?"}-${args.max ?? "?"}`); + console.log(`${i + 1}/${songIds.length} | comment: ${songId} | ${args.min || "?"}-${args.max || "?"}`); try { await fetch({ songId: songId }); } catch (err) { diff --git a/netease_music/src/getInfo/lyricInfoUtils.js b/netease_music/src/getInfo/lyricInfoUtils.js index 4a27d02..5601a5a 100644 --- a/netease_music/src/getInfo/lyricInfoUtils.js +++ b/netease_music/src/getInfo/lyricInfoUtils.js @@ -25,7 +25,7 @@ async function fetchAll({ args = {} }) { 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 ?? "?"}`); + console.log(`${i + 1}/${songIds.length} | lyric: ${songId} | ${args.min || "?"}-${args.max || "?"}`); try { await fetch({ songId: songId }); } catch (err) { diff --git a/netease_music/src/getInfo/playlistUtils.js b/netease_music/src/getInfo/playlistUtils.js index d092424..54bc035 100644 --- a/netease_music/src/getInfo/playlistUtils.js +++ b/netease_music/src/getInfo/playlistUtils.js @@ -9,7 +9,7 @@ const dbUtils = global.dbUtils; // refer: // https://neteasecloudmusicapi-docs.4everland.app/ // https://github.com/Binaryify/NeteaseCloudMusicApi -const { playlist_catlist, playlist_hot } = require('NeteaseCloudMusicApi'); +const { playlist_catlist, playlist_hot, playlist_detail, playlist_track_all, song_detail } = require('NeteaseCloudMusicApi'); // // 从数据库中查出还缺少的歌词,并进行爬取 // async function fetchAll() { @@ -36,7 +36,20 @@ async function fetch({ playlistId, debug = false }) { // https://neteasecloudmusicapi-docs.4everland.app/#/?id=%e6%ad%8c%e5%8d%95%e5%88%86%e7%b1%bb var queryParams = {}; try { - var playlistResult = await playlist_catlist(queryParams); + // 获取歌单分类 + // var playlistResult = await playlist_catlist(queryParams); + // var playlistResult = await playlist_hot(queryParams); + // var playlistResult = await playlist_detail({ + // id: playlistId, + // }); + var playlistResult = await song_detail({ + // ids: ["536623501", "536623501"].join(','), + }); + // var playlistResult = await playlist_track_all({ + // id: playlistId, + // limit: 10, + // offset: 0, + // }); fs.writeFileSync(path.join(__dirname, "../../temp", `playlist-${playlistId}.json`), JSON.stringify(playlistResult)); } catch (errors) { console.error(errors); diff --git a/netease_music/src/getInfo/songInfoUtils.js b/netease_music/src/getInfo/songInfoUtils.js index 4096618..33caae1 100644 --- a/netease_music/src/getInfo/songInfoUtils.js +++ b/netease_music/src/getInfo/songInfoUtils.js @@ -6,23 +6,6 @@ const sleepUtils = require('../../../utils/sleepUtils'); const dbUtils = global.dbUtils; -// 从数据库中查询 -async function getFromDatabase({ songId }) { - // 查询出专辑 - let infoResultSet = await dbUtils.query('SELECT * FROM song WHERE song_id = ?', [songId]); - if (infoResultSet.length == 0) return {}; - - // 查出专辑与歌曲对应关系 - let albumRelationResultSet = await dbUtils.query('SELECT * FROM song_album_relation WHERE song_id = ?', [songId]); - let artistRelationResultSet = await dbUtils.query('SELECT * FROM song_artist_relation WHERE song_id = ?', [songId]); - - // 拼装 - let songInfo = JSON.parse(JSON.stringify(infoResultSet[0])); - songInfo.albumIds = albumRelationResultSet.map(album => album.album_id); - songInfo.artistIds = artistRelationResultSet.map(artist => artist.artist_id); - return songInfo; -} - // 从数据库中查出还缺少的歌曲,并进行爬取 async function fetchAll({ args = {} }) { console.log("start fetching songs ..."); @@ -41,12 +24,18 @@ async function fetchAll({ args = {} }) { var songIds = await dbUtils.query(sql, []); songIds = songIds.map(item => item.song_id); - for (let i = 0; i < songIds.length; i++) { + + // 0 - 100, 200 - 399, 400 - ..., ... - songIds.length-1 + // 0 1 2 count-1 + var step = 270; + var total = songIds.length; + var count = Math.ceil(total / step); + for (let i = 0; i < count; i++) { await global.checkIsExit(); - const songId = songIds[i]; - console.log(`${i + 1}/${songIds.length} | song: ${songId} | ${args.min ?? "?"}-${args.max ?? "?"}`); + var subArray = songIds.slice(i * step, (i + 1) * step); + console.log(`${i + 1}/${count} | song: ${subArray[0]}-${subArray.slice(-1)[0]} | ${args.min || "?"}-${args.max || "?"}`); try { - await fetch({ songId: songId }); + await fetch({ songIdArray: subArray }); } catch (err) { console.error(err); } @@ -55,55 +44,26 @@ async function fetchAll({ args = {} }) { } // 获取音乐详情 -async function fetch({ songId, debug = false }) { +async function fetch({ songIdArray, debug = false }) { let result = await dbUtils.query('SELECT count(*) as count FROM song WHERE song_id = ?', [songId]); if (result[0].count > 0 && !debug) { console.log(`数据库中已有数据,跳过 songId: ${songId}`); return; } - let url = `https://music.163.com/song?id=${songId}`; + // https://neteasecloudmusicapi-docs.4everland.app/#/?id=%e8%8e%b7%e5%8f%96%e6%ad%8c%e6%9b%b2%e8%af%a6%e6%83%85 try { - // var html = fs.readFileSync(path.join(__dirname, "../../temp", `song-${songId}.html`), 'utf8'); - var html = await requestUtils.getApiResult(url); - // fs.writeFileSync(path.join(__dirname, "../../temp", `song-${songId}.html`), html); + // 每一次大概可以取到270条以上 + var songResult = await song_detail({ + ids: ["64956", "64956"].join(','), + }); + fs.writeFileSync(path.join(__dirname, "../../temp", `song-${playlistId}.json`), JSON.stringify(playlistResult)); } catch (errors) { console.error(errors); return; } - if (html.includes(`

很抱歉,你要查找的网页找不到

`)) { - let deleteResult1 = await dbUtils.query('DELETE FROM song_album_relation WHERE song_id = ?', [songId]); - let deleteResult2 = await dbUtils.query('DELETE FROM song_artist_relation WHERE song_id = ?', [songId]); - console.log(`song: ${songId} 不存在,从song_album_relation, song_artist_relation表中删除. affectedRows: ${deleteResult1.affectedRows}, ${deleteResult2.affectedRows}`); - return; - } - - // 正则匹配 - let regExResult = /\