multi_song_upload.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const { cloud, login_cellphone } = require('../main')
  2. const fs = require('fs')
  3. const path = require('path')
  4. const yargs = require('yargs')
  5. const MUSIC_FILE_EXTENSIONS = new Set(['.mp3', '.flac'])
  6. function getAllMusicFiles(dir, arrayOfFiles) {
  7. arrayOfFiles = arrayOfFiles || []
  8. fs.readdirSync(dir).forEach((file) => {
  9. let fullPath = path.join(dir, file)
  10. if (fs.lstatSync(fullPath).isDirectory()) {
  11. getAllMusicFiles(fullPath, arrayOfFiles)
  12. } else {
  13. if (MUSIC_FILE_EXTENSIONS.has(path.extname(fullPath))) {
  14. arrayOfFiles.push(fullPath)
  15. }
  16. }
  17. })
  18. return arrayOfFiles
  19. }
  20. async function uploadArrayOfFile(token, arrayOfFiles) {
  21. let failedFiles = []
  22. let failed = 0
  23. const fileCount = arrayOfFiles.length
  24. for (let k in arrayOfFiles) {
  25. const file = arrayOfFiles[k]
  26. try {
  27. await cloud({
  28. songFile: {
  29. name: path.basename(file),
  30. data: fs.readFileSync(file),
  31. },
  32. cookie: token.body.cookie,
  33. })
  34. } catch (error) {
  35. console.log(error)
  36. failed += 1
  37. failedFiles.push(file)
  38. }
  39. console.log(`Uploaded ${k + 1}/${fileCount} songs`)
  40. }
  41. return { failedFiles, failed }
  42. }
  43. function getParsedArgs() {
  44. return yargs(process.argv.slice(2))
  45. .option('country_code', {
  46. default: '86',
  47. describe: 'The country code of your phone number',
  48. type: 'string',
  49. })
  50. .option('phone_number', {
  51. demandOption: true,
  52. describe: 'Your phone number',
  53. type: 'string',
  54. })
  55. .option('password', {
  56. demandOption: true,
  57. describe: 'Your password',
  58. type: 'string',
  59. })
  60. .option('file', {
  61. describe: 'The absolute path to the single music file to be uploaded',
  62. type: 'string',
  63. })
  64. .option('dir', {
  65. describe: 'The absolute to the directory of music files to be uploaded',
  66. type: 'string',
  67. })
  68. .conflicts('file', 'dir')
  69. .help()
  70. .alias('help', 'h').argv
  71. }
  72. async function main() {
  73. const args = getParsedArgs()
  74. const token = await login_cellphone({
  75. countrycode: args.country_code,
  76. phone: args.phone_number,
  77. password: args.password,
  78. })
  79. const files = args.file ? [args.file] : getAllMusicFiles(args.dir)
  80. const fileCount = files.length
  81. console.log(`Found ${fileCount} files, uploading...`)
  82. let res = await uploadArrayOfFile(token, files)
  83. if (res.failed) {
  84. console.log(`Failed to upload ${res.failed} songs, retrying...`)
  85. res = await uploadArrayOfFile(token, res.failedFiles)
  86. }
  87. console.log(`Uploaded ${fileCount - res.failed} songs`)
  88. console.log(
  89. `Failed to upload ${res.failed} songs, you can reupload the files below`,
  90. )
  91. for (let k in res.failedFiles) {
  92. console.log(res.failedFiles[k])
  93. }
  94. }
  95. main()