index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233
  1. // node --require regenerator-runtime/runtime --require ./babel-local --require isomorphic-fetch index.js
  2. import {createWriteStream, promises} from 'fs';
  3. const {access, rename} = promises;
  4. async function work () {
  5. let rootUri = 'https://data.gov.sk/api/3/action/package_search?fq=%2btitle:Vestn%C3%ADk%20verejn%C3%A9ho%20obstar%C3%A1vania*&rows=9999&sort=metadata_created_date%20asc';
  6. const datasetsRaw = await fetch(rootUri);
  7. const {result: {count, results}} = await datasetsRaw.json();
  8. console.info(`Datasets: ${count}`);
  9. for (let {title, num_resources, resources} of results) {
  10. console.info(`Fetching: ${title}, ${num_resources} files`);
  11. const saves = [];
  12. for (let {name, description, url} of resources) {
  13. const [, issue, year] = name.match(/(\d+)\/(\d+)/);
  14. const target = `${year}.${issue}.xml`;
  15. if (await access(target).then(() => true, () => false))
  16. continue;
  17. console.info(`File ${year} / ${issue}: ${description}`);
  18. const xmlRaw = await fetch(url);
  19. saves.push((async () => {
  20. const temporary = `${year}.${issue}.xml.download`;
  21. await xmlRaw.body.pipe(createWriteStream(temporary));
  22. await rename(temporary, target);
  23. })());
  24. }
  25. await Promise.all(saves);
  26. }
  27. return results;
  28. }
  29. work().catch(error => console.error(error));