@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
116 lines • 17.4 kB
JavaScript
import commandLineArgs from "command-line-args";
import fs from "fs-extra";
import path from "path";
import * as git from "../git.mjs";
import { execSync } from "child_process";
import { iterLoadAssembleeActeurs } from "../loaders.mjs";
import { cloneAndUpdateGitRepository, resizePhoto, createMosaic } from "./retrieve_deputes_photos.mjs";
import { CodeTypeOrgane, TypeMandat } from "../types/acteurs_et_organes.mjs";
import { cloneOption, commitOption, dataDirDefaultOption, fetchOption, pullOption, remoteOption, silentOption } from "./shared/cli_helpers.mjs";
import { Legislature } from "../types/legislatures.mjs";
const optionsDefinitions = [cloneOption, commitOption, pullOption, remoteOption, silentOption, dataDirDefaultOption, fetchOption, {
alias: "w",
defaultValue: 155,
name: "width",
type: Number
}, {
alias: "h",
defaultValue: 225,
name: "height",
type: Number
}, {
alias: "S",
help: "fetch square picture",
name: "square",
type: Boolean
}];
const options = commandLineArgs(optionsDefinitions);
async function retrievePhotosSenateurs() {
const dataDir = options.dataDir;
const photosDirName = "photos_senateurs";
const photosDir = path.join(dataDir, photosDirName);
const photosWidth = options.width;
const photosHeight = options.height;
const missingPhotoFilePath = `images/transparent_${photosWidth}x${photosHeight}.jpg`;
cloneAndUpdateGitRepository(photosDirName, options);
fs.ensureDirSync(photosDir);
const acteurUids = [];
for (const {
acteur
} of iterLoadAssembleeActeurs(dataDir, Legislature.All, {
noValidation: true
})) {
const {
mandats
} = acteur;
if (!mandats) continue;
const mandatDepute = mandats.find(mandat => mandat.xsiType === TypeMandat.MandatParlementaireType && mandat.typeOrgane === CodeTypeOrgane.Senat);
if (!mandatDepute) continue;
const {
adresses
} = acteur;
if (!adresses) continue;
let url = null;
for (const adresse of adresses) {
if (adresse.xsiType === "AdresseSiteWeb_Type" && adresse.typeLibelle === "Url sénateur") {
url = adresse.valElec;
}
}
if (!url) continue;
const senateurStem = `${stemFromSenateur(acteur)}${options.square ? "_carre" : ""}`;
if (options.fetch) {
const ident = acteur.etatCivil.ident;
const photoFilename = `${senateurStem}.jpg`;
const photoFilePath = path.join(photosDir, photoFilename);
const photoTempFilename = `${senateurStem}_temp.jpg`;
const photoTempFilePath = path.join(photosDir, photoTempFilename);
const urlPhoto = `https://www.senat.fr/senimg/${photoFilename}`;
if (!options.silent) {
console.log(`Loading photo ${urlPhoto} for ${ident.prenom} ${ident.nom}…`);
}
try {
execSync(`wget --quiet -O ${photoTempFilename} ${urlPhoto}`, {
cwd: photosDir,
env: process.env,
encoding: "utf-8"
// stdio: ["ignore", "ignore", "pipe"],
});
fs.renameSync(photoTempFilePath, photoFilePath);
} catch (error) {
console.error(error);
if (fs.existsSync(photoFilePath)) {
console.warn(`Reusing existing image: ${photoFilePath}`);
} else {
console.warn(`Using blank image: ${missingPhotoFilePath}`);
fs.copyFileSync(missingPhotoFilePath, photoFilePath);
}
}
resizePhoto(acteur, photosWidth, photosHeight, photosDir, senateurStem, options);
}
acteurUids.push(senateurStem);
}
createMosaic(acteurUids, photosDir, photosWidth, photosHeight, "senateurs");
if (options.commit) {
return git.commitAndPush(photosDir, "Nouvelle moisson", options.remote);
}
return 0;
}
function stemFromSenateur(senateur) {
const {
adresses
} = senateur;
let url = null;
for (const adresse of adresses) {
if (adresse.xsiType === "AdresseSiteWeb_Type" && adresse.typeLibelle === "Url sénateur") {
url = adresse.valElec;
}
}
const match = url.match(/^https:\/\/www\.senat\.fr\/senateur\/(.*)\.html$/);
const senateurStem = match[1];
return senateurStem;
}
retrievePhotosSenateurs().then(exitCode => process.exit(exitCode)).catch(error => {
console.log(error);
process.exit(1);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJnaXQiLCJleGVjU3luYyIsIml0ZXJMb2FkQXNzZW1ibGVlQWN0ZXVycyIsImNsb25lQW5kVXBkYXRlR2l0UmVwb3NpdG9yeSIsInJlc2l6ZVBob3RvIiwiY3JlYXRlTW9zYWljIiwiQ29kZVR5cGVPcmdhbmUiLCJUeXBlTWFuZGF0IiwiY2xvbmVPcHRpb24iLCJjb21taXRPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImZldGNoT3B0aW9uIiwicHVsbE9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsIkxlZ2lzbGF0dXJlIiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJkZWZhdWx0VmFsdWUiLCJuYW1lIiwidHlwZSIsIk51bWJlciIsImhlbHAiLCJCb29sZWFuIiwib3B0aW9ucyIsInJldHJpZXZlUGhvdG9zU2VuYXRldXJzIiwiZGF0YURpciIsInBob3Rvc0Rpck5hbWUiLCJwaG90b3NEaXIiLCJqb2luIiwicGhvdG9zV2lkdGgiLCJ3aWR0aCIsInBob3Rvc0hlaWdodCIsImhlaWdodCIsIm1pc3NpbmdQaG90b0ZpbGVQYXRoIiwiZW5zdXJlRGlyU3luYyIsImFjdGV1clVpZHMiLCJhY3RldXIiLCJBbGwiLCJub1ZhbGlkYXRpb24iLCJtYW5kYXRzIiwibWFuZGF0RGVwdXRlIiwiZmluZCIsIm1hbmRhdCIsInhzaVR5cGUiLCJNYW5kYXRQYXJsZW1lbnRhaXJlVHlwZSIsInR5cGVPcmdhbmUiLCJTZW5hdCIsImFkcmVzc2VzIiwidXJsIiwiYWRyZXNzZSIsInR5cGVMaWJlbGxlIiwidmFsRWxlYyIsInNlbmF0ZXVyU3RlbSIsInN0ZW1Gcm9tU2VuYXRldXIiLCJzcXVhcmUiLCJmZXRjaCIsImlkZW50IiwiZXRhdENpdmlsIiwicGhvdG9GaWxlbmFtZSIsInBob3RvRmlsZVBhdGgiLCJwaG90b1RlbXBGaWxlbmFtZSIsInBob3RvVGVtcEZpbGVQYXRoIiwidXJsUGhvdG8iLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwicHJlbm9tIiwibm9tIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwicmVuYW1lU3luYyIsImVycm9yIiwiZXhpc3RzU3luYyIsIndhcm4iLCJjb3B5RmlsZVN5bmMiLCJwdXNoIiwiY29tbWl0IiwiY29tbWl0QW5kUHVzaCIsInJlbW90ZSIsInNlbmF0ZXVyIiwibWF0Y2giLCJ0aGVuIiwiZXhpdENvZGUiLCJleGl0IiwiY2F0Y2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9zZW5hdGV1cnNfcGhvdG9zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgeyBpdGVyTG9hZEFzc2VtYmxlZUFjdGV1cnMgfSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQge1xuICBjbG9uZUFuZFVwZGF0ZUdpdFJlcG9zaXRvcnksXG4gIHJlc2l6ZVBob3RvLFxuICBjcmVhdGVNb3NhaWMsXG59IGZyb20gXCIuL3JldHJpZXZlX2RlcHV0ZXNfcGhvdG9zXCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29kZVR5cGVPcmdhbmUsXG4gIE1hbmRhdCxcbiAgVHlwZU1hbmRhdCxcbn0gZnJvbSBcIi4uL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQge1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgZmV0Y2hPcHRpb24sXG4gIHB1bGxPcHRpb24sXG4gIHJlbW90ZU9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuaW1wb3J0IHsgTGVnaXNsYXR1cmUgfSBmcm9tIFwiLi4vdHlwZXMvbGVnaXNsYXR1cmVzXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIHNpbGVudE9wdGlvbixcbiAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gIGZldGNoT3B0aW9uLFxuICB7XG4gICAgYWxpYXM6IFwid1wiLFxuICAgIGRlZmF1bHRWYWx1ZTogMTU1LFxuICAgIG5hbWU6IFwid2lkdGhcIixcbiAgICB0eXBlOiBOdW1iZXIsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJoXCIsXG4gICAgZGVmYXVsdFZhbHVlOiAyMjUsXG4gICAgbmFtZTogXCJoZWlnaHRcIixcbiAgICB0eXBlOiBOdW1iZXIsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJTXCIsXG4gICAgaGVscDogXCJmZXRjaCBzcXVhcmUgcGljdHVyZVwiLFxuICAgIG5hbWU6IFwic3F1YXJlXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZVBob3Rvc1NlbmF0ZXVycygpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIGNvbnN0IHBob3Rvc0Rpck5hbWUgPSBcInBob3Rvc19zZW5hdGV1cnNcIlxuICBjb25zdCBwaG90b3NEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgcGhvdG9zRGlyTmFtZSlcbiAgY29uc3QgcGhvdG9zV2lkdGggPSBvcHRpb25zLndpZHRoXG4gIGNvbnN0IHBob3Rvc0hlaWdodCA9IG9wdGlvbnMuaGVpZ2h0XG4gIGNvbnN0IG1pc3NpbmdQaG90b0ZpbGVQYXRoID0gYGltYWdlcy90cmFuc3BhcmVudF8ke3Bob3Rvc1dpZHRofXgke3Bob3Rvc0hlaWdodH0uanBnYFxuXG4gIGNsb25lQW5kVXBkYXRlR2l0UmVwb3NpdG9yeShwaG90b3NEaXJOYW1lLCBvcHRpb25zKVxuICBmcy5lbnN1cmVEaXJTeW5jKHBob3Rvc0RpcilcblxuICBjb25zdCBhY3RldXJVaWRzID0gW11cbiAgZm9yIChjb25zdCB7IGFjdGV1ciB9IG9mIGl0ZXJMb2FkQXNzZW1ibGVlQWN0ZXVycyhkYXRhRGlyLCBMZWdpc2xhdHVyZS5BbGwsIHtcbiAgICBub1ZhbGlkYXRpb246IHRydWUsXG4gIH0pKSB7XG4gICAgY29uc3QgeyBtYW5kYXRzIH0gPSBhY3RldXJcbiAgICBpZiAoIW1hbmRhdHMpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBtYW5kYXREZXB1dGUgPSBtYW5kYXRzLmZpbmQoXG4gICAgICAobWFuZGF0OiBNYW5kYXQpID0+XG4gICAgICAgIG1hbmRhdC54c2lUeXBlID09PSBUeXBlTWFuZGF0Lk1hbmRhdFBhcmxlbWVudGFpcmVUeXBlICYmXG4gICAgICAgIG1hbmRhdC50eXBlT3JnYW5lID09PSBDb2RlVHlwZU9yZ2FuZS5TZW5hdCxcbiAgICApXG4gICAgaWYgKCFtYW5kYXREZXB1dGUpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB7IGFkcmVzc2VzIH0gPSBhY3RldXJcbiAgICBpZiAoIWFkcmVzc2VzKSBjb250aW51ZVxuXG4gICAgbGV0IHVybCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGFkcmVzc2Ugb2YgYWRyZXNzZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgYWRyZXNzZS54c2lUeXBlID09PSBcIkFkcmVzc2VTaXRlV2ViX1R5cGVcIiAmJlxuICAgICAgICBhZHJlc3NlLnR5cGVMaWJlbGxlID09PSBcIlVybCBzw6luYXRldXJcIlxuICAgICAgKSB7XG4gICAgICAgIHVybCA9IGFkcmVzc2UudmFsRWxlY1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsKSBjb250aW51ZVxuXG4gICAgY29uc3Qgc2VuYXRldXJTdGVtID0gYCR7c3RlbUZyb21TZW5hdGV1cihhY3RldXIpfSR7b3B0aW9ucy5zcXVhcmUgPyBcIl9jYXJyZVwiIDogXCJcIn1gXG5cbiAgICBpZiAob3B0aW9ucy5mZXRjaCkge1xuICAgICAgY29uc3QgaWRlbnQgPSBhY3RldXIuZXRhdENpdmlsLmlkZW50XG4gICAgICBjb25zdCBwaG90b0ZpbGVuYW1lID0gYCR7c2VuYXRldXJTdGVtfS5qcGdgXG4gICAgICBjb25zdCBwaG90b0ZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgcGhvdG9GaWxlbmFtZSlcbiAgICAgIGNvbnN0IHBob3RvVGVtcEZpbGVuYW1lID0gYCR7c2VuYXRldXJTdGVtfV90ZW1wLmpwZ2BcbiAgICAgIGNvbnN0IHBob3RvVGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgcGhvdG9UZW1wRmlsZW5hbWUpXG4gICAgICBjb25zdCB1cmxQaG90byA9IGBodHRwczovL3d3dy5zZW5hdC5mci9zZW5pbWcvJHtwaG90b0ZpbGVuYW1lfWBcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYExvYWRpbmcgcGhvdG8gJHt1cmxQaG90b30gZm9yICR7aWRlbnQucHJlbm9tfSAke2lkZW50Lm5vbX3igKZgLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNTeW5jKGB3Z2V0IC0tcXVpZXQgLU8gJHtwaG90b1RlbXBGaWxlbmFtZX0gJHt1cmxQaG90b31gLCB7XG4gICAgICAgICAgY3dkOiBwaG90b3NEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIC8vIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgICBmcy5yZW5hbWVTeW5jKHBob3RvVGVtcEZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGhvdG9GaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFJldXNpbmcgZXhpc3RpbmcgaW1hZ2U6ICR7cGhvdG9GaWxlUGF0aH1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgVXNpbmcgYmxhbmsgaW1hZ2U6ICR7bWlzc2luZ1Bob3RvRmlsZVBhdGh9YClcbiAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMobWlzc2luZ1Bob3RvRmlsZVBhdGgsIHBob3RvRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzaXplUGhvdG8oXG4gICAgICAgIGFjdGV1cixcbiAgICAgICAgcGhvdG9zV2lkdGgsXG4gICAgICAgIHBob3Rvc0hlaWdodCxcbiAgICAgICAgcGhvdG9zRGlyLFxuICAgICAgICBzZW5hdGV1clN0ZW0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgfVxuXG4gICAgYWN0ZXVyVWlkcy5wdXNoKHNlbmF0ZXVyU3RlbSlcbiAgfVxuXG4gIGNyZWF0ZU1vc2FpYyhhY3RldXJVaWRzLCBwaG90b3NEaXIsIHBob3Rvc1dpZHRoLCBwaG90b3NIZWlnaHQsIFwic2VuYXRldXJzXCIpXG5cbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgcmV0dXJuIGdpdC5jb21taXRBbmRQdXNoKHBob3Rvc0RpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIsIG9wdGlvbnMucmVtb3RlKVxuICB9XG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIHN0ZW1Gcm9tU2VuYXRldXIoc2VuYXRldXI6IEFjdGV1cikge1xuICBjb25zdCB7IGFkcmVzc2VzIH0gPSBzZW5hdGV1clxuICBsZXQgdXJsID0gbnVsbFxuICBmb3IgKGNvbnN0IGFkcmVzc2Ugb2YgYWRyZXNzZXMhKSB7XG4gICAgaWYgKFxuICAgICAgYWRyZXNzZS54c2lUeXBlID09PSBcIkFkcmVzc2VTaXRlV2ViX1R5cGVcIiAmJlxuICAgICAgYWRyZXNzZS50eXBlTGliZWxsZSA9PT0gXCJVcmwgc8OpbmF0ZXVyXCJcbiAgICApIHtcbiAgICAgIHVybCA9IGFkcmVzc2UudmFsRWxlY1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXRjaCA9IHVybCEubWF0Y2goL15odHRwczpcXC9cXC93d3dcXC5zZW5hdFxcLmZyXFwvc2VuYXRldXJcXC8oLiopXFwuaHRtbCQvKVxuICBjb25zdCBzZW5hdGV1clN0ZW0gPSBtYXRjaCFbMV1cbiAgcmV0dXJuIHNlbmF0ZXVyU3RlbVxufVxuXG5yZXRyaWV2ZVBob3Rvc1NlbmF0ZXVycygpXG4gIC50aGVuKChleGl0Q29kZSkgPT4gcHJvY2Vzcy5leGl0KGV4aXRDb2RlKSlcbiAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9KVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQUEsT0FDaEIsS0FBS0MsR0FBRztBQUNmLFNBQVNDLFFBQVEsUUFBUSxlQUFlO0FBQUEsU0FDL0JDLHdCQUF3QjtBQUFBLFNBRS9CQywyQkFBMkIsRUFDM0JDLFdBQVcsRUFDWEMsWUFBWTtBQUFBLFNBSVpDLGNBQWMsRUFFZEMsVUFBVTtBQUFBLFNBR1ZDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxvQkFBb0IsRUFDcEJDLFdBQVcsRUFDWEMsVUFBVSxFQUNWQyxZQUFZLEVBQ1pDLFlBQVk7QUFBQSxTQUVMQyxXQUFXO0FBRXBCLE1BQU1DLGtCQUFrQixHQUFHLENBQ3pCUixXQUFXLEVBQ1hDLFlBQVksRUFDWkcsVUFBVSxFQUNWQyxZQUFZLEVB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