import requests
from dateutil import tz
from dateutil import parser
from dateutil import relativedelta
from datetime import datetime
from time import sleep
INTERESTING = [
'AZ',
'NV',
'PA',
'GA',
]
def update():
return requests.get("https://politics-elex-results.data.api.cnn.io/results/view/2020-national-races-PG.json").json()
def showInteresting():
data = update()
max_s_len = max([len(s['stateName']) for s in data if s['stateAbbreviation'] in INTERESTING])
for state in data:
name = state['stateName']
abbr = state['stateAbbreviation']
if abbr not in INTERESTING:
continue
timestamp = parser.isoparse(state['voteTimestamp'])
d_t = relativedelta.relativedelta(datetime.now(tz.tzutc()), timestamp)
delta_time = ''
if d_t.hours != 0:
delta_time += '{:0>2}:'.format(d_t.hours)
if d_t.minutes != 0:
delta_time += '{:0>2}:'.format(d_t.minutes)
if delta_time == '':
delta_time += str(d_t.seconds) + 's'
else:
delta_time += '{:0>2}'.format(d_t.seconds)
called = state['editorialStatus'] == 'called'
percent = state['percentReporting']
candidates = state['candidates']
max_c_len = max([len(c['fullName']) for c in candidates])
call_status = ''
if called:
max_votes = None
for candidate in candidates:
party = candidate['candidatePartyCode']
votes = candidate['voteNum']
if max_votes is None or votes > max_votes[1]:
max_votes = (party, votes)
call_status = ' ({code})'.format(code = max_votes[0])
print('{name} {abbr} ({percent}%){call_status} ({delta_time} ago)'.format(
name = name.ljust(max_s_len),
abbr = abbr,
percent = percent,
call_status = call_status,
delta_time = delta_time,
))
all_votes = {c['fullName']: c['voteNum'] for c in candidates}
for candidate in candidates:
c_name = candidate['fullName']
votes = candidate['voteNum']
v_perc = candidate['votePercentStr']
other_votes = sum([v for k, v in all_votes.items() if k != c_name])
margin = votes - other_votes
print(' {name}: {votes:,} / {margin:+,} / {v_perc}%'.format(
name = c_name.rjust(max_c_len),
votes = votes,
margin = margin,
v_perc = v_perc,
))
print()
print('------------------------------')
print()
if __name__ == '__main__':
while True:
showInteresting()
sleep(10)