voicemail-files.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. const stripAnsi = require('strip-ansi')
  2. const iPhoneBackup = require('../util/iphone_backup.js').iPhoneBackup
  3. const normalizeCols = require('../util/normalize.js')
  4. const path = require('path')
  5. const fs = require('fs-extra')
  6. module.exports.name = 'voicemail-files'
  7. module.exports.description = 'List all or extract voicemail files (iOS 10+)'
  8. module.exports.func = function (program, base) {
  9. if (!program.backup) {
  10. console.log('use -b or --backup <id> to specify backup.')
  11. process.exit(1)
  12. }
  13. // Grab the backup
  14. var backup = iPhoneBackup.fromID(program.backup, base)
  15. backup.getVoicemailFileList()
  16. .then((list) => {
  17. if (program.dump) {
  18. console.log(JSON.stringify(list, null, 4))
  19. return
  20. }
  21. if (program.extract) {
  22. for (var item of list) {
  23. try {
  24. var outDir = path.join(program.extract, path.basename(item.relativePath))
  25. fs.ensureDirSync(path.dirname(outDir))
  26. fs.createReadStream(backup.getFileName(item.fileID)).pipe(fs.createWriteStream(outDir))
  27. item.output_dir = outDir
  28. } catch (e) {
  29. console.log(`Couldn't Export: ${item.relativePath}`, e)
  30. }
  31. }
  32. }
  33. var items = list.map(el => [
  34. el.fileID + '',
  35. el.relativePath,
  36. el.output_dir || '<not exported>'
  37. ])
  38. items = [['ID', 'Path', 'Exported Path'], ['-', '-', '-'], ...items]
  39. items = normalizeCols(items).map(el => el.join(' | ').replace(/\n/g, '')).join('\n')
  40. if (!program.color) { items = stripAnsi(items) }
  41. console.log(items)
  42. })
  43. .catch((e) => {
  44. console.log('[!] Encountered an Error:', e)
  45. })
  46. }