User:Habst/getPetscan.js
// https://petscan.wmflabs.org/?wikidata_label_language=&source_combination=&output_compatability=catscan&edits%5Bbots%5D=both&format=html&common_wiki_other=&show_disambiguation_pages=both&links_to_no=&search_max_results=500&max_sitelink_count=&cb_labels_no_l=1&before=&links_to_all=&sitelinks_no=&templates_no=&labels_no=&templates_any=&negcats=Terry+Fox&show_redirects=both&depth=6&subpage_filter=either&links_to_any=&page_image=any&templates_yes=&show_soft_redirects=both&outlinks_any=&labels_any=&interface_language=en&project=wikipedia&langs_labels_yes=&sparql=&ns%5B0%5D=1&cb_labels_any_l=1&larger=&search_wiki=&edits%5Bflagged%5D=both&output_limit=&cb_labels_yes_l=1&categories=2023+deaths%0D%0ASport+of+athletics+people&outlinks_no=&language=en&smaller=&langs_labels_any=
// todo: handle death precision to month, Javelin Throw (old), Decathlon (52-61) ?
getWd = async q => {
return (await (await fetch(`https://www.wikidata.org/w/api.php?`+new URLSearchParams({action:'wbgetentities',format:'json',ids:q}))).json()).entities[q];
}
getWa = async id => {
return (await (await fetch("https://tppcjbjqljd4tj7my77t466hn4.appsync-api.eu-west-1.amazonaws.com/graphql", {
headers: { "x-api-key": "da2-fulcgci74bbslidixnmkcr6sxu" },
body: JSON.stringify({
operationName: "GetSingleCompetitorAllTimePersonalTop10",
variables: { allTimePersonalTop10Discipline: null, id },
query: `
query GetSingleCompetitorAllTimePersonalTop10($id: Int, $urlSlug: String, $allTimePersonalTop10Discipline: Int) {
getSingleCompetitorAllTimePersonalTop10(id: $id, urlSlug: $urlSlug, allTimePersonalTop10Discipline: $allTimePersonalTop10Discipline) {
results { discipline date result score }
}
}`
}),
method: "POST",
})).json()).data.getSingleCompetitorAllTimePersonalTop10.results;
}
window.qs ??= {};
window.was ??= {};
(async () => {
window.out = '';
for (const { q, title } of pet['*'][0].a['*']) {
qs[q] ??= await getWd(q);
const nats = ['P1532', 'P27'];
const P_OCCUPATION = 'P106';
const P_BIRTH = 'P569';
const P_DEATH = 'P570';
const P_IOC = 'P984';
const P_WAID = 'P1146';
const Q_ATHCOMP = 'Q11513337';
let nat;
console.log(title, q);
for (const natP of nats) {
for (const natQ of qs[q].claims[natP]?.map(c => c.mainsnak.datavalue.value.id) ?? []) {
const natQ = qs[q].claims[natP]?.[0].mainsnak.datavalue.value.id;
if (!natQ) continue;
qs[natQ] ??= await getWd(natQ);
if (qs[natQ].claims[P_IOC]) {
nat = qs[natQ].claims[P_IOC][0].mainsnak.datavalue.value;
break;
}
}
if (nat) break;
}
let occ;
const waid = qs[q].claims[P_WAID]?.find(c => c.rank !== 'deprecated')?.mainsnak.datavalue.value;
if (waid) {
was[waid] ??= await getWa(waid);
occ = was[waid][0]?.discipline.replace('Mile', 'Mile run');
}
if (!occ) {
const occQ = qs[q].claims[P_OCCUPATION].map(oc => oc.mainsnak.datavalue.value.id).find(id => id !== Q_ATHCOMP) ?? Q_ATHCOMP;
qs[occQ] ??= await getWd(occQ);
const occLabel = qs[occQ].labels.en.value.replace('sprinter', 'sprint (running)|Sprinter');
occ = occLabel[0].toUpperCase() + occLabel.slice(1);
}
for (bd of [P_BIRTH, P_DEATH]) {
qs[q].claims[bd][0].value = qs[q].claims[bd][0].mainsnak.datavalue.value;
qs[q].claims[bd][0].value.time = qs[q].claims[bd][0].value.time.replace('-00-00T', '-01-01T').replace('-00T', '-01T');
}
const birth = new Date(qs[q].claims[P_BIRTH][0].value.time.slice(1));
birth.setTime(birth.getTime() + (5*60*60*1000));
const isLowPrecision = qs[q].claims[P_BIRTH][0].value.precision <= 10 || qs[q].claims[P_DEATH][0].value.precision <= 10;
const death = new Date(qs[q].claims[P_DEATH][0].value.time.slice(1));
death.setTime(death.getTime() + (5*60*60*1000));
const age = new Date(death - birth).getFullYear() - 1970;
const row = `| ':''} || {{flagg|cncie|${nat}}} || ${occ} || ${isLowPrecision ? `${age}-${age+1}` : age} || {{dts|${death.getDate()} ${death.toLocaleString('default', { month: 'long' })}}}`;
out += row + '\n|-\n';
console.log(row);
}
return out;
})()