generateDiffImagesPuppeteerLocalhost.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. Render each OSMD sample, grab the generated images, and
  3. dump them into a local directory as PNG files.
  4. inspired by Vexflow's generate_png_images and vexflow-tests.js
  5. This is meant to be used with the visual regression test system in
  6. `tools/visual_regression.sh`. (TODO)
  7. */
  8. // function sleep(ms) {
  9. // return new Promise((resolve) => {
  10. // setTimeout(resolve, ms);
  11. // });
  12. // }
  13. // main function
  14. async function init() {
  15. console.log("init");
  16. const fs = require('fs');
  17. const [scriptDir, imageDir] = process.argv.slice(2, 4);
  18. const sampleDir = './test/data/';
  19. // Create the image directory if it doesn't exist.
  20. fs.mkdirSync(imageDir, { recursive: true });
  21. const samples = {
  22. "Clementi, M. - Sonatina Op.36 No.1 Pt.1": "MuzioClementi_SonatinaOpus36No1_Part1.xml",
  23. //"Hello World": "HelloWorld.xml",
  24. // "Beethoven, L.v. - An die ferne Geliebte": "Beethoven_AnDieFerneGeliebte.xml",
  25. // "Clementi, M. - Sonatina Op.36 No.1 Pt.2": "MuzioClementi_SonatinaOpus36No1_Part2.xml",
  26. }
  27. const sampleKeys = Object.keys(samples);
  28. const sampleValues = Object.values(samples);
  29. const puppeteer = require('puppeteer');
  30. const browser = await puppeteer.launch({headless: true});
  31. const page = await browser.newPage(); // TODO set width/height
  32. const sampleFileName = sampleKeys[0]; // TODO for loop over samples / take filenames from script arguments
  33. const sampleParameter = `&url=${sampleFileName}&endUrl`;
  34. console.log("puppeteer: going to url");
  35. await page.goto("http://localhost:8000/?showHeader=0&debugControls=0&backendType=canvas&pageBackgroundColor=FFFFFF" + sampleParameter, {waitUntil: 'networkidle2'});
  36. console.log("goto done");
  37. {
  38. // fix navigation error
  39. var response_event_occurred = false;
  40. var response_handler = function(event){ response_event_occurred = true; };
  41. var response_watcher = new Promise(function(resolve, reject){
  42. setTimeout(function(){
  43. if (!response_event_occurred) {
  44. resolve(true);
  45. } else {
  46. setTimeout(function(){ resolve(true); }, 30000);
  47. }
  48. page.removeListener('response', response_handler);
  49. }, 500);
  50. });
  51. page.on('response', response_handler);
  52. var navigation_watcher = page.waitForNavigation();
  53. await Promise.race([response_watcher, navigation_watcher]);
  54. }
  55. console.log("navigation race done");
  56. const getDataUrl = async () => {
  57. return await page.evaluate(async () => {
  58. return await new Promise(resolve => {
  59. const canvasImage = document.getElementById("osmdCanvasVexFlowBackendCanvas");
  60. var imageData = canvasImage.toDataURL();
  61. // TODO fetch multiple pages from multiple OSMD backends
  62. resolve(imageData);
  63. })
  64. })
  65. }
  66. const dataUrl = await getDataUrl();
  67. //console.log("dataUrl: " + dataUrl);
  68. const imageData = dataUrl.split(';base64,').pop();
  69. const imageBuffer = Buffer.from(imageData, 'base64');
  70. var fileName = `${imageDir}/${sampleFileName}.png`;
  71. console.log("got image data, saving to: " + fileName);
  72. fs.writeFileSync(fileName, imageBuffer, { encoding: 'base64' });
  73. //const html = await page.content();
  74. //console.log("page content: " + html);
  75. browser.close();
  76. console.log("puppeteer browser closed. exiting.");
  77. return;
  78. }
  79. // function start() {
  80. // // await (async () => {
  81. // // init();
  82. // // });
  83. // (async function(){
  84. // await init();
  85. // // more code here or the await is useless
  86. // })();
  87. // }
  88. function resizeCanvas(elementId, width, height) {
  89. $('#' + elementId).width(width);
  90. $('#' + elementId).attr('width', width);
  91. $('#' + elementId).attr('height', height);
  92. }
  93. init();