You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

99 lines
2.4 KiB

  1. const jsmediatags = require('jsmediatags');
  2. const fs = require('fs');
  3. const INPUT = './public/audio/';
  4. const OUTPUT = 'src/data.json';
  5. const data = {"albums" : []};
  6. const promises = [];
  7. try {
  8. if (fs.existsSync(INPUT)) {
  9. //file exists
  10. }
  11. else {
  12. console.log("\n============== Weband Error ====================\n\n");
  13. console.log("Audio files are missing. Please run first : \n\n$ ./scripts/weband-init.sh <input_directory> \n");
  14. console.log("\n================================================\n\n");
  15. process.exit(1);
  16. }
  17. } catch(err) {
  18. console.log(err);
  19. process.exit(1);
  20. }
  21. function is_dir(path) {
  22. try {
  23. var stat = fs.lstatSync(path);
  24. return stat.isDirectory();
  25. } catch (e) {
  26. // lstatSync throws an error if path doesn't exist
  27. return false;
  28. }
  29. }
  30. function id3ToJSON(path){
  31. fs.readdirSync(path).forEach(file => {
  32. let isDir = is_dir(path + file);
  33. if(isDir)
  34. id3ToJSON(path + file + '/');
  35. else {
  36. let filePath = path + file;
  37. promises.push(new Promise((resolve, reject) => {
  38. new jsmediatags.Reader(filePath)
  39. .read({
  40. onSuccess: (tag) => {
  41. var tags = tag.tags;
  42. if(!data.artist)
  43. data.artist = tags.artist;
  44. let album = getAlbum(tags.album);
  45. if(!album){
  46. album = {"title": tags.album, "tracks": [], "year": tags.year}
  47. data.albums.push(album);
  48. }
  49. let track = {"title": tags.title, "file" : filePath.replace(INPUT,'audio/')};
  50. album.tracks.push(track);
  51. resolve(tag);
  52. },
  53. onError: (error) => {
  54. console.log('Error');
  55. console.log(error);
  56. reject(error);
  57. }
  58. });
  59. }));
  60. }
  61. });
  62. }
  63. function getAlbum(albumTitle){
  64. for(let i = 0 ; i < data.albums.length; i++){
  65. if(data.albums[i].title === albumTitle)
  66. return data.albums[i];
  67. }
  68. return null;
  69. }
  70. id3ToJSON(INPUT);
  71. Promise.all(promises).then((values) => {
  72. var jsonContent = JSON.stringify(data, null, 2);
  73. console.log(jsonContent);
  74. fs.writeFile(OUTPUT, jsonContent, 'utf8', function (err) {
  75. if (err) {
  76. console.log("An error occured while writing JSON Object to File.");
  77. return console.log(err);
  78. }
  79. console.log("JSON file has been saved : " + OUTPUT);
  80. });
  81. });