Talk:2023 Indoor Meeting Karlsruhe
Latest comment: 11 months ago by Habst in topic Script to match names to results
This article has not yet been rated on Wikipedia's content assessment scale. It is of interest to the following WikiProjects: | |||||||||||||||||||||
|
Script to match names to results
editI used this script to match names to the results using IAAF IDs (note the API key is public info):
data=await (await fetch("https://wpgiegzkbrhj5mlsdxnipboepm.appsync-api.eu-west-1.amazonaws.com/graphql", { "headers": { "x-api-key": "da2-juounigq4vhkvg5ac47mezxqge" }, "body": JSON.stringify({ "operationName": "getCalendarCompetitionResults", "variables": { "competitionId": 7162587, "day": null, "eventId": null }, "query": `query getCalendarCompetitionResults($competitionId: Int, $day: Int, $eventId: Int) { getCalendarCompetitionResults(competitionId: $competitionId, day: $day, eventId: $eventId) { competition { dateRange endDate name rankingCategory startDate venue __typename } eventTitles { rankingCategory eventTitle events { event eventId gender isRelay perResultWind withWind summary { competitor { teamMembers { id name iaafId urlSlug __typename } id name iaafId urlSlug birthDate __typename } mark nationality placeInRace placeInRound points raceNumber records wind __typename } races { date day race raceId raceNumber results { competitor { teamMembers { id name iaafId urlSlug __typename } id name iaafId urlSlug birthDate hasProfile __typename } mark nationality place points qualified records wind remark details { event eventId raceNumber mark wind placeInRound placeInRace points overallPoints placeInRoundByPoints overallPlaceByPoints __typename } __typename } startList { competitor { birthDate country id name urlSlug __typename } order pb sb bib __typename } wind __typename } __typename } __typename } options { days { date day __typename } events { gender id name combined __typename } __typename } parameters { competitionId day eventId __typename } __typename } }` }), "method": "POST", })).json(); pre=''; cache??={}; if (typeof nameFixer === 'undefined') { const script = Object.assign(document.createElement('script'), { src: 'https://unpkg.com/name-fixer@1.0.0' }); document.body.appendChild(script); await new Promise(res => script.addEventListener('load', res)); } titleExists=async (name)=>{ const enLabelTitleMatch = await (await fetch(pre+'https://www.wikidata.org/w/api.php?' + new URLSearchParams({ action: 'wbgetentities', format: 'json', sites: 'enwiki', titles: name, }))).json(); return !enLabelTitleMatch.entities[-1]; } getTitle=async (id,name)=>{ const [fname, ...lname] = name.split(' '); name = fname + ' ' + nameFixer.nameFixer(lname.join(' ')); if (cache[id]) return cache[id]; const pages = await (await fetch(pre+'https://www.wikidata.org/w/api.php?' + new URLSearchParams({ action: 'query', format: 'json', list: 'search', srsearch: `haswbstatement:P1146=${id}`, }))).json(); const qid = pages.query.search[0]?.title; if (qid) { const entity = await (await fetch(pre+'https://www.wikidata.org/w/api.php?' + new URLSearchParams({ action: 'wbgetentities', format: 'json', ids: qid, }))).json(); const sitelinks = entity.entities[qid].sitelinks; const enTitle = sitelinks.enwiki?.title; if (enTitle) { cache[id] = `[[${enTitle}${enTitle.includes('(') ? '|' : ''}]]`; return cache[id]; } let enLabel = entity.entities[qid].labels.en?.value ?? name; if (await titleExists(enLabel)) enLabel += ' (athlete)'; // todo awb job? const otherWiki = Object.keys(sitelinks).find(key => key.endsWith('wiki')); if (otherWiki) { const otherTitle = sitelinks[otherWiki].title; cache[id] = `{{ill|${enLabel}|${otherWiki.replace('wiki', '')}|${otherTitle}}}`; return cache[id]; } cache[id] = `[[${enLabel}${enLabel.includes('(') ? '|' : ''}]]`; return cache[id]; } if (await titleExists(name)) name += ' (athlete)|'; cache[id] = `[[${name}]]`; return cache[id]; } mark2secs=mark=>{ const parts = mark.split(':'); if (parts.length === 1) return +mark; if (parts.length === 2) return +parts[0] * 60 + +parts[1]; return +parts[0] * 60 * 60 + +parts[1] * 60 + +parts[2]; } let out = ''; for (const evt of data.data.getCalendarCompetitionResults.eventTitles.find(et => et.eventTitle === 'World Athletics Indoor Tour').events) { const finals = evt.races.filter(race => race.race === 'Final'); const isMulti = finals.length > 1; out += `===${evt.event.replace(' indoor', '')}===\n`; out += `{| class="wikitable"\n! Place !! Athlete !! Time ${isMulti ? '!! Heat ' : ''}!! Points\n`; const results = finals.flatMap(race => race.results.map(res => ({...res, raceNumber: race.raceNumber}))).sort((a, b) => mark2secs(a.mark) - mark2secs(b.mark)); for (const result of results) { const pl = ['DNS', 'DNF'].includes(result.mark) ? '' : results.indexOf(result) + 1; const name = result.competitor.name; const id = result.competitor.urlSlug.split('-').at(-1).replace(/^0/, ''); out += `|-\n| ${pl} || ${await getTitle(id, name)} || ${result.mark} ||${isMulti ? ` ${result.raceNumber} ||` : ''} ${{1: 10, 2: 7, 3: 5, 4: 3}[pl] ?? ''}\n`; } out += '|}\n\n'; } return out;