Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Added teams.py and seasons.py #70

Draft
wants to merge 31 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
b450b0c
Update series.py
killuazoldyckreal Feb 23, 2025
91a8fd9
Create seasons.py
killuazoldyckreal Feb 23, 2025
6d46ebe
Update seasons.py
killuazoldyckreal Feb 23, 2025
859a8d9
Update seasons.py
killuazoldyckreal Feb 23, 2025
7e1511e
Update exceptions.py
killuazoldyckreal Feb 23, 2025
be95e51
Update series.py
killuazoldyckreal Feb 23, 2025
a97b9c8
Update seasons.py
killuazoldyckreal Feb 23, 2025
6e55bc1
Update seasons.py
killuazoldyckreal Feb 23, 2025
308157e
Update seasons.py
killuazoldyckreal Feb 23, 2025
0efcfcf
Create teams.py
killuazoldyckreal Feb 23, 2025
a76522c
Update seasons.py
killuazoldyckreal Feb 23, 2025
70b8901
Update series.py
killuazoldyckreal Feb 23, 2025
df4cc60
Update seasons.py
killuazoldyckreal Mar 5, 2025
ff1baaa
Update match.py
killuazoldyckreal Mar 5, 2025
81a4c2d
Update match.py
killuazoldyckreal Mar 5, 2025
dc64db4
Update match.py
killuazoldyckreal Mar 5, 2025
b25694f
Update match.py
killuazoldyckreal Mar 5, 2025
92ab92a
Update match.py
killuazoldyckreal Mar 5, 2025
16a26d4
Update match.py
killuazoldyckreal Mar 5, 2025
0c6b3e9
update
killuazoldyckreal Mar 6, 2025
4eac73d
bug fixes
killuazoldyckreal Mar 6, 2025
2adeb89
bug fixes
killuazoldyckreal Mar 6, 2025
11b3afd
bug fixes
killuazoldyckreal Mar 6, 2025
f68783e
Fixed NoneType error
killuazoldyckreal Mar 7, 2025
db6fcf8
update "Live" class
killuazoldyckreal Mar 7, 2025
fc89b85
update
killuazoldyckreal Mar 7, 2025
d6b9d34
Update misc.py
killuazoldyckreal Mar 8, 2025
7eab1c2
Create livematches.py
killuazoldyckreal Mar 8, 2025
f034fe6
Update livematches.py
killuazoldyckreal Mar 8, 2025
5e77e5d
Update livematches.py
killuazoldyckreal Mar 8, 2025
46c0a74
Update livematches.py
killuazoldyckreal Mar 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion espncricinfo/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,16 @@ class NoSeriesError(TypeError):
"""
Exception raised if a series_id is not valid or does not exist.
"""
pass
pass

class NoSeasonError(TypeError):
"""
Exception raised if a series_id is not valid or does not exist.
"""
pass

class NoTeamError(TypeError):
"""
Exception raised if a series_id is not valid or does not exist.
"""
pass
93 changes: 93 additions & 0 deletions espncricinfo/livematches.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import requests, re
from bs4 import BeautifulSoup

class Team(object):
def __init__(self, teamname, score):
self.name = teamname
self.score = score

class LiveMatch(object):
def __init__(self, match_time, match_id, match_number, venue, date, year, series, teams, match_status):
self.match_time = match_time
self.match_id = match_id
self.match_number = match_number
self.venue = venue
self.date = date
self.year = year
self.series = series
self.teams = teams
self.match_status = match_status
self.match_name = f"{teams[0].name} vs {teams[1].name}"

def __repr__(self):
teams_info = " | ".join([f"{team[0]}: {team[1]}" for team in self.teams])
return (f"Match Time: {self.match_time}\n"
f"Match Number: {self.match_number}\n"
f"Venue: {self.venue}\n"
f"Date: {self.date}, {self.year}\n"
f"Series: {self.series}\n"
f"Teams: {teams_info}\n"
f"Status: {self.match_status}\n")

class LiveMatches:

def __init__(self):
self.match_url = "https://www.espncricinfo.com/live-cricket-score"
self.headers = {'user-agent': 'Mozilla/5.0'}
self._live_matches = []
self.html = None

@property
def live_matches(self):
if not self._live_matches:
self._get_live_matches()
return self._live_matches

def _fetch_html(self):
response = requests.get(self.match_url, headers=self.headers)
if response.status_code != 200:
print("Failed to retrieve page")
return None
return BeautifulSoup(response.text, "html.parser")

def _get_live_matches(self):
self.html = self._fetch_html()
if not self.html:
return []

parent_div = self.html.select_one("html > body > div > section > section > div:nth-of-type(3) > div > div:nth-of-type(3) > div:nth-of-type(1) > div:nth-of-type(1) > div:nth-of-type(3) > div > div:nth-of-type(1) > div > div:nth-of-type(2) > div")
if parent_div:
for match_ in parent_div.find_all(recursive=False):
span_text = match_.select_one("span.ds-text-tight-xs.ds-font-bold.ds-uppercase.ds-leading-5")
div_text = match_.select_one("div.ds-text-tight-xs.ds-truncate.ds-text-typo-mid3")
match_time = span_text.text.strip() if span_text else "N/A"
match_date = div_text.text.strip() if div_text else "N/A"

teams = []
teams_div = match_.select_one("div.ds-flex.ds-flex-col.ds-mt-2.ds-mb-2")
for team in teams_div.find_all("div", class_="ci-team-score"):
team_div = team.find("div", class_="ds-flex ds-items-center ds-min-w-0 ds-mr-1")
team_name = team_div.get("title") if team_div else "Unknown"
score_div = team.find("div", class_="ds-text-compact-s")
if score_div:
overs_target = score_div.select_one('span[class*="ds-mr-0.5"]')
overs_target_text = overs_target.text.strip() if overs_target else ""
scores = [s.text.strip() for s in score_div.select("strong")]
formatted_score = f"{overs_target_text} {' & '.join(scores)}" if overs_target_text else " & ".join(scores)
else:
formatted_score = None
teams.append(Team(team_name, formatted_score))

if match_date != "N/A":
match_number, venue, date, year, series = match_date.split(", ")
else:
match_number = venue = date = year = series = "N/A"

match_status_p = match_.find("p", class_="ds-text-tight-s ds-font-medium ds-truncate ds-text-typo")
match_status = match_status_p.text.strip() if match_status_p else "N/A"
a_div = match_.select_one("a.ds-no-tap-higlight")
match_url = a_div.get("href") or ""
match_id = re.search(r'-(\d+)/[^/]+$', match_url).group(1)

self._live_matches.append(LiveMatch(match_time, match_id, match_number, venue, date, year, series, teams, match_status))
return self._live_matches
68 changes: 51 additions & 17 deletions espncricinfo/match.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
import requests
from bs4 import BeautifulSoup
from espncricinfo.misc import *
from espncricinfo.exceptions import MatchNotFoundError, NoScorecardError

class Match(object):
Expand Down Expand Up @@ -47,27 +48,29 @@ def __init__(self, match_id):
self.followon = self._followon()
self.scheduled_overs = self._scheduled_overs()
self.innings_list = self._innings_list()
self.innings = self._innings()
self.latest_batting = self._latest_batting()
self.latest_bowling = self._latest_bowling()
self.innings = [ Inning(inn) for inn in self._innings() ]
self.latest_batting = [ Batsman(bdata) for bdata in (self._latest_batting() or []) if bdata ]
self.latest_bowling = [ Bowler(bldata) for bldata in (self._latest_bowling() or []) if bldata ]
self.latest_innings = self._latest_innings()
self.latest_innings_fow = self._latest_innings_fow()
self.team_1 = self._team_1()
self.team_1 = Team(self._team_1())
self.team_1_id = self._team_1_id()
self.team_1_abbreviation = self._team_1_abbreviation()
self.team_1_players = self._team_1_players()
self.team_1_innings = self._team_1_innings()
self.team_1_run_rate = self._team_1_run_rate()
self.team_1_overs_batted = self._team_1_overs_batted()
self.team_1_batting_result = self._team_1_batting_result()
self.team_2 = self._team_2()
self.team_2 = Team(self._team_2())
self.team_2_id = self._team_2_id()
self.team_2_abbreviation = self._team_2_abbreviation()
self.team_2_players = self._team_2_players()
self.team_2_innings = self._team_2_innings()
self.team_2_run_rate = self._team_2_run_rate()
self.team_2_overs_batted = self._team_2_overs_batted()
self.team_2_batting_result = self._team_2_batting_result()
self.note = self._note()
self.live = self._live()
if not self.status == 'dormant':
self.home_team = self._home_team()
self.batting_first = self._batting_first()
Expand Down Expand Up @@ -133,6 +136,13 @@ def __str__(self):
def __unicode__(self):
return self.json['description']

def _note(self):
return self.json['live']['status']

def _live(self):
live = Live(self.json['live'])
return live

def _status(self):
return self.match_json()['match_status']

Expand Down Expand Up @@ -339,54 +349,78 @@ def _team_2_batting_result(self):
return None

def _home_team(self):
if self._team_1_id() == self.match_json()['home_team_id']:
home_team_id = self.match_json().get('home_team_id', None)
if not home_team_id:
return None
if self._team_1_id() == home_team_id:
return self._team_1_abbreviation()
else:
return self._team_2_abbreviation()

def _batting_first(self):
if self._team_1_id() == self.match_json()['batting_first_team_id']:
batting_first_team_id = self.match_json().get('batting_first_team_id', None)
if not batting_first_team_id:
return None
if self._team_1_id() == batting_first_team_id:
return self._team_1_abbreviation()
else:
return self._team_2_abbreviation()

def _match_winner(self):
if self._team_1_id() == self.match_json()['winner_team_id']:
winner_team_id = self.match_json().get('winner_team_id', None)
if not winner_team_id:
return None
if self._team_1_id() == winner_team_id:
return self._team_1_abbreviation()
else:
return self._team_2_abbreviation()

def _toss_winner(self):
if self._team_1_id() == self.match_json()['toss_winner_team_id']:
toss_winner_team_id = self.match_json().get('toss_winner_team_id', None)
if not toss_winner_team_id:
return None
if self._team_1_id() == toss_winner_team_id:
return self._team_1_id()
else:
return self._team_2_id()

def _toss_decision(self):
if self.match_json()['toss_decision'] == '' and len(self.innings) > 0:
if self.innings[0]['batting_team_id'] == self.toss_winner:
toss_decision = self.match_json().get('toss_decision', None)
if not toss_decision:
return None
if toss_decision == '' and len(self.innings) > 0:
if self.innings[0].batting_team_id == self.toss_winner:
decision = '1'
else:
decision = '2'
else:
decision = self.match_json()['toss_decision']
decision = toss_decision
return decision

def _toss_decision_name(self):
if self.match_json()['toss_decision_name'] == '' and len(self.innings) > 0:
if self.innings[0]['batting_team_id'] == self.toss_winner:
toss_decision_name = self.match_json().get('toss_decision_name', None)
if not toss_decision_name:
return None
if toss_decision_name == '' and len(self.innings) > 0:
if self.innings[0].batting_team_id == self.toss_winner:
decision_name = 'bat'
else:
decision_name = 'bowl'
else:
decision_name = self.match_json()['toss_decision_name']
decision_name = toss_decision_name
return decision_name

def _toss_choice_team_id(self):
return self.match_json()['toss_choice_team_id']
toss_choice_team_id = self.match_json().get('toss_choice_team_id', None)
if not toss_choice_team_id:
return None
return toss_choice_team_id

def _toss_winner_team_id(self):
return self.match_json()['toss_winner_team_id']
toss_winner_team_id = self.match_json().get('toss_winner_team_id', None)
if not toss_winner_team_id:
return None
return toss_winner_team_id

# comms_json methods

Expand Down
Loading