@tricoteuses/senat 0.3.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +55 -0
  2. package/lib/aggregates.d.ts +54 -0
  3. package/lib/aggregates.js +1122 -0
  4. package/lib/aggregates.mjs +802 -0
  5. package/lib/aggregates.ts +947 -0
  6. package/lib/config.d.ts +2 -0
  7. package/lib/config.js +49 -0
  8. package/lib/config.mjs +16 -0
  9. package/lib/config.ts +26 -0
  10. package/lib/databases.d.ts +11 -0
  11. package/lib/databases.js +125 -0
  12. package/lib/databases.mjs +26 -0
  13. package/lib/databases.ts +32 -0
  14. package/lib/datasets.d.ts +28 -0
  15. package/lib/datasets.js +93 -0
  16. package/lib/datasets.mjs +78 -0
  17. package/lib/datasets.ts +118 -0
  18. package/lib/fields.d.ts +10 -0
  19. package/lib/fields.js +68 -0
  20. package/lib/fields.mjs +22 -0
  21. package/lib/fields.ts +29 -0
  22. package/lib/index.d.ts +6 -5
  23. package/lib/index.js +236 -7
  24. package/lib/index.mjs +6 -1
  25. package/lib/index.ts +59 -0
  26. package/lib/inserters.d.ts +6 -2
  27. package/lib/inserters.js +86 -191
  28. package/lib/inserters.mjs +19 -3
  29. package/lib/inserters.ts +545 -0
  30. package/lib/model/ameli.d.ts +4 -0
  31. package/lib/model/ameli.js +167 -0
  32. package/lib/model/ameli.mjs +57 -0
  33. package/lib/model/ameli.ts +86 -0
  34. package/lib/model/debats.d.ts +4 -0
  35. package/lib/model/debats.js +123 -0
  36. package/lib/model/debats.mjs +43 -0
  37. package/lib/model/debats.ts +68 -0
  38. package/lib/model/dosleg.d.ts +29 -0
  39. package/lib/model/dosleg.js +840 -0
  40. package/lib/model/dosleg.mjs +337 -0
  41. package/lib/model/dosleg.ts +558 -0
  42. package/lib/model/index.d.ts +5 -0
  43. package/lib/model/index.js +48 -0
  44. package/lib/model/index.mjs +5 -0
  45. package/lib/model/index.ts +11 -0
  46. package/lib/model/questions.d.ts +2 -0
  47. package/lib/model/questions.js +52 -0
  48. package/lib/model/questions.mjs +8 -0
  49. package/lib/model/questions.ts +14 -0
  50. package/lib/model/sens.d.ts +2 -0
  51. package/lib/model/sens.js +57 -0
  52. package/lib/model/sens.mjs +9 -0
  53. package/lib/model/sens.ts +18 -0
  54. package/lib/model/util.d.ts +1 -0
  55. package/lib/model/util.js +60 -0
  56. package/lib/model/util.mjs +10 -0
  57. package/lib/model/util.ts +16 -0
  58. package/lib/raw_types/ameli.d.ts +416 -410
  59. package/lib/raw_types/ameli.js +26 -144
  60. package/lib/raw_types/ameli.ts +601 -0
  61. package/lib/raw_types/debats.d.ts +82 -80
  62. package/lib/raw_types/debats.js +8 -42
  63. package/lib/raw_types/debats.ts +145 -0
  64. package/lib/raw_types/dosleg.d.ts +936 -920
  65. package/lib/raw_types/dosleg.js +5 -345
  66. package/lib/raw_types/dosleg.ts +2193 -0
  67. package/lib/raw_types/questions.d.ts +226 -2
  68. package/lib/raw_types/questions.js +18 -5
  69. package/lib/raw_types/questions.mjs +1 -8
  70. package/lib/raw_types/questions.ts +249 -0
  71. package/lib/raw_types/sens.d.ts +1180 -1176
  72. package/lib/raw_types/sens.js +3 -397
  73. package/lib/raw_types/sens.ts +2907 -0
  74. package/lib/scripts/convert_data.d.ts +1 -0
  75. package/lib/scripts/convert_data.js +284 -0
  76. package/lib/scripts/convert_data.mjs +146 -0
  77. package/lib/scripts/convert_data.ts +182 -0
  78. package/lib/scripts/fix_db.d.ts +1 -0
  79. package/lib/scripts/fix_db.js +144 -0
  80. package/lib/scripts/fix_db.mjs +64 -0
  81. package/lib/scripts/fix_db.ts +75 -0
  82. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  83. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  84. package/lib/scripts/retrieve_open_data.d.ts +1 -0
  85. package/lib/scripts/retrieve_open_data.js +371 -0
  86. package/lib/scripts/retrieve_open_data.mjs +218 -0
  87. package/lib/scripts/retrieve_open_data.ts +258 -0
  88. package/lib/scripts/retrieve_senateurs_photos.d.ts +1 -0
  89. package/lib/scripts/retrieve_senateurs_photos.js +268 -0
  90. package/lib/scripts/retrieve_senateurs_photos.mjs +164 -0
  91. package/lib/scripts/retrieve_senateurs_photos.ts +200 -0
  92. package/lib/scripts/retrieve_textes.d.ts +1 -0
  93. package/lib/scripts/retrieve_textes.js +179 -0
  94. package/lib/scripts/retrieve_textes.mjs +77 -0
  95. package/lib/scripts/retrieve_textes.ts +95 -0
  96. package/lib/strings.d.ts +1 -0
  97. package/lib/strings.js +49 -0
  98. package/lib/strings.mjs +18 -0
  99. package/lib/strings.ts +26 -0
  100. package/lib/types/ameli.d.ts +5 -0
  101. package/lib/types/ameli.js +7 -4
  102. package/lib/types/ameli.mjs +13 -1
  103. package/lib/types/ameli.ts +21 -0
  104. package/lib/types/debats.d.ts +2 -0
  105. package/lib/types/debats.js +4 -3
  106. package/lib/types/debats.mjs +2 -1
  107. package/lib/types/debats.ts +6 -0
  108. package/lib/types/dosleg.d.ts +28 -0
  109. package/lib/types/dosleg.js +30 -3
  110. package/lib/types/dosleg.mjs +151 -1
  111. package/lib/types/dosleg.ts +284 -0
  112. package/lib/types/questions.d.ts +2 -0
  113. package/lib/types/questions.js +13 -1
  114. package/lib/types/questions.mjs +1 -1
  115. package/lib/types/questions.ts +3 -0
  116. package/lib/types/sens.d.ts +2 -0
  117. package/lib/types/sens.js +4 -3
  118. package/lib/types/sens.mjs +23 -1
  119. package/lib/types/sens.ts +36 -0
  120. package/lib/typings/windows-1252.d.js +2 -0
  121. package/lib/typings/windows-1252.d.mjs +2 -0
  122. package/lib/typings/windows-1252.d.ts +11 -0
  123. package/lib/validators/config.d.ts +1 -0
  124. package/lib/validators/config.js +121 -0
  125. package/lib/validators/config.mjs +54 -0
  126. package/lib/validators/config.ts +79 -0
  127. package/lib/validators/senat.d.ts +0 -0
  128. package/lib/validators/senat.js +28 -0
  129. package/lib/validators/senat.mjs +24 -0
  130. package/lib/validators/senat.ts +26 -0
  131. package/package.json +35 -4
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol.js");
4
+ require("core-js/modules/es.symbol.description.js");
5
+ require("core-js/modules/es.symbol.async-iterator.js");
6
+ require("core-js/modules/es.symbol.iterator.js");
7
+ require("core-js/modules/es.symbol.to-string-tag.js");
8
+ require("core-js/modules/es.array.for-each.js");
9
+ require("core-js/modules/es.array.from.js");
10
+ require("core-js/modules/es.array.is-array.js");
11
+ require("core-js/modules/es.array.reverse.js");
12
+ require("core-js/modules/es.date.to-string.js");
13
+ require("core-js/modules/es.function.name.js");
14
+ require("core-js/modules/es.json.to-string-tag.js");
15
+ require("core-js/modules/es.math.to-string-tag.js");
16
+ require("core-js/modules/es.object.create.js");
17
+ require("core-js/modules/es.object.define-property.js");
18
+ require("core-js/modules/es.object.get-prototype-of.js");
19
+ require("core-js/modules/es.object.set-prototype-of.js");
20
+ require("core-js/modules/es.regexp.exec.js");
21
+ require("core-js/modules/es.regexp.to-string.js");
22
+ require("core-js/modules/es.string.iterator.js");
23
+ require("core-js/modules/web.dom-collections.for-each.js");
24
+ require("core-js/modules/es.array.concat.js");
25
+ require("core-js/modules/es.array.iterator.js");
26
+ require("core-js/modules/es.array.join.js");
27
+ require("core-js/modules/es.array.map.js");
28
+ require("core-js/modules/es.array.slice.js");
29
+ require("core-js/modules/es.date.to-json.js");
30
+ require("core-js/modules/es.object.to-string.js");
31
+ require("core-js/modules/es.promise.js");
32
+ require("core-js/modules/web.dom-collections.iterator.js");
33
+ var _assert = _interopRequireDefault(require("assert"));
34
+ var _child_process = require("child_process");
35
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
36
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
37
+ var _path = _interopRequireDefault(require("path"));
38
+ var _sens = require("../types/sens");
39
+ var _databases = require("../databases");
40
+ var _fields = require("../fields");
41
+ var _strings = require("../strings");
42
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
43
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
44
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
45
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
46
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
47
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
48
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
49
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
50
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
51
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
52
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
53
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } // import fetch from "node-fetch"
54
+ // import stream from "stream"
55
+ // import util from "util"
56
+ var optionsDefinitions = [{
57
+ alias: "f",
58
+ help: "fetch sénateurs' pictures instead of retrieving them from files",
59
+ name: "fetch",
60
+ type: Boolean
61
+ }, {
62
+ alias: "s",
63
+ help: "don't log anything",
64
+ name: "silent",
65
+ type: Boolean
66
+ }, {
67
+ defaultOption: true,
68
+ help: "directory containing Sénat open data files",
69
+ name: "dataDir",
70
+ type: String
71
+ }];
72
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions);
73
+ // const pipeline = util.promisify(stream.pipeline)
74
+ function retrievePhotosSenateurs() {
75
+ return _retrievePhotosSenateurs.apply(this, arguments);
76
+ }
77
+ function _retrievePhotosSenateurs() {
78
+ _retrievePhotosSenateurs = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
79
+ var dataDir, db, sens, photosDir, missingPhotoFilePath, _iterator, _step, sen, photoStem, photoFilename, photoFilePath, photoTempFilename, photoTempFilePath, urlPhoto, _iterator2, _step2, _sen2, _photoStem2, _photoFilename2, _photoFilePath, photoBySenmat, rowsFilenames, senIndex, rowIndex, row, photosFilenames, _iterator3, _step3, _step3$value, columnIndex, _sen, _photoStem, _photoFilename, rowFilename, _i, _rowsFilenames, _rowFilename, jsonFilePath;
80
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
81
+ while (1) switch (_context.prev = _context.next) {
82
+ case 0:
83
+ dataDir = options.dataDir;
84
+ (0, _assert["default"])(dataDir, "Missing argument: data directory");
85
+ _context.next = 4;
86
+ return (0, _databases.checkDatabase)("sens");
87
+ case 4:
88
+ db = _context.sent;
89
+ _context.next = 7;
90
+ return db.any("\n SELECT *\n FROM sen\n WHERE etasencod = 'ACTIF'\n ");
91
+ case 7:
92
+ sens = _context.sent.map(function (sen) {
93
+ return (0, _fields.parseIntFields)(_sens.senFieldsToParseInt, (0, _fields.trimFieldsRight)(_sens.senFieldsToTrim, sen));
94
+ });
95
+ photosDir = _path["default"].join(dataDir, "photos_senateurs");
96
+ missingPhotoFilePath = _path["default"].resolve(__dirname, "images", "transparent_155x225.jpg"); // Download photos.
97
+ _fsExtra["default"].ensureDirSync(photosDir);
98
+ if (!options.fetch) {
99
+ _context.next = 45;
100
+ break;
101
+ }
102
+ _iterator = _createForOfIteratorHelper(sens);
103
+ _context.prev = 13;
104
+ _iterator.s();
105
+ case 15:
106
+ if ((_step = _iterator.n()).done) {
107
+ _context.next = 37;
108
+ break;
109
+ }
110
+ sen = _step.value;
111
+ photoStem = "".concat((0, _strings.slugify)(sen.sennomuse, "_"), "_").concat((0, _strings.slugify)(sen.senprenomuse, "_")).concat((0, _strings.slugify)(sen.senmat, "_"));
112
+ photoFilename = photoStem + ".jpg";
113
+ photoFilePath = _path["default"].join(photosDir, photoFilename);
114
+ photoTempFilename = photoStem + "_temp.jpg";
115
+ photoTempFilePath = _path["default"].join(photosDir, photoTempFilename);
116
+ urlPhoto = "https://www.senat.fr/senimg/".concat(photoFilename);
117
+ if (!options.silent) {
118
+ console.log("Loading photo ".concat(urlPhoto, " for ").concat(sen.senprenomuse, " ").concat(sen.sennomuse, "\u2026"));
119
+ }
120
+ // Fetch fails with OpenSSL error: dh key too small.
121
+ // (so does "curl").
122
+ // for (let retries = 0; retries < 3; retries++) {
123
+ // const response = await fetch(urlPhoto)
124
+ // if (response.ok) {
125
+ // await pipeline(response.body, fs.createWriteStream(photoTempFilePath))
126
+ // fs.renameSync(photoTempFilePath, photoFilePath)
127
+ // break
128
+ // }
129
+ // if (retries >= 2) {
130
+ // console.warn(`Fetch failed: ${urlPhoto} (${sen.senprenomuse} ${sen.sennomuse})`)
131
+ // console.warn(response.status, response.statusText)
132
+ // console.warn(await response.text())
133
+ // if (fs.existsSync(photoFilePath)) {
134
+ // console.warn(" => Reusing existing image")
135
+ // } else {
136
+ // console.warn(" => Using blank image")
137
+ // fs.copyFileSync(missingPhotoFilePath, photoFilePath)
138
+ // }
139
+ // break
140
+ // }
141
+ // }
142
+ _context.prev = 24;
143
+ (0, _child_process.execSync)("wget --quiet -O ".concat(photoTempFilename, " ").concat(urlPhoto), {
144
+ cwd: photosDir,
145
+ env: process.env,
146
+ encoding: "utf-8"
147
+ // stdio: ["ignore", "ignore", "pipe"],
148
+ });
149
+ _fsExtra["default"].renameSync(photoTempFilePath, photoFilePath);
150
+ _context.next = 35;
151
+ break;
152
+ case 29:
153
+ _context.prev = 29;
154
+ _context.t0 = _context["catch"](24);
155
+ if (!(_typeof(_context.t0) === "object" && _context.t0 && "status" in _context.t0 && _context.t0.status === 8)) {
156
+ _context.next = 34;
157
+ break;
158
+ }
159
+ console.error("Unable to load photo for ".concat(sen.senprenomuse, " ").concat(sen.sennomuse));
160
+ return _context.abrupt("continue", 35);
161
+ case 34:
162
+ throw _context.t0;
163
+ case 35:
164
+ _context.next = 15;
165
+ break;
166
+ case 37:
167
+ _context.next = 42;
168
+ break;
169
+ case 39:
170
+ _context.prev = 39;
171
+ _context.t1 = _context["catch"](13);
172
+ _iterator.e(_context.t1);
173
+ case 42:
174
+ _context.prev = 42;
175
+ _iterator.f();
176
+ return _context.finish(42);
177
+ case 45:
178
+ // Resize photos to 155x225, because some haven't exactly this size.
179
+ _iterator2 = _createForOfIteratorHelper(sens);
180
+ try {
181
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
182
+ _sen2 = _step2.value;
183
+ _photoStem2 = "".concat((0, _strings.slugify)(_sen2.sennomuse, "_"), "_").concat((0, _strings.slugify)(_sen2.senprenomuse, "_")).concat((0, _strings.slugify)(_sen2.senmat, "_"));
184
+ _photoFilename2 = _photoStem2 + ".jpg";
185
+ _photoFilePath = _path["default"].join(photosDir, _photoFilename2);
186
+ if (_fsExtra["default"].existsSync(_photoFilePath)) {
187
+ if (!options.silent) {
188
+ console.log("Resizing photo ".concat(_photoStem2, " for ").concat(_sen2.senprenomuse, " ").concat(_sen2.sennomuse, "\u2026"));
189
+ }
190
+ (0, _child_process.execSync)("gm convert -resize 155x225! ".concat(_photoStem2, ".jpg ").concat(_photoStem2, "_155x225.jpg"), {
191
+ cwd: photosDir
192
+ });
193
+ } else {
194
+ if (!options.silent) {
195
+ console.warn("Missing photo for ".concat(_sen2.senprenomuse, " ").concat(_sen2.sennomuse, ": using blank image"));
196
+ }
197
+ _fsExtra["default"].copyFileSync(missingPhotoFilePath, _path["default"].join(photosDir, "".concat(_photoStem2, "_155x225.jpg")));
198
+ }
199
+ }
200
+
201
+ // Create a mosaic of photos.
202
+ } catch (err) {
203
+ _iterator2.e(err);
204
+ } finally {
205
+ _iterator2.f();
206
+ }
207
+ if (!options.silent) {
208
+ console.log("Creating mosaic of photos…");
209
+ }
210
+ photoBySenmat = {};
211
+ rowsFilenames = [];
212
+ for (senIndex = 0, rowIndex = 0; senIndex < sens.length; senIndex += 25, rowIndex++) {
213
+ row = sens.slice(senIndex, senIndex + 25);
214
+ photosFilenames = [];
215
+ _iterator3 = _createForOfIteratorHelper(row.entries());
216
+ try {
217
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
218
+ _step3$value = _slicedToArray(_step3.value, 2), columnIndex = _step3$value[0], _sen = _step3$value[1];
219
+ _photoStem = "".concat((0, _strings.slugify)(_sen.sennomuse, "_"), "_").concat((0, _strings.slugify)(_sen.senprenomuse, "_")).concat((0, _strings.slugify)(_sen.senmat, "_"));
220
+ _photoFilename = "".concat(_photoStem, "_155x225.jpg");
221
+ photosFilenames.push(_photoFilename);
222
+ photoBySenmat[_sen.senmat] = {
223
+ chemin: "photos_senateurs/".concat(_photoFilename),
224
+ cheminMosaique: "photos_senateurs/senateurs.jpg",
225
+ hauteur: 225,
226
+ largeur: 155,
227
+ xMosaique: columnIndex * 155,
228
+ yMosaique: rowIndex * 225
229
+ };
230
+ }
231
+ } catch (err) {
232
+ _iterator3.e(err);
233
+ } finally {
234
+ _iterator3.f();
235
+ }
236
+ rowFilename = "row-".concat(rowIndex, ".jpg");
237
+ (0, _child_process.execSync)("gm convert ".concat(photosFilenames.join(" "), " +append ").concat(rowFilename), {
238
+ cwd: photosDir
239
+ });
240
+ rowsFilenames.push(rowFilename);
241
+ }
242
+ (0, _child_process.execSync)("gm convert ".concat(rowsFilenames.join(" "), " -append senateurs.jpg"), {
243
+ cwd: photosDir
244
+ });
245
+ for (_i = 0, _rowsFilenames = rowsFilenames; _i < _rowsFilenames.length; _i++) {
246
+ _rowFilename = _rowsFilenames[_i];
247
+ _fsExtra["default"].unlinkSync(_path["default"].join(photosDir, _rowFilename));
248
+ }
249
+ if (!options.silent) {
250
+ console.log("Creating JSON file containing informations on all pictures…");
251
+ }
252
+ jsonFilePath = _path["default"].join(photosDir, "senateurs.json");
253
+ _fsExtra["default"].writeFileSync(jsonFilePath, JSON.stringify(photoBySenmat, null, 2));
254
+ case 56:
255
+ case "end":
256
+ return _context.stop();
257
+ }
258
+ }, _callee, null, [[13, 39, 42, 45], [24, 29]]);
259
+ }));
260
+ return _retrievePhotosSenateurs.apply(this, arguments);
261
+ }
262
+ retrievePhotosSenateurs().then(function () {
263
+ return process.exit(0);
264
+ })["catch"](function (error) {
265
+ console.log(error);
266
+ process.exit(1);
267
+ });
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY2hpbGRfcHJvY2VzcyIsIl9jb21tYW5kTGluZUFyZ3MiLCJfZnNFeHRyYSIsIl9wYXRoIiwiX3NlbnMiLCJfZGF0YWJhc2VzIiwiX2ZpZWxkcyIsIl9zdHJpbmdzIiwiZSIsIl9fZXNNb2R1bGUiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwidCIsInIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImkiLCJTeW1ib2wiLCJhIiwiaXRlcmF0b3IiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImNhbGwiLCJoIiwibCIsImYiLCJzIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJfdHlwZW9mIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJfc2xpY2VkVG9BcnJheSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJBcnJheSIsImlzQXJyYXkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9uIiwiRiIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJmcm9tIiwidGVzdCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIkJvb2xlYW4iLCJkZWZhdWx0T3B0aW9uIiwiU3RyaW5nIiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsInJldHJpZXZlUGhvdG9zU2VuYXRldXJzIiwiX3JldHJpZXZlUGhvdG9zU2VuYXRldXJzIiwiX2NhbGxlZSIsImRhdGFEaXIiLCJkYiIsInNlbnMiLCJwaG90b3NEaXIiLCJtaXNzaW5nUGhvdG9GaWxlUGF0aCIsIl9pdGVyYXRvciIsIl9zdGVwIiwic2VuIiwicGhvdG9TdGVtIiwicGhvdG9GaWxlbmFtZSIsInBob3RvRmlsZVBhdGgiLCJwaG90b1RlbXBGaWxlbmFtZSIsInBob3RvVGVtcEZpbGVQYXRoIiwidXJsUGhvdG8iLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX3NlbjIiLCJfcGhvdG9TdGVtMiIsIl9waG90b0ZpbGVuYW1lMiIsIl9waG90b0ZpbGVQYXRoIiwicGhvdG9CeVNlbm1hdCIsInJvd3NGaWxlbmFtZXMiLCJzZW5JbmRleCIsInJvd0luZGV4Iiwicm93IiwicGhvdG9zRmlsZW5hbWVzIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIl9zdGVwMyR2YWx1ZSIsImNvbHVtbkluZGV4IiwiX3NlbiIsIl9waG90b1N0ZW0iLCJfcGhvdG9GaWxlbmFtZSIsInJvd0ZpbGVuYW1lIiwiX2kiLCJfcm93c0ZpbGVuYW1lcyIsIl9yb3dGaWxlbmFtZSIsImpzb25GaWxlUGF0aCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJhc3NlcnQiLCJjaGVja0RhdGFiYXNlIiwiYW55IiwibWFwIiwicGFyc2VJbnRGaWVsZHMiLCJzZW5GaWVsZHNUb1BhcnNlSW50IiwidHJpbUZpZWxkc1JpZ2h0Iiwic2VuRmllbGRzVG9UcmltIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJmcyIsImVuc3VyZURpclN5bmMiLCJmZXRjaCIsImNvbmNhdCIsInNsdWdpZnkiLCJzZW5ub211c2UiLCJzZW5wcmVub211c2UiLCJzZW5tYXQiLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwiZXhlY1N5bmMiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJyZW5hbWVTeW5jIiwidDAiLCJzdGF0dXMiLCJlcnJvciIsInQxIiwiZXhpc3RzU3luYyIsIndhcm4iLCJjb3B5RmlsZVN5bmMiLCJlcnIiLCJlbnRyaWVzIiwiY2hlbWluIiwiY2hlbWluTW9zYWlxdWUiLCJoYXV0ZXVyIiwibGFyZ2V1ciIsInhNb3NhaXF1ZSIsInlNb3NhaXF1ZSIsInVubGlua1N5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9zZW5hdGV1cnNfcGhvdG9zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuLy8gaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbi8vIGltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG4vLyBpbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiXG5cbmltcG9ydCB7IFBob3RvLCBTZW4sIHNlbkZpZWxkc1RvUGFyc2VJbnQsIHNlbkZpZWxkc1RvVHJpbSB9IGZyb20gXCIuLi90eXBlcy9zZW5zXCJcbmltcG9ydCB7IGNoZWNrRGF0YWJhc2UgfSBmcm9tIFwiLi4vZGF0YWJhc2VzXCJcbmltcG9ydCB7IHBhcnNlSW50RmllbGRzLCB0cmltRmllbGRzUmlnaHQgfSBmcm9tIFwiLi4vZmllbGRzXCJcbmltcG9ydCB7IHNsdWdpZnkgfSBmcm9tIFwiLi4vc3RyaW5nc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcImZcIixcbiAgICBoZWxwOiBcImZldGNoIHPDqW5hdGV1cnMnIHBpY3R1cmVzIGluc3RlYWQgb2YgcmV0cmlldmluZyB0aGVtIGZyb20gZmlsZXNcIixcbiAgICBuYW1lOiBcImZldGNoXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBTw6luYXQgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG4vLyBjb25zdCBwaXBlbGluZSA9IHV0aWwucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVQaG90b3NTZW5hdGV1cnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgYXNzZXJ0KGRhdGFEaXIsIFwiTWlzc2luZyBhcmd1bWVudDogZGF0YSBkaXJlY3RvcnlcIilcblxuICBjb25zdCBkYiA9IGF3YWl0IGNoZWNrRGF0YWJhc2UoXCJzZW5zXCIpXG5cbiAgY29uc3Qgc2VuczogU2VuW10gPSAoXG4gICAgYXdhaXQgZGIuYW55KFxuICAgICAgYFxuICAgICAgU0VMRUNUICpcbiAgICAgIEZST00gc2VuXG4gICAgICBXSEVSRSBldGFzZW5jb2QgPSAnQUNUSUYnXG4gICAgYCxcbiAgICApXG4gICkubWFwKChzZW46IFNlbikgPT5cbiAgICBwYXJzZUludEZpZWxkcyhzZW5GaWVsZHNUb1BhcnNlSW50LCB0cmltRmllbGRzUmlnaHQoc2VuRmllbGRzVG9UcmltLCBzZW4pKSxcbiAgKVxuXG4gIGNvbnN0IHBob3Rvc0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBcInBob3Rvc19zZW5hdGV1cnNcIilcbiAgY29uc3QgbWlzc2luZ1Bob3RvRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcImltYWdlc1wiLCBcInRyYW5zcGFyZW50XzE1NXgyMjUuanBnXCIpXG5cbiAgLy8gRG93bmxvYWQgcGhvdG9zLlxuICBmcy5lbnN1cmVEaXJTeW5jKHBob3Rvc0RpcilcbiAgaWYgKG9wdGlvbnMuZmV0Y2gpIHtcbiAgICBmb3IgKGNvbnN0IHNlbiBvZiBzZW5zKSB7XG4gICAgICBjb25zdCBwaG90b1N0ZW0gPSBgJHtzbHVnaWZ5KHNlbi5zZW5ub211c2UsIFwiX1wiKX1fJHtzbHVnaWZ5KFxuICAgICAgICBzZW4uc2VucHJlbm9tdXNlLFxuICAgICAgICBcIl9cIixcbiAgICAgICl9JHtzbHVnaWZ5KHNlbi5zZW5tYXQsIFwiX1wiKX1gXG4gICAgICBjb25zdCBwaG90b0ZpbGVuYW1lID0gcGhvdG9TdGVtICsgXCIuanBnXCJcbiAgICAgIGNvbnN0IHBob3RvRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b0ZpbGVuYW1lKVxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZW5hbWUgPSBwaG90b1N0ZW0gKyBcIl90ZW1wLmpwZ1wiXG4gICAgICBjb25zdCBwaG90b1RlbXBGaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvVGVtcEZpbGVuYW1lKVxuICAgICAgY29uc3QgdXJsUGhvdG8gPSBgaHR0cHM6Ly93d3cuc2VuYXQuZnIvc2VuaW1nLyR7cGhvdG9GaWxlbmFtZX1gXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBMb2FkaW5nIHBob3RvICR7dXJsUGhvdG99IGZvciAke3Nlbi5zZW5wcmVub211c2V9ICR7c2VuLnNlbm5vbXVzZX3igKZgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBGZXRjaCBmYWlscyB3aXRoIE9wZW5TU0wgZXJyb3I6IGRoIGtleSB0b28gc21hbGwuXG4gICAgICAvLyAoc28gZG9lcyBcImN1cmxcIikuXG4gICAgICAvLyBmb3IgKGxldCByZXRyaWVzID0gMDsgcmV0cmllcyA8IDM7IHJldHJpZXMrKykge1xuICAgICAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybFBob3RvKVxuICAgICAgLy8gICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIC8vICAgICBhd2FpdCBwaXBlbGluZShyZXNwb25zZS5ib2R5LCBmcy5jcmVhdGVXcml0ZVN0cmVhbShwaG90b1RlbXBGaWxlUGF0aCkpXG4gICAgICAvLyAgICAgZnMucmVuYW1lU3luYyhwaG90b1RlbXBGaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgIC8vICAgICBicmVha1xuICAgICAgLy8gICB9XG4gICAgICAvLyAgIGlmIChyZXRyaWVzID49IDIpIHtcbiAgICAgIC8vICAgICBjb25zb2xlLndhcm4oYEZldGNoIGZhaWxlZDogJHt1cmxQaG90b30gKCR7c2VuLnNlbnByZW5vbXVzZX0gJHtzZW4uc2Vubm9tdXNlfSlgKVxuICAgICAgLy8gICAgIGNvbnNvbGUud2FybihyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgICAvLyAgICAgY29uc29sZS53YXJuKGF3YWl0IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgIC8vICAgICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgICAgLy8gICAgICAgY29uc29sZS53YXJuKFwiICA9PiBSZXVzaW5nIGV4aXN0aW5nIGltYWdlXCIpXG4gICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gVXNpbmcgYmxhbmsgaW1hZ2VcIilcbiAgICAgIC8vICAgICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYHdnZXQgLS1xdWlldCAtTyAke3Bob3RvVGVtcEZpbGVuYW1lfSAke3VybFBob3RvfWAsIHtcbiAgICAgICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgLy8gc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICAgIGZzLnJlbmFtZVN5bmMocGhvdG9UZW1wRmlsZVBhdGgsIHBob3RvRmlsZVBhdGgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIGVycm9yICYmIFwic3RhdHVzXCIgaW4gZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA4KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGxvYWQgcGhvdG8gZm9yICR7c2VuLnNlbnByZW5vbXVzZX0gJHtzZW4uc2Vubm9tdXNlfWApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2l6ZSBwaG90b3MgdG8gMTU1eDIyNSwgYmVjYXVzZSBzb21lIGhhdmVuJ3QgZXhhY3RseSB0aGlzIHNpemUuXG4gIGZvciAoY29uc3Qgc2VuIG9mIHNlbnMpIHtcbiAgICBjb25zdCBwaG90b1N0ZW0gPSBgJHtzbHVnaWZ5KHNlbi5zZW5ub211c2UsIFwiX1wiKX1fJHtzbHVnaWZ5KFxuICAgICAgc2VuLnNlbnByZW5vbXVzZSxcbiAgICAgIFwiX1wiLFxuICAgICl9JHtzbHVnaWZ5KHNlbi5zZW5tYXQsIFwiX1wiKX1gXG4gICAgY29uc3QgcGhvdG9GaWxlbmFtZSA9IHBob3RvU3RlbSArIFwiLmpwZ1wiXG4gICAgY29uc3QgcGhvdG9GaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvRmlsZW5hbWUpXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGhvdG9GaWxlUGF0aCkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFJlc2l6aW5nIHBob3RvICR7cGhvdG9TdGVtfSBmb3IgJHtzZW4uc2VucHJlbm9tdXNlfSAke3Nlbi5zZW5ub211c2V94oCmYCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBleGVjU3luYyhcbiAgICAgICAgYGdtIGNvbnZlcnQgLXJlc2l6ZSAxNTV4MjI1ISAke3Bob3RvU3RlbX0uanBnICR7cGhvdG9TdGVtfV8xNTV4MjI1LmpwZ2AsXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE1pc3NpbmcgcGhvdG8gZm9yICR7c2VuLnNlbnByZW5vbXVzZX0gJHtzZW4uc2Vubm9tdXNlfTogdXNpbmcgYmxhbmsgaW1hZ2VgKVxuICAgICAgfVxuICAgICAgZnMuY29weUZpbGVTeW5jKG1pc3NpbmdQaG90b0ZpbGVQYXRoLCBwYXRoLmpvaW4ocGhvdG9zRGlyLCBgJHtwaG90b1N0ZW19XzE1NXgyMjUuanBnYCkpXG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbW9zYWljIG9mIHBob3Rvcy5cbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgbW9zYWljIG9mIHBob3Rvc+KAplwiKVxuICB9XG4gIGNvbnN0IHBob3RvQnlTZW5tYXQ6IHsgW3Nlbm1hdDogc3RyaW5nXTogUGhvdG8gfSA9IHt9XG4gIGNvbnN0IHJvd3NGaWxlbmFtZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChcbiAgICBsZXQgc2VuSW5kZXggPSAwLCByb3dJbmRleCA9IDA7XG4gICAgc2VuSW5kZXggPCBzZW5zLmxlbmd0aDtcbiAgICBzZW5JbmRleCArPSAyNSwgcm93SW5kZXgrK1xuICApIHtcbiAgICBjb25zdCByb3cgPSBzZW5zLnNsaWNlKHNlbkluZGV4LCBzZW5JbmRleCArIDI1KVxuICAgIGNvbnN0IHBob3Rvc0ZpbGVuYW1lczogc3RyaW5nW10gPSBbXVxuICAgIGZvciAoY29uc3QgW2NvbHVtbkluZGV4LCBzZW5dIG9mIHJvdy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHBob3RvU3RlbSA9IGAke3NsdWdpZnkoc2VuLnNlbm5vbXVzZSwgXCJfXCIpfV8ke3NsdWdpZnkoXG4gICAgICAgIHNlbi5zZW5wcmVub211c2UsXG4gICAgICAgIFwiX1wiLFxuICAgICAgKX0ke3NsdWdpZnkoc2VuLnNlbm1hdCwgXCJfXCIpfWBcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtwaG90b1N0ZW19XzE1NXgyMjUuanBnYFxuICAgICAgcGhvdG9zRmlsZW5hbWVzLnB1c2gocGhvdG9GaWxlbmFtZSlcbiAgICAgIHBob3RvQnlTZW5tYXRbc2VuLnNlbm1hdF0gPSB7XG4gICAgICAgIGNoZW1pbjogYHBob3Rvc19zZW5hdGV1cnMvJHtwaG90b0ZpbGVuYW1lfWAsXG4gICAgICAgIGNoZW1pbk1vc2FpcXVlOiBcInBob3Rvc19zZW5hdGV1cnMvc2VuYXRldXJzLmpwZ1wiLFxuICAgICAgICBoYXV0ZXVyOiAyMjUsXG4gICAgICAgIGxhcmdldXI6IDE1NSxcbiAgICAgICAgeE1vc2FpcXVlOiBjb2x1bW5JbmRleCAqIDE1NSxcbiAgICAgICAgeU1vc2FpcXVlOiByb3dJbmRleCAqIDIyNSxcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93RmlsZW5hbWUgPSBgcm93LSR7cm93SW5kZXh9LmpwZ2BcbiAgICBleGVjU3luYyhgZ20gY29udmVydCAke3Bob3Rvc0ZpbGVuYW1lcy5qb2luKFwiIFwiKX0gK2FwcGVuZCAke3Jvd0ZpbGVuYW1lfWAsIHtcbiAgICAgIGN3ZDogcGhvdG9zRGlyLFxuICAgIH0pXG4gICAgcm93c0ZpbGVuYW1lcy5wdXNoKHJvd0ZpbGVuYW1lKVxuICB9XG4gIGV4ZWNTeW5jKGBnbSBjb252ZXJ0ICR7cm93c0ZpbGVuYW1lcy5qb2luKFwiIFwiKX0gLWFwcGVuZCBzZW5hdGV1cnMuanBnYCwge1xuICAgIGN3ZDogcGhvdG9zRGlyLFxuICB9KVxuICBmb3IgKGNvbnN0IHJvd0ZpbGVuYW1lIG9mIHJvd3NGaWxlbmFtZXMpIHtcbiAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihwaG90b3NEaXIsIHJvd0ZpbGVuYW1lKSlcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmxvZyhcIkNyZWF0aW5nIEpTT04gZmlsZSBjb250YWluaW5nIGluZm9ybWF0aW9ucyBvbiBhbGwgcGljdHVyZXPigKZcIilcbiAgfVxuICBjb25zdCBqc29uRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBcInNlbmF0ZXVycy5qc29uXCIpXG4gIGZzLndyaXRlRmlsZVN5bmMoanNvbkZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShwaG90b0J5U2VubWF0LCBudWxsLCAyKSlcbn1cblxucmV0cmlldmVQaG90b3NTZW5hdGV1cnMoKVxuICAudGhlbigoKSA9PiBwcm9jZXNzLmV4aXQoMCkpXG4gIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxjQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxnQkFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksS0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBSUEsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsUUFBQSxHQUFBUixPQUFBO0FBQW9D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
@@ -0,0 +1,164 @@
1
+ import assert from "assert";
2
+ import { execSync } from "child_process";
3
+ import commandLineArgs from "command-line-args";
4
+ import fs from "fs-extra";
5
+ // import fetch from "node-fetch"
6
+ import path from "path";
7
+ // import stream from "stream"
8
+ // import util from "util"
9
+ import { senFieldsToParseInt, senFieldsToTrim } from "../types/sens";
10
+ import { checkDatabase } from "../databases";
11
+ import { parseIntFields, trimFieldsRight } from "../fields";
12
+ import { slugify } from "../strings";
13
+ const optionsDefinitions = [
14
+ {
15
+ alias: "f",
16
+ help: "fetch sénateurs' pictures instead of retrieving them from files",
17
+ name: "fetch",
18
+ type: Boolean,
19
+ },
20
+ {
21
+ alias: "s",
22
+ help: "don't log anything",
23
+ name: "silent",
24
+ type: Boolean,
25
+ },
26
+ {
27
+ defaultOption: true,
28
+ help: "directory containing Sénat open data files",
29
+ name: "dataDir",
30
+ type: String,
31
+ },
32
+ ];
33
+ const options = commandLineArgs(optionsDefinitions);
34
+ // const pipeline = util.promisify(stream.pipeline)
35
+ async function retrievePhotosSenateurs() {
36
+ const dataDir = options.dataDir;
37
+ assert(dataDir, "Missing argument: data directory");
38
+ const db = await checkDatabase("sens");
39
+ const sens = (await db.any(`
40
+ SELECT *
41
+ FROM sen
42
+ WHERE etasencod = 'ACTIF'
43
+ `)).map((sen) => parseIntFields(senFieldsToParseInt, trimFieldsRight(senFieldsToTrim, sen)));
44
+ const photosDir = path.join(dataDir, "photos_senateurs");
45
+ const missingPhotoFilePath = path.resolve(__dirname, "images", "transparent_155x225.jpg");
46
+ // Download photos.
47
+ fs.ensureDirSync(photosDir);
48
+ if (options.fetch) {
49
+ for (const sen of sens) {
50
+ const photoStem = `${slugify(sen.sennomuse, "_")}_${slugify(sen.senprenomuse, "_")}${slugify(sen.senmat, "_")}`;
51
+ const photoFilename = photoStem + ".jpg";
52
+ const photoFilePath = path.join(photosDir, photoFilename);
53
+ const photoTempFilename = photoStem + "_temp.jpg";
54
+ const photoTempFilePath = path.join(photosDir, photoTempFilename);
55
+ const urlPhoto = `https://www.senat.fr/senimg/${photoFilename}`;
56
+ if (!options.silent) {
57
+ console.log(`Loading photo ${urlPhoto} for ${sen.senprenomuse} ${sen.sennomuse}…`);
58
+ }
59
+ // Fetch fails with OpenSSL error: dh key too small.
60
+ // (so does "curl").
61
+ // for (let retries = 0; retries < 3; retries++) {
62
+ // const response = await fetch(urlPhoto)
63
+ // if (response.ok) {
64
+ // await pipeline(response.body, fs.createWriteStream(photoTempFilePath))
65
+ // fs.renameSync(photoTempFilePath, photoFilePath)
66
+ // break
67
+ // }
68
+ // if (retries >= 2) {
69
+ // console.warn(`Fetch failed: ${urlPhoto} (${sen.senprenomuse} ${sen.sennomuse})`)
70
+ // console.warn(response.status, response.statusText)
71
+ // console.warn(await response.text())
72
+ // if (fs.existsSync(photoFilePath)) {
73
+ // console.warn(" => Reusing existing image")
74
+ // } else {
75
+ // console.warn(" => Using blank image")
76
+ // fs.copyFileSync(missingPhotoFilePath, photoFilePath)
77
+ // }
78
+ // break
79
+ // }
80
+ // }
81
+ try {
82
+ execSync(`wget --quiet -O ${photoTempFilename} ${urlPhoto}`, {
83
+ cwd: photosDir,
84
+ env: process.env,
85
+ encoding: "utf-8",
86
+ // stdio: ["ignore", "ignore", "pipe"],
87
+ });
88
+ fs.renameSync(photoTempFilePath, photoFilePath);
89
+ }
90
+ catch (error) {
91
+ if (typeof error === "object" && error && "status" in error && error.status === 8) {
92
+ console.error(`Unable to load photo for ${sen.senprenomuse} ${sen.sennomuse}`);
93
+ continue;
94
+ }
95
+ throw error;
96
+ }
97
+ }
98
+ }
99
+ // Resize photos to 155x225, because some haven't exactly this size.
100
+ for (const sen of sens) {
101
+ const photoStem = `${slugify(sen.sennomuse, "_")}_${slugify(sen.senprenomuse, "_")}${slugify(sen.senmat, "_")}`;
102
+ const photoFilename = photoStem + ".jpg";
103
+ const photoFilePath = path.join(photosDir, photoFilename);
104
+ if (fs.existsSync(photoFilePath)) {
105
+ if (!options.silent) {
106
+ console.log(`Resizing photo ${photoStem} for ${sen.senprenomuse} ${sen.sennomuse}…`);
107
+ }
108
+ execSync(`gm convert -resize 155x225! ${photoStem}.jpg ${photoStem}_155x225.jpg`, {
109
+ cwd: photosDir,
110
+ });
111
+ }
112
+ else {
113
+ if (!options.silent) {
114
+ console.warn(`Missing photo for ${sen.senprenomuse} ${sen.sennomuse}: using blank image`);
115
+ }
116
+ fs.copyFileSync(missingPhotoFilePath, path.join(photosDir, `${photoStem}_155x225.jpg`));
117
+ }
118
+ }
119
+ // Create a mosaic of photos.
120
+ if (!options.silent) {
121
+ console.log("Creating mosaic of photos…");
122
+ }
123
+ const photoBySenmat = {};
124
+ const rowsFilenames = [];
125
+ for (let senIndex = 0, rowIndex = 0; senIndex < sens.length; senIndex += 25, rowIndex++) {
126
+ const row = sens.slice(senIndex, senIndex + 25);
127
+ const photosFilenames = [];
128
+ for (const [columnIndex, sen] of row.entries()) {
129
+ const photoStem = `${slugify(sen.sennomuse, "_")}_${slugify(sen.senprenomuse, "_")}${slugify(sen.senmat, "_")}`;
130
+ const photoFilename = `${photoStem}_155x225.jpg`;
131
+ photosFilenames.push(photoFilename);
132
+ photoBySenmat[sen.senmat] = {
133
+ chemin: `photos_senateurs/${photoFilename}`,
134
+ cheminMosaique: "photos_senateurs/senateurs.jpg",
135
+ hauteur: 225,
136
+ largeur: 155,
137
+ xMosaique: columnIndex * 155,
138
+ yMosaique: rowIndex * 225,
139
+ };
140
+ }
141
+ const rowFilename = `row-${rowIndex}.jpg`;
142
+ execSync(`gm convert ${photosFilenames.join(" ")} +append ${rowFilename}`, {
143
+ cwd: photosDir,
144
+ });
145
+ rowsFilenames.push(rowFilename);
146
+ }
147
+ execSync(`gm convert ${rowsFilenames.join(" ")} -append senateurs.jpg`, {
148
+ cwd: photosDir,
149
+ });
150
+ for (const rowFilename of rowsFilenames) {
151
+ fs.unlinkSync(path.join(photosDir, rowFilename));
152
+ }
153
+ if (!options.silent) {
154
+ console.log("Creating JSON file containing informations on all pictures…");
155
+ }
156
+ const jsonFilePath = path.join(photosDir, "senateurs.json");
157
+ fs.writeFileSync(jsonFilePath, JSON.stringify(photoBySenmat, null, 2));
158
+ }
159
+ retrievePhotosSenateurs()
160
+ .then(() => process.exit(0))
161
+ .catch((error) => {
162
+ console.log(error);
163
+ process.exit(1);
164
+ });