From b450b0c519b199a06a78afc17568c38bfead18ae Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 21:08:56 +0530 Subject: [PATCH 01/31] Update series.py --- espncricinfo/series.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/espncricinfo/series.py b/espncricinfo/series.py index 7999d5e..21b3424 100644 --- a/espncricinfo/series.py +++ b/espncricinfo/series.py @@ -1,17 +1,20 @@ import requests from bs4 import BeautifulSoup from espncricinfo.exceptions import MatchNotFoundError, NoSeriesError +from espncricinfo.matches import Match +from espncricinfo.seasons import Season class Series(object): def __init__(self, series_id): self.series_id = series_id self.json_url = "http://core.espnuk.org/v2/sports/cricket/leagues/{0}/".format(str(series_id)) - self.events_url = "http://core.espnuk.org/v2/sports/cricket/leagues/{0}/events".format(str(series_id)) self.seasons_url = "http://core.espnuk.org/v2/sports/cricket/leagues/{0}/seasons".format(str(series_id)) self.headers = {'user-agent': 'Mozilla/5.0'} self.json = self.get_json(self.json_url) self.seasons = self._get_seasons() + self.events_url = f"{0}/events".format(self.seasons[0]) + self.current_season = Season(self.seasons[0].split("/seasons/")[-1]) self.years = self._get_years_from_seasons() if self.json: self.name = self.json['name'] @@ -24,6 +27,9 @@ def __init__(self, series_id): if self.events_json: self.events = self._build_events() + self.current_events = self._get_current_events() + self.matches = self._build_matches() + self.current_match = self._get_current_match() def get_json(self, url): r = requests.get(url,headers=self.headers) @@ -55,8 +61,27 @@ def _get_events(self): else: return None + def _get_current_events(self): + events_json = self.get_json(self.events[0]) + if events_json: + return [x['$ref'] for x in events_json['items']] + else: + return None + + def _get_current_matches(self): + matches = [] + for match_url in self.current_events: + matches.append(Match(match_url.split("/events/")[-1])) + return matches + def _build_events(self): events = [] for event in self.events_json: events.append(self.get_json(event['$ref'])) return events + + def _build_matches(self): + matches = [] + for match_url in self.events: + matches.append(Match(match_url.split("/events/")[-1])) + return matches From 91a8fd9071330beeed2738db2c435459758e6cb2 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 21:57:50 +0530 Subject: [PATCH 02/31] Create seasons.py --- espncricinfo/seasons.py | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 espncricinfo/seasons.py diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py new file mode 100644 index 0000000..e802c2e --- /dev/null +++ b/espncricinfo/seasons.py @@ -0,0 +1,51 @@ +import requests +from datetime import datetime +from espncricinfo.exceptions import NoSeriesError +from espncricinfo.series import Series + +class Season: + def __init__(self, season_id, season_type_id): + self.id = season_id + self.type_id = season_type_id + self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{season_type_id}/seasons/{season_id}" + self.headers = {'user-agent': 'Mozilla/5.0'} + self.json = self.get_json(self.season_url) + + if self.json: + self.year = self.json.get('year') + self.start_date = self.parse_date(self.json.get('startDate')) + self.end_date = self.parse_date(self.json.get('endDate')) + self.name = self.json.get('name') + self.short_name = self.json.get('shortName') + self.slug = self.json.get('slug') + self.teams_url = self.json.get('teams', {}).get('$ref') + self.series = self._get_series() + self.rankings_url = self.json.get('rankings', {}).get('$ref') + else: + raise NoSeriesError("Invalid season or no data found.") + + def get_json(self, url): + response = requests.get(url, headers=self.headers) + if response.status_code == 404: + raise NoSeriesError("Season not found.") + return response.json() + + def parse_date(self, date_str): + if date_str: + return datetime.strptime(date_str, "%Y-%m-%dT%H:%MZ") + return None + + def _get_series(self): + links = self.json.get('links', []) + if links and len(links)>5: + series_url = links[5]["href"] + series_id = int(series_url.split("/series/")[-1].split(".html")[0]) + series = Series(series_id) + return series + return None + + def __str__(self): + return self.name if self.name else "Unknown Season" + + def __repr__(self): + return f"Season(id={self.id}, year={self.year}, name={self.name}, start_date={self.start_date}, end_date={self.end_date})" From 6d46ebed3d557dac7011226f6e85b810f0766205 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:00:38 +0530 Subject: [PATCH 03/31] Update seasons.py --- espncricinfo/seasons.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index e802c2e..045ffef 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -4,7 +4,7 @@ from espncricinfo.series import Series class Season: - def __init__(self, season_id, season_type_id): + def __init__(self, season_id, season_type_id=8081): self.id = season_id self.type_id = season_type_id self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{season_type_id}/seasons/{season_id}" @@ -39,7 +39,7 @@ def _get_series(self): links = self.json.get('links', []) if links and len(links)>5: series_url = links[5]["href"] - series_id = int(series_url.split("/series/")[-1].split(".html")[0]) + series_id = series_url.split("/series/")[-1].split(".html")[0] series = Series(series_id) return series return None From 859a8d9ece81a9b0efa3f3a15ae6826eafbbd1dc Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:11:53 +0530 Subject: [PATCH 04/31] Update seasons.py --- espncricinfo/seasons.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index 045ffef..43fd3ac 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -9,7 +9,7 @@ def __init__(self, season_id, season_type_id=8081): self.type_id = season_type_id self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{season_type_id}/seasons/{season_id}" self.headers = {'user-agent': 'Mozilla/5.0'} - self.json = self.get_json(self.season_url) + self.json = self.get_json(self.json_url) if self.json: self.year = self.json.get('year') From 7e1511e83756b8037637e47441421f4fb1b20d7d Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:27:20 +0530 Subject: [PATCH 05/31] Update exceptions.py --- espncricinfo/exceptions.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/espncricinfo/exceptions.py b/espncricinfo/exceptions.py index ebf89f8..315cab7 100644 --- a/espncricinfo/exceptions.py +++ b/espncricinfo/exceptions.py @@ -24,4 +24,16 @@ class NoSeriesError(TypeError): """ Exception raised if a series_id is not valid or does not exist. """ - pass \ No newline at end of file + 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 From be95e51cb29bb48e682e29785610df633684c3a2 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:20:45 +0530 Subject: [PATCH 06/31] Update series.py --- espncricinfo/series.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/espncricinfo/series.py b/espncricinfo/series.py index 21b3424..9547245 100644 --- a/espncricinfo/series.py +++ b/espncricinfo/series.py @@ -2,7 +2,6 @@ from bs4 import BeautifulSoup from espncricinfo.exceptions import MatchNotFoundError, NoSeriesError from espncricinfo.matches import Match -from espncricinfo.seasons import Season class Series(object): @@ -12,9 +11,9 @@ def __init__(self, series_id): self.seasons_url = "http://core.espnuk.org/v2/sports/cricket/leagues/{0}/seasons".format(str(series_id)) self.headers = {'user-agent': 'Mozilla/5.0'} self.json = self.get_json(self.json_url) - self.seasons = self._get_seasons() + self._seasons = [] self.events_url = f"{0}/events".format(self.seasons[0]) - self.current_season = Season(self.seasons[0].split("/seasons/")[-1]) + self._current_season = None self.years = self._get_years_from_seasons() if self.json: self.name = self.json['name'] @@ -30,6 +29,26 @@ def __init__(self, series_id): self.current_events = self._get_current_events() self.matches = self._build_matches() self.current_match = self._get_current_match() + + @property + def seasons(self): + if not self._seasons: + from espncricinfo.seasons import Season + season_json = self.get_json(self.seasons_url) + if season_json: + season_urls = [x['$ref'] for x in season_json['items']] + for url in season_urls: + season = Season(url.split("/seasons/")[-1]) + self._seasons.append(season) + if len(self._seasons) > 0: + self._current_season = self._seasons[0] + return self._seasons + + @property + def current_season(self): + if not self._current_season: + self.seasons() + return self._current_season def get_json(self, url): r = requests.get(url,headers=self.headers) @@ -44,13 +63,6 @@ def __str__(self): def __unicode__(self): return self.name - def _get_seasons(self): - season_json = self.get_json(self.seasons_url) - if season_json: - return [x['$ref'] for x in season_json['items']] - else: - return None - def _get_years_from_seasons(self): return [x.split('/')[9] for x in self.seasons] From a97b9c88aadfaf41b6d1d480bb4917ceb2b7e950 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:25:56 +0530 Subject: [PATCH 07/31] Update seasons.py --- espncricinfo/seasons.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index 43fd3ac..7502ce0 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -1,7 +1,6 @@ import requests from datetime import datetime from espncricinfo.exceptions import NoSeriesError -from espncricinfo.series import Series class Season: def __init__(self, season_id, season_type_id=8081): @@ -19,11 +18,22 @@ def __init__(self, season_id, season_type_id=8081): self.short_name = self.json.get('shortName') self.slug = self.json.get('slug') self.teams_url = self.json.get('teams', {}).get('$ref') - self.series = self._get_series() + self._series = None self.rankings_url = self.json.get('rankings', {}).get('$ref') else: raise NoSeriesError("Invalid season or no data found.") + @property + def series(self): + if self._series is None: + from espncricinfo.series import Series + series_url = self.json.get('links', []) + if links and len(links)>5: + series_url = links[5]["href"] + series_id = series_url.split("/series/")[-1].split(".html")[0] + self._series = Series(series_id) + return self._series + def get_json(self, url): response = requests.get(url, headers=self.headers) if response.status_code == 404: @@ -35,15 +45,6 @@ def parse_date(self, date_str): return datetime.strptime(date_str, "%Y-%m-%dT%H:%MZ") return None - def _get_series(self): - links = self.json.get('links', []) - if links and len(links)>5: - series_url = links[5]["href"] - series_id = series_url.split("/series/")[-1].split(".html")[0] - series = Series(series_id) - return series - return None - def __str__(self): return self.name if self.name else "Unknown Season" From 6e55bc1b646dffb39d87ef83490dcabefd9dbafa Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:29:41 +0530 Subject: [PATCH 08/31] Update seasons.py --- espncricinfo/seasons.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index 7502ce0..429d2bd 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -1,6 +1,6 @@ import requests from datetime import datetime -from espncricinfo.exceptions import NoSeriesError +from espncricinfo.exceptions import NoSeasonError class Season: def __init__(self, season_id, season_type_id=8081): @@ -20,8 +20,6 @@ def __init__(self, season_id, season_type_id=8081): self.teams_url = self.json.get('teams', {}).get('$ref') self._series = None self.rankings_url = self.json.get('rankings', {}).get('$ref') - else: - raise NoSeriesError("Invalid season or no data found.") @property def series(self): @@ -37,7 +35,7 @@ def series(self): def get_json(self, url): response = requests.get(url, headers=self.headers) if response.status_code == 404: - raise NoSeriesError("Season not found.") + raise NoSeasonError("Season not found.") return response.json() def parse_date(self, date_str): From 308157e4a56176ecf9fbd08acdb4480a248d4fc7 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:41:08 +0530 Subject: [PATCH 09/31] Update seasons.py --- espncricinfo/seasons.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index 429d2bd..b60243e 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -17,8 +17,9 @@ def __init__(self, season_id, season_type_id=8081): self.name = self.json.get('name') self.short_name = self.json.get('shortName') self.slug = self.json.get('slug') - self.teams_url = self.json.get('teams', {}).get('$ref') + self._teams_url = self.json.get('teams', {}).get('$ref') self._series = None + self._teams = [] self.rankings_url = self.json.get('rankings', {}).get('$ref') @property @@ -32,6 +33,18 @@ def series(self): self._series = Series(series_id) return self._series + @property + def teams(self): + if self._teams is None: + from espncricinfo.teams import Team + teams_json = self.get_json(self._teams_url) + teams_ = teams_json.get('items', []) + for t in teams_: + team_id = t.split("/teams/")[-1] + team_ = Team(team_id) + self._teams.append(team_) + return self._teams + def get_json(self, url): response = requests.get(url, headers=self.headers) if response.status_code == 404: From 0efcfcf9aadfaf6cb549c88ee89657ef0239d322 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:51:22 +0530 Subject: [PATCH 10/31] Create teams.py --- espncricinfo/teams.py | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 espncricinfo/teams.py diff --git a/espncricinfo/teams.py b/espncricinfo/teams.py new file mode 100644 index 0000000..4ed3e51 --- /dev/null +++ b/espncricinfo/teams.py @@ -0,0 +1,54 @@ +import json +import requests +from datetime import datetime +from espncricinfo.exceptions import MatchNotFoundError, NoTeamError +from espncricinfo.match import Match + +class Team: + def __init__(self, team_id, league_id=8081): + self.id = team_id + self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{league_id}/teams/{series_id}/" + self.headers = {'user-agent': 'Mozilla/5.0'} + self.json = self.get_json(self.json_url) + + if self.json: + self.location = self.json.get('location') + self.name = self.json.get('name') + self.nickname = self.json.get('nickname') + self.short_name = self.json.get('abbreviation') + self.slug = self.json.get('slug') + self.color = self.json.get('color') + self.logo = next((logo.get("href") for logo in data.get("logos", []) if "href" in logo), None) + self.is_national = self.json.get('slug') + self.is_active = self.json.get('is_active') + self.match_date = self.parse_date(self.json.get('event').get('date')) + self._match_url = self.json.get('event').get('$ref') + self.match = Match(self.match_url.split("/events/")[-1]) + self._players_url = self.json.get('athletes').get('$ref') + self._players = [] + + @property + def players(self): + if not self._players: + from espncricinfo.player import Player + players_json = self.get_json(self._players_url) + if players_json: + player_urls = [x['$ref'] for x in players_json['items']] + for url in player_urls: + player_ = Player(url.split("/athletes/")[-1]) + self._players.append(player_) + return self._players + + def get_json(self, url): + response = requests.get(url, headers=self.headers) + if response.status_code == 404: + raise NoTeamError("Season not found.") + return response.json() + + def parse_date(self, date_str): + if date_str: + return datetime.strptime(date_str, "%Y-%m-%dT%H:%MZ") + return None + + def __repr__(self): + return f"Team({self.team_id}, {self.name}, {self.short_name})" From a76522cbd7e4723dcdaee19271b3af59951857f2 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:57:39 +0530 Subject: [PATCH 11/31] Update seasons.py --- espncricinfo/seasons.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index b60243e..4ab38a8 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -26,7 +26,7 @@ def __init__(self, season_id, season_type_id=8081): def series(self): if self._series is None: from espncricinfo.series import Series - series_url = self.json.get('links', []) + links = self.json.get('links', []) if links and len(links)>5: series_url = links[5]["href"] series_id = series_url.split("/series/")[-1].split(".html")[0] From 70b89018998d0ad19b0c96d95f4deec652e01c8b Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Mon, 24 Feb 2025 00:10:35 +0530 Subject: [PATCH 12/31] Update series.py --- espncricinfo/series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/series.py b/espncricinfo/series.py index 9547245..87b3298 100644 --- a/espncricinfo/series.py +++ b/espncricinfo/series.py @@ -28,7 +28,7 @@ def __init__(self, series_id): self.events = self._build_events() self.current_events = self._get_current_events() self.matches = self._build_matches() - self.current_match = self._get_current_match() + self.current_matches = self._get_current_matches() @property def seasons(self): From df4cc606873e856058fc15ce6e9993f0570b9686 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 17:10:28 +0530 Subject: [PATCH 13/31] Update seasons.py --- espncricinfo/seasons.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/espncricinfo/seasons.py b/espncricinfo/seasons.py index 4ab38a8..0f466b8 100644 --- a/espncricinfo/seasons.py +++ b/espncricinfo/seasons.py @@ -3,10 +3,10 @@ from espncricinfo.exceptions import NoSeasonError class Season: - def __init__(self, season_id, season_type_id=8081): + def __init__(self, season_id, series_id=8039): self.id = season_id - self.type_id = season_type_id - self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{season_type_id}/seasons/{season_id}" + self.series_id = series_id + self.json_url = f"http://core.espnuk.org/v2/sports/cricket/leagues/{series_id}/seasons/{season_id}" self.headers = {'user-agent': 'Mozilla/5.0'} self.json = self.get_json(self.json_url) From ff1baaa454c3decc8fc74ae84162614a623188cc Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 18:54:16 +0530 Subject: [PATCH 14/31] Update match.py --- espncricinfo/match.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index e96bc8a..2750b62 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -68,6 +68,7 @@ def __init__(self, match_id): 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() if not self.status == 'dormant': self.home_team = self._home_team() self.batting_first = self._batting_first() @@ -133,6 +134,9 @@ def __str__(self): def __unicode__(self): return self.json['description'] + def _note(self): + return self.match_json()['_note'] + def _status(self): return self.match_json()['match_status'] From 81a4c2d19677b26be5bfdc10ce39e04f70707a88 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 19:42:16 +0530 Subject: [PATCH 15/31] Update match.py --- espncricinfo/match.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 2750b62..0c78b5a 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -135,7 +135,7 @@ def __unicode__(self): return self.json['description'] def _note(self): - return self.match_json()['_note'] + return self.match_json()['note'] def _status(self): return self.match_json()['match_status'] From dc64db47df78d3d46c5adb0366845b7107a4459b Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 19:45:16 +0530 Subject: [PATCH 16/31] Update match.py --- espncricinfo/match.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 0c78b5a..0d6848c 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -135,7 +135,7 @@ def __unicode__(self): return self.json['description'] def _note(self): - return self.match_json()['note'] + return self.match_json()['competitions'][0]['note'] def _status(self): return self.match_json()['match_status'] From b25694f31ce36bfe48ebd1e3a5ca0e59350764fe Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:05 +0530 Subject: [PATCH 17/31] Update match.py --- espncricinfo/match.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 0d6848c..61d8b12 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -135,7 +135,7 @@ def __unicode__(self): return self.json['description'] def _note(self): - return self.match_json()['competitions'][0]['note'] + return self.match_json()['live']['status'] def _status(self): return self.match_json()['match_status'] From 92ab92a1463ca16350431f33b46e50c0345fd43d Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:15 +0530 Subject: [PATCH 18/31] Update match.py --- espncricinfo/match.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 61d8b12..0bbef55 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -135,7 +135,7 @@ def __unicode__(self): return self.json['description'] def _note(self): - return self.match_json()['live']['status'] + return self.json()['live']['status'] def _status(self): return self.match_json()['match_status'] From 16a26d460132e4b1bcbe6bef34442441d04ee652 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:15:04 +0530 Subject: [PATCH 19/31] Update match.py --- espncricinfo/match.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 0bbef55..6aa4831 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -135,7 +135,7 @@ def __unicode__(self): return self.json['description'] def _note(self): - return self.json()['live']['status'] + return self.json['live']['status'] def _status(self): return self.match_json()['match_status'] From 0c6b3e9a21f0489c53c3459e94846cc936cd76ab Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Thu, 6 Mar 2025 14:30:58 +0530 Subject: [PATCH 20/31] update --- espncricinfo/match.py | 20 ++-- espncricinfo/misc.py | 206 +++++++++++++++++++++++++++++++++++++++++ espncricinfo/series.py | 4 +- 3 files changed, 220 insertions(+), 10 deletions(-) create mode 100644 espncricinfo/misc.py diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 6aa4831..d9acac5 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -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): @@ -47,12 +48,12 @@ 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() ] + self.latest_bowling = [ Bowler(bldata) for bldata in self._latest_bowling() ] 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() @@ -60,7 +61,7 @@ def __init__(self, match_id): 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() @@ -69,6 +70,7 @@ def __init__(self, match_id): 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() @@ -137,6 +139,10 @@ def __unicode__(self): def _note(self): return self.json['live']['status'] + def _live(self): + live = Live(self.json) + return live + def _status(self): return self.match_json()['match_status'] @@ -368,7 +374,7 @@ def _toss_winner(self): 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: + if self.innings[0].batting_team_id == self.toss_winner: decision = '1' else: decision = '2' @@ -378,7 +384,7 @@ def _toss_decision(self): 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: + if self.innings[0].batting_team_id == self.toss_winner: decision_name = 'bat' else: decision_name = 'bowl' diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py new file mode 100644 index 0000000..c20b933 --- /dev/null +++ b/espncricinfo/misc.py @@ -0,0 +1,206 @@ + +class BatterPlaying: + def __init__(self, batting_data): + self.balls_faced = int(batting_data.get("balls_faced", 0)) + self.batting_position = int(batting_data.get("batting_position", 0)) + self.fours = int(batting_data.get("fours", 0)) + self.innings_number = int(batting_data.get("innings_number", 0)) + self.live_current = int(batting_data.get("live_current", 0)) + self.is_batting = batting_data.get("live_current_name") == "striker" + self.minutes = int(batting_data.get("minutes", 0)) + self.player_id = int(batting_data.get("player_id") or 0) + self.runs = int(batting_data.get("runs", 0)) + self.sixes = int(batting_data.get("sixes", 0)) + self.strike_rate = float(batting_data.get("strike_rate") or 0.0) + self.team_id = int(batting_data.get("team_id") or 0) + + def __repr__(self): + return f"BatterPlaying(Player ID: {self.player_id}, Runs: {self.runs}, Balls Faced: {self.balls_faced})" + +class BowlerPlaying: + def __init__(self, bowling_data): + self.player_id = int(bowling_data.get("player_id") or 0) + self.team_id = int(bowling_data.get("team_id") or 0) + self.innings_number = int(bowling_data.get("innings_number", 0)) + self.overs = float(bowling_data.get("overs") or 0.0) + self.maidens = int(bowling_data.get("maidens", 0)) + self.conceded = int(bowling_data.get("conceded", 0)) + self.wickets = int(bowling_data.get("wickets", 0)) + self.economy_rate = float(bowling_data.get("economy_rate") or 0.0) + self.noballs = int(bowling_data.get("noballs", 0)) + self.wides = int(bowling_data.get("wides", 0)) + self.live_current = int(bowling_data.get("live_current", 0)) + self.is_bowling = bowling_data.get("live_current_name", "") == "current bowler" + + def __repr__(self): + return f"BowlerPlaying(Player ID: {self.player_id}, Overs: {self.overs}, Wickets: {self.wickets}, Economy: {self.economy_rate})" + +class Batsman: + def __init__(self, data): + self.balls_faced = int(data.get("balls_faced", 0)) + self.hand = data.get("hand", "") + self.image_path = data.get("image_path", "") + self.name = data.get("known_as", "") + self.notout = int(data.get("notout", 0)) + self.player_id = int(data.get("player_id") or 0) + self.popular_name = data.get("popular_name", "") + self.position = int(data.get("position", 0)) + self.position_group = data.get("position_group", "") + self.runs = int(data.get("runs", 0)) + + def __str__(self): + return (f"Batsman {self.known_as} (ID: {self.player_id}): " + f"Runs: {self.runs}, Balls Faced: {self.balls_faced}, " + f"Position: {self.position} ({self.position_group}), " + f"Not Out: {'Yes' if self.notout else 'No'}") + +class Bowler: + def __init__(self, data): + self.conceded = int(data.get("conceded", 0)) + self.hand = data.get("hand", "") + self.image_path = data.get("image_path", "") + self.name = data.get("known_as", "") + self.maidens = int(data.get("maidens", 0)) + self.overs = float(data.get("overs") or 0.0) + self.pacespin = data.get("pacespin", "") + self.player_id = int(data.get("player_id") or 0) + self.popular_name = data.get("popular_name", "") + self.position = int(data.get("position", 0)) + self.wickets = int(data.get("wickets", 0)) + self.is_bowling = data.get("live_current_name", "") == "current bowler" + self.is_previous = data.get("live_current_name", "") == "previous bowler" + + def __str__(self): + return (f"Bowler {self.known_as} (ID: {self.player_id}): " + f"Wickets: {self.wickets}, Overs: {self.overs}, Runs Conceded: {self.conceded}, " + f"Maidens: {self.maidens}, Bowling Style: {self.pacespin}, " + f"Hand: {self.hand}, Position: {self.position}, " + f"Current Status: {self.live_current_name}") + +class Inning: + def __init__(self, data): + self.ball_limit = int(data.get("ball_limit", 0)) + self.balls = int(data.get("balls", 0)) + self.batted = int(data.get("batted", 0)) + self.batting_team_id = int(data.get("batting_team_id") or 0) + self.bowling_team_id = int(data.get("bowling_team_id") or 0) + self.bpo = int(data.get("bpo", 6)) # Balls per over + self.byes = int(data.get("byes", 0)) + self.event = int(data.get("event", 0)) + self.event_name = data.get("event_name", "") + self.extras = int(data.get("extras", 0)) + self.number = int(data.get("innings_number", 0)) + self.numth = data.get("innings_numth", "") + self.lead = int(data.get("lead", 0)) + self.legbyes = int(data.get("legbyes", 0)) + self.live_current = int(data.get("live_current", 0)) + self.live_current_name = data.get("live_current_name", "") + self.minutes = data.get("minutes") + self.noballs = int(data.get("noballs", 0)) + self.old_penalty_or_bonus = int(data.get("old_penalty_or_bonus", 0)) + self.over_limit = float(data.get("over_limit") or 0.0) + self.over_limit_run_rate = float(data.get("over_limit_run_rate") or 0.0) + self.over_split_limit = float(data.get("over_split_limit") or 0.0) + self.overs = float(data.get("overs") or 0.0) + self.overs_docked = int(data.get("overs_docked", 0)) + self.penalties = int(data.get("penalties", 0)) + self.penalties_field_end = int(data.get("penalties_field_end", 0)) + self.penalties_field_start = int(data.get("penalties_field_start", 0)) + self.run_rate = float(data.get("run_rate") or 0.0) + self.runs = int(data.get("runs", 0)) + self.target = int(data.get("target", 0)) + self.wickets = int(data.get("wickets", 0)) + self.wides = int(data.get("wides", 0)) + + def __str__(self): + return (f"Innings {self.innings_number} ({self.innings_numth}): " + f"{self.batting_team_id} vs {self.bowling_team_id}, " + f"Runs: {self.runs}, Wickets: {self.wickets}, Overs: {self.overs}, " + f"Run Rate: {self.run_rate}, Event: {self.event_name}") + +class Player: + def __init__(self, player_data): + self.age_days = int(player_data.get("age_days", 0)) + self.age_years = int(player_data.get("age_years", 0)) + self.alpha_name = player_data.get("alpha_name") + self.batting_hand = player_data.get("batting_hand") + self.batting_style = player_data.get("batting_style") + self.batting_style_long = player_data.get("batting_style_long") + self.bowling_hand = player_data.get("bowling_hand") + self.bowling_pacespin = player_data.get("bowling_pacespin") + self.bowling_style = player_data.get("bowling_style") + self.bowling_style_long = player_data.get("bowling_style_long") + self.captain = int(player_data.get("captain", 0)) + self.card_long = player_data.get("card_long") + self.card_qualifier = player_data.get("card_qualifier") + self.card_short = player_data.get("card_short") + self.dob = player_data.get("dob") + self.image_id = int(player_data.get("image_id") or 0) + self.keeper = int(player_data.get("keeper", 0)) + self.name = player_data.get("known_as") + self.match_player_id = int(player_data.get("match_player_id") or 0) + self.mobile_name = player_data.get("mobile_name") + self.object_id = int(player_data.get("object_id") or 0) + self.id = int(player_data.get("player_id") or 0) + self.name_id = player_data.get("player_name_id", "0") + self.primary_role = player_data.get("player_primary_role") + self.style_id = int(player_data.get("player_style_id") or 0) + self.p_type = int(player_data.get("player_type", 0)) + self.type_name = player_data.get("player_type_name") + self.popular_name = player_data.get("popular_name") + self.portrait_alt_id = player_data.get("portrait_alt_id") + self.portrait_object_id = int(player_data.get("portrait_object_id") or 0) + self.status_id = int(player_data.get("status_id") or 0) + + def __repr__(self): + return f"Player({self.known_as}, {self.batting_hand}, {self.bowling_style_long})" + +class Team: + def __init__(self, team_data): + self.batsmen_in_side = int(team_data.get("batsmen_in_side", 0)) + self.content_id = int(team_data.get("content_id") or 0) + self.country_id = int(team_data.get("country_id") or 0) + self.fielders_in_side = int(team_data.get("fielders_in_side", 0)) + self.image_id = int(team_data.get("image_id") or 0) + self.logo_alt_id = team_data.get("logo_alt_id") + self.logo_espncdn = team_data.get("logo_espncdn") + self.logo_height = int(team_data.get("logo_height", 0)) + self.logo_image_height = int(team_data.get("logo_image_height", 0)) + self.logo_image_path = team_data.get("logo_image_path") + self.logo_image_width = int(team_data.get("logo_image_width", 0)) + self.logo_object_id = int(team_data.get("logo_object_id") or 0) + self.logo_path = team_data.get("logo_path") + self.logo_width = int(team_data.get("logo_width", 0)) + self.object_id = int(team_data.get("object_id") or 0) + self.players = [Player(p) for p in team_data.get("player", [])] + self.players_in_side = int(team_data.get("players_in_side", 0)) + self.site_id = int(team_data.get("site_id") or 0) + self.abbreviation = team_data.get("team_abbreviation") + self.filename = team_data.get("team_filename") + self.general_name = team_data.get("team_general_name") + self.id = int(team_data.get("team_id") or 0) + self.name = team_data.get("team_name") + self.short_name = team_data.get("team_short_name") + self.url_component = team_data.get("url_component") + + def __repr__(self): + return f"Team({self.team_name}, Players: {len(self.players)})" + +class Live: + def __init__(self, json_data): + self.batting = [ BatterPlaying(data) for data in json_data['live']['batting'] ] + self.bowling = [ BowlerPlaying(data) for data in json_data['live']['bowling'] ] + self.status = json_data['live']['status'] + self.ball_limit = int(json_data['live']['innings']['ball_limit']) + self.balls = int(json_data['live']['innings']['balls']) + self.current_inning = int(json_data['live']['innings']['innings_number']) + self.batting_team_id = int(json_data['live']['innings']['batting_team_id']) + self.bowling_team_id = int(json_data['live']['innings']['bowling_team_id']) + self.overs = float(json_data['live']['innings'].get('overs') or 0.0) + self.remaining_balls = int(json_data['live']['innings']['remaining_balls']) + self.rrr = float(json_data['live']['innings'].get('required_run_rate') or 0.0) + self.crr = float(json_data['live']['innings'].get('run_rate') or 0.0) + self.runs = int(json_data['live']['innings']['runs']) + self.target = int(json_data['live']['innings']['target']) + self.team_id = int(json_data['live']['innings']['team_id']) + self.wickets = int(json_data['live']['innings']['wickets']) \ No newline at end of file diff --git a/espncricinfo/series.py b/espncricinfo/series.py index 87b3298..677b408 100644 --- a/espncricinfo/series.py +++ b/espncricinfo/series.py @@ -1,10 +1,8 @@ import requests -from bs4 import BeautifulSoup from espncricinfo.exceptions import MatchNotFoundError, NoSeriesError -from espncricinfo.matches import Match +from espncricinfo.match import Match class Series(object): - def __init__(self, series_id): self.series_id = series_id self.json_url = "http://core.espnuk.org/v2/sports/cricket/leagues/{0}/".format(str(series_id)) From 4eac73da43aa33c9f97d34d63fb80440d03671e8 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Thu, 6 Mar 2025 19:01:29 +0530 Subject: [PATCH 21/31] bug fixes --- espncricinfo/match.py | 48 ++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index d9acac5..4555426 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -49,8 +49,8 @@ def __init__(self, match_id): self.scheduled_overs = self._scheduled_overs() self.innings_list = self._innings_list() self.innings = [ Inning(inn) for inn in self._innings() ] - self.latest_batting = [ Batsman(bdata) for bdata in self._latest_batting() ] - self.latest_bowling = [ Bowler(bldata) for bldata in self._latest_bowling() ] + 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 = Team(self._team_1()) @@ -349,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: + 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: + 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 From 2adeb897f32c1d056cb1a167a0d732537aa7aac5 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Thu, 6 Mar 2025 19:02:47 +0530 Subject: [PATCH 22/31] bug fixes --- espncricinfo/misc.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index c20b933..17f6dc9 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -191,16 +191,16 @@ def __init__(self, json_data): self.batting = [ BatterPlaying(data) for data in json_data['live']['batting'] ] self.bowling = [ BowlerPlaying(data) for data in json_data['live']['bowling'] ] self.status = json_data['live']['status'] - self.ball_limit = int(json_data['live']['innings']['ball_limit']) - self.balls = int(json_data['live']['innings']['balls']) - self.current_inning = int(json_data['live']['innings']['innings_number']) - self.batting_team_id = int(json_data['live']['innings']['batting_team_id']) - self.bowling_team_id = int(json_data['live']['innings']['bowling_team_id']) - self.overs = float(json_data['live']['innings'].get('overs') or 0.0) - self.remaining_balls = int(json_data['live']['innings']['remaining_balls']) - self.rrr = float(json_data['live']['innings'].get('required_run_rate') or 0.0) - self.crr = float(json_data['live']['innings'].get('run_rate') or 0.0) - self.runs = int(json_data['live']['innings']['runs']) - self.target = int(json_data['live']['innings']['target']) - self.team_id = int(json_data['live']['innings']['team_id']) - self.wickets = int(json_data['live']['innings']['wickets']) \ No newline at end of file + self.ball_limit = int(json_data['live'].get('innings', {}).get('ball_limit') or 0) + self.balls = int(json_data['live'].get('innings', {}).get('balls') or 0) + self.current_inning = int(json_data['live'].get('innings', {}).get('innings_number') or 0) + self.batting_team_id = int(json_data['live'].get('innings', {}).get('batting_team_id') or 0) + self.bowling_team_id = int(json_data['live'].get('innings', {}).get('bowling_team_id') or 0) + self.overs = float(json_data['live'].get('innings', {}).get('overs') or 0.0) + self.remaining_balls = int(json_data['live'].get('innings', {}).get('remaining_balls') or 0) + self.rrr = float(json_data['live'].get('innings', {}).get('required_run_rate') or 0.0) + self.crr = float(json_data['live'].get('innings', {}).get('run_rate') or 0.0) + self.runs = int(json_data['live'].get('innings', {}).get('runs') or 0) + self.target = int(json_data['live'].get('innings', {}).get('target') or 0) + self.team_id = int(json_data['live'].get('innings', {}).get('team_id') or 0) + self.wickets = int(json_data['live'].get('innings', {}).get('wickets') or 0) From 11b3afdb8a8b927214d3cdb46849662082b7f802 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Thu, 6 Mar 2025 20:20:07 +0530 Subject: [PATCH 23/31] bug fixes --- espncricinfo/misc.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index 17f6dc9..0106f37 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -1,16 +1,16 @@ class BatterPlaying: def __init__(self, batting_data): - self.balls_faced = int(batting_data.get("balls_faced", 0)) - self.batting_position = int(batting_data.get("batting_position", 0)) - self.fours = int(batting_data.get("fours", 0)) - self.innings_number = int(batting_data.get("innings_number", 0)) + self.balls_faced = int(batting_data.get("balls_faced") or 0) + self.batting_position = int(batting_data.get("batting_position") or 0) + self.fours = int(batting_data.get("fours") or 0) + self.innings_number = int(batting_data.get("innings_number") or 0) self.live_current = int(batting_data.get("live_current", 0)) self.is_batting = batting_data.get("live_current_name") == "striker" - self.minutes = int(batting_data.get("minutes", 0)) + self.minutes = int(batting_data.get("minutes") or 0) self.player_id = int(batting_data.get("player_id") or 0) - self.runs = int(batting_data.get("runs", 0)) - self.sixes = int(batting_data.get("sixes", 0)) + self.runs = int(batting_data.get("runs") or 0) + self.sixes = int(batting_data.get("sixes") or 0) self.strike_rate = float(batting_data.get("strike_rate") or 0.0) self.team_id = int(batting_data.get("team_id") or 0) @@ -21,15 +21,15 @@ class BowlerPlaying: def __init__(self, bowling_data): self.player_id = int(bowling_data.get("player_id") or 0) self.team_id = int(bowling_data.get("team_id") or 0) - self.innings_number = int(bowling_data.get("innings_number", 0)) + self.innings_number = int(bowling_data.get("innings_number") or 0) self.overs = float(bowling_data.get("overs") or 0.0) - self.maidens = int(bowling_data.get("maidens", 0)) + self.maidens = int(bowling_data.get("maidens") or 0) self.conceded = int(bowling_data.get("conceded", 0)) - self.wickets = int(bowling_data.get("wickets", 0)) + self.wickets = int(bowling_data.get("wickets") or 0) self.economy_rate = float(bowling_data.get("economy_rate") or 0.0) - self.noballs = int(bowling_data.get("noballs", 0)) - self.wides = int(bowling_data.get("wides", 0)) - self.live_current = int(bowling_data.get("live_current", 0)) + self.noballs = int(bowling_data.get("noballs") or 0) + self.wides = int(bowling_data.get("wides") or 0) + self.live_current = int(bowling_data.get("live_current") or 0) self.is_bowling = bowling_data.get("live_current_name", "") == "current bowler" def __repr__(self): From f68783e79704673508ad0763556d79af51787f61 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Fri, 7 Mar 2025 15:38:01 +0530 Subject: [PATCH 24/31] Fixed NoneType error --- espncricinfo/misc.py | 86 ++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index 0106f37..31e5c4e 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -5,7 +5,7 @@ def __init__(self, batting_data): self.batting_position = int(batting_data.get("batting_position") or 0) self.fours = int(batting_data.get("fours") or 0) self.innings_number = int(batting_data.get("innings_number") or 0) - self.live_current = int(batting_data.get("live_current", 0)) + self.live_current = int(batting_data.get("live_current") or 0) self.is_batting = batting_data.get("live_current_name") == "striker" self.minutes = int(batting_data.get("minutes") or 0) self.player_id = int(batting_data.get("player_id") or 0) @@ -24,7 +24,7 @@ def __init__(self, bowling_data): self.innings_number = int(bowling_data.get("innings_number") or 0) self.overs = float(bowling_data.get("overs") or 0.0) self.maidens = int(bowling_data.get("maidens") or 0) - self.conceded = int(bowling_data.get("conceded", 0)) + self.conceded = int(bowling_data.get("conceded") or 0) self.wickets = int(bowling_data.get("wickets") or 0) self.economy_rate = float(bowling_data.get("economy_rate") or 0.0) self.noballs = int(bowling_data.get("noballs") or 0) @@ -37,16 +37,16 @@ def __repr__(self): class Batsman: def __init__(self, data): - self.balls_faced = int(data.get("balls_faced", 0)) + self.balls_faced = int(data.get("balls_faced") or 0) self.hand = data.get("hand", "") self.image_path = data.get("image_path", "") self.name = data.get("known_as", "") - self.notout = int(data.get("notout", 0)) + self.notout = int(data.get("notout") or 0) self.player_id = int(data.get("player_id") or 0) self.popular_name = data.get("popular_name", "") - self.position = int(data.get("position", 0)) + self.position = int(data.get("position") or 0) self.position_group = data.get("position_group", "") - self.runs = int(data.get("runs", 0)) + self.runs = int(data.get("runs") or 0) def __str__(self): return (f"Batsman {self.known_as} (ID: {self.player_id}): " @@ -56,17 +56,17 @@ def __str__(self): class Bowler: def __init__(self, data): - self.conceded = int(data.get("conceded", 0)) + self.conceded = int(data.get("conceded") or 0) self.hand = data.get("hand", "") self.image_path = data.get("image_path", "") self.name = data.get("known_as", "") - self.maidens = int(data.get("maidens", 0)) + self.maidens = int(data.get("maidens") or 0) self.overs = float(data.get("overs") or 0.0) self.pacespin = data.get("pacespin", "") self.player_id = int(data.get("player_id") or 0) self.popular_name = data.get("popular_name", "") - self.position = int(data.get("position", 0)) - self.wickets = int(data.get("wickets", 0)) + self.position = int(data.get("position") or 0) + self.wickets = int(data.get("wickets") or 0) self.is_bowling = data.get("live_current_name", "") == "current bowler" self.is_previous = data.get("live_current_name", "") == "previous bowler" @@ -79,38 +79,38 @@ def __str__(self): class Inning: def __init__(self, data): - self.ball_limit = int(data.get("ball_limit", 0)) - self.balls = int(data.get("balls", 0)) - self.batted = int(data.get("batted", 0)) + self.ball_limit = int(data.get("ball_limit") or 0) + self.balls = int(data.get("balls") or 0) + self.batted = int(data.get("batted") or 0) self.batting_team_id = int(data.get("batting_team_id") or 0) self.bowling_team_id = int(data.get("bowling_team_id") or 0) - self.bpo = int(data.get("bpo", 6)) # Balls per over - self.byes = int(data.get("byes", 0)) - self.event = int(data.get("event", 0)) + self.bpo = int(data.get("bpo") or 6) + self.byes = int(data.get("byes") or 0) + self.event = int(data.get("event") or 0) self.event_name = data.get("event_name", "") - self.extras = int(data.get("extras", 0)) - self.number = int(data.get("innings_number", 0)) + self.extras = int(data.get("extras") or 0) + self.number = int(data.get("innings_number") or 0) self.numth = data.get("innings_numth", "") - self.lead = int(data.get("lead", 0)) - self.legbyes = int(data.get("legbyes", 0)) - self.live_current = int(data.get("live_current", 0)) + self.lead = int(data.get("lead") or 0) + self.legbyes = int(data.get("legbyes") or 0) + self.live_current = int(data.get("live_current") or 0) self.live_current_name = data.get("live_current_name", "") self.minutes = data.get("minutes") - self.noballs = int(data.get("noballs", 0)) - self.old_penalty_or_bonus = int(data.get("old_penalty_or_bonus", 0)) + self.noballs = int(data.get("noballs") or 0) + self.old_penalty_or_bonus = int(data.get("old_penalty_or_bonus") or 0) self.over_limit = float(data.get("over_limit") or 0.0) self.over_limit_run_rate = float(data.get("over_limit_run_rate") or 0.0) self.over_split_limit = float(data.get("over_split_limit") or 0.0) self.overs = float(data.get("overs") or 0.0) - self.overs_docked = int(data.get("overs_docked", 0)) - self.penalties = int(data.get("penalties", 0)) - self.penalties_field_end = int(data.get("penalties_field_end", 0)) - self.penalties_field_start = int(data.get("penalties_field_start", 0)) + self.overs_docked = int(data.get("overs_docked") or 0) + self.penalties = int(data.get("penalties") or 0) + self.penalties_field_end = int(data.get("penalties_field_end") or 0) + self.penalties_field_start = int(data.get("penalties_field_start") or 0) self.run_rate = float(data.get("run_rate") or 0.0) - self.runs = int(data.get("runs", 0)) - self.target = int(data.get("target", 0)) - self.wickets = int(data.get("wickets", 0)) - self.wides = int(data.get("wides", 0)) + self.runs = int(data.get("runs") or 0) + self.target = int(data.get("target") or 0) + self.wickets = int(data.get("wickets") or 0) + self.wides = int(data.get("wides") or 0) def __str__(self): return (f"Innings {self.innings_number} ({self.innings_numth}): " @@ -120,8 +120,8 @@ def __str__(self): class Player: def __init__(self, player_data): - self.age_days = int(player_data.get("age_days", 0)) - self.age_years = int(player_data.get("age_years", 0)) + self.age_days = int(player_data.get("age_days") or 0) + self.age_years = int(player_data.get("age_years") or 0) self.alpha_name = player_data.get("alpha_name") self.batting_hand = player_data.get("batting_hand") self.batting_style = player_data.get("batting_style") @@ -130,13 +130,13 @@ def __init__(self, player_data): self.bowling_pacespin = player_data.get("bowling_pacespin") self.bowling_style = player_data.get("bowling_style") self.bowling_style_long = player_data.get("bowling_style_long") - self.captain = int(player_data.get("captain", 0)) + self.captain = int(player_data.get("captain") or 0) self.card_long = player_data.get("card_long") self.card_qualifier = player_data.get("card_qualifier") self.card_short = player_data.get("card_short") self.dob = player_data.get("dob") self.image_id = int(player_data.get("image_id") or 0) - self.keeper = int(player_data.get("keeper", 0)) + self.keeper = int(player_data.get("keeper") or 0) self.name = player_data.get("known_as") self.match_player_id = int(player_data.get("match_player_id") or 0) self.mobile_name = player_data.get("mobile_name") @@ -145,7 +145,7 @@ def __init__(self, player_data): self.name_id = player_data.get("player_name_id", "0") self.primary_role = player_data.get("player_primary_role") self.style_id = int(player_data.get("player_style_id") or 0) - self.p_type = int(player_data.get("player_type", 0)) + self.p_type = int(player_data.get("player_type") or 0) self.type_name = player_data.get("player_type_name") self.popular_name = player_data.get("popular_name") self.portrait_alt_id = player_data.get("portrait_alt_id") @@ -157,23 +157,23 @@ def __repr__(self): class Team: def __init__(self, team_data): - self.batsmen_in_side = int(team_data.get("batsmen_in_side", 0)) + self.batsmen_in_side = int(team_data.get("batsmen_in_side") or 0) self.content_id = int(team_data.get("content_id") or 0) self.country_id = int(team_data.get("country_id") or 0) - self.fielders_in_side = int(team_data.get("fielders_in_side", 0)) + self.fielders_in_side = int(team_data.get("fielders_in_side") or 0) self.image_id = int(team_data.get("image_id") or 0) self.logo_alt_id = team_data.get("logo_alt_id") self.logo_espncdn = team_data.get("logo_espncdn") - self.logo_height = int(team_data.get("logo_height", 0)) - self.logo_image_height = int(team_data.get("logo_image_height", 0)) + self.logo_height = int(team_data.get("logo_height") or 0) + self.logo_image_height = int(team_data.get("logo_image_height") or 0) self.logo_image_path = team_data.get("logo_image_path") - self.logo_image_width = int(team_data.get("logo_image_width", 0)) + self.logo_image_width = int(team_data.get("logo_image_width") or 0) self.logo_object_id = int(team_data.get("logo_object_id") or 0) self.logo_path = team_data.get("logo_path") - self.logo_width = int(team_data.get("logo_width", 0)) + self.logo_width = int(team_data.get("logo_width") or 0) self.object_id = int(team_data.get("object_id") or 0) self.players = [Player(p) for p in team_data.get("player", [])] - self.players_in_side = int(team_data.get("players_in_side", 0)) + self.players_in_side = int(team_data.get("players_in_side") or 0) self.site_id = int(team_data.get("site_id") or 0) self.abbreviation = team_data.get("team_abbreviation") self.filename = team_data.get("team_filename") From db6fcf82d8f52c3ecbbb1812bb14c74fcb9485a2 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:11:35 +0530 Subject: [PATCH 25/31] update "Live" class --- espncricinfo/match.py | 2 +- espncricinfo/misc.py | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/espncricinfo/match.py b/espncricinfo/match.py index 4555426..60a7988 100644 --- a/espncricinfo/match.py +++ b/espncricinfo/match.py @@ -140,7 +140,7 @@ def _note(self): return self.json['live']['status'] def _live(self): - live = Live(self.json) + live = Live(self.json['live']) return live def _status(self): diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index 31e5c4e..420640c 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -188,19 +188,19 @@ def __repr__(self): class Live: def __init__(self, json_data): - self.batting = [ BatterPlaying(data) for data in json_data['live']['batting'] ] - self.bowling = [ BowlerPlaying(data) for data in json_data['live']['bowling'] ] - self.status = json_data['live']['status'] - self.ball_limit = int(json_data['live'].get('innings', {}).get('ball_limit') or 0) - self.balls = int(json_data['live'].get('innings', {}).get('balls') or 0) - self.current_inning = int(json_data['live'].get('innings', {}).get('innings_number') or 0) - self.batting_team_id = int(json_data['live'].get('innings', {}).get('batting_team_id') or 0) - self.bowling_team_id = int(json_data['live'].get('innings', {}).get('bowling_team_id') or 0) - self.overs = float(json_data['live'].get('innings', {}).get('overs') or 0.0) - self.remaining_balls = int(json_data['live'].get('innings', {}).get('remaining_balls') or 0) - self.rrr = float(json_data['live'].get('innings', {}).get('required_run_rate') or 0.0) - self.crr = float(json_data['live'].get('innings', {}).get('run_rate') or 0.0) - self.runs = int(json_data['live'].get('innings', {}).get('runs') or 0) - self.target = int(json_data['live'].get('innings', {}).get('target') or 0) - self.team_id = int(json_data['live'].get('innings', {}).get('team_id') or 0) - self.wickets = int(json_data['live'].get('innings', {}).get('wickets') or 0) + self.batting = [ BatterPlaying(data) for data in json_data['batting'] ] + self.bowling = [ BowlerPlaying(data) for data in json_data['bowling'] ] + self.status = json_data['status'] + self.ball_limit = int(json_data.get('innings', {}).get('ball_limit') or 0) + self.balls = int(json_data.get('innings', {}).get('balls') or 0) + self.current_inning = int(json_data.get('innings', {}).get('innings_number') or 0) + self.batting_team_id = int(json_data.get('innings', {}).get('batting_team_id') or 0) + self.bowling_team_id = int(json_data.get('innings', {}).get('bowling_team_id') or 0) + self.overs = float(json_data.get('innings', {}).get('overs') or 0.0) + self.remaining_balls = int(json_data.get('innings', {}).get('remaining_balls') or 0) + self.rrr = float(json_data.get('innings', {}).get('required_run_rate') or 0.0) + self.crr = float(json_data.get('innings', {}).get('run_rate') or 0.0) + self.runs = int(json_data.get('innings', {}).get('runs') or 0) + self.target = int(json_data.get('innings', {}).get('target') or 0) + self.team_id = int(json_data.get('innings', {}).get('team_id') or 0) + self.wickets = int(json_data.get('innings', {}).get('wickets') or 0) From fc89b85b50cbb9cc77e5d61896714b17e8a584e2 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Fri, 7 Mar 2025 23:06:31 +0530 Subject: [PATCH 26/31] update --- espncricinfo/misc.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index 420640c..5700515 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -11,8 +11,8 @@ def __init__(self, batting_data): self.player_id = int(batting_data.get("player_id") or 0) self.runs = int(batting_data.get("runs") or 0) self.sixes = int(batting_data.get("sixes") or 0) - self.strike_rate = float(batting_data.get("strike_rate") or 0.0) self.team_id = int(batting_data.get("team_id") or 0) + self.strike_rate = batting_data.get("strike_rate") or "0.0" def __repr__(self): return f"BatterPlaying(Player ID: {self.player_id}, Runs: {self.runs}, Balls Faced: {self.balls_faced})" @@ -191,6 +191,7 @@ def __init__(self, json_data): self.batting = [ BatterPlaying(data) for data in json_data['batting'] ] self.bowling = [ BowlerPlaying(data) for data in json_data['bowling'] ] self.status = json_data['status'] + self.is_finished = True if (json_data['event_name']=='complete') else False self.ball_limit = int(json_data.get('innings', {}).get('ball_limit') or 0) self.balls = int(json_data.get('innings', {}).get('balls') or 0) self.current_inning = int(json_data.get('innings', {}).get('innings_number') or 0) @@ -203,4 +204,4 @@ def __init__(self, json_data): self.runs = int(json_data.get('innings', {}).get('runs') or 0) self.target = int(json_data.get('innings', {}).get('target') or 0) self.team_id = int(json_data.get('innings', {}).get('team_id') or 0) - self.wickets = int(json_data.get('innings', {}).get('wickets') or 0) + self.wickets = int(json_data.get('innings', {}).get('wickets') or 0) \ No newline at end of file From d6b9d349c91e4659892879944d6ce3c975547d43 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sat, 8 Mar 2025 08:54:18 +0530 Subject: [PATCH 27/31] Update misc.py --- espncricinfo/misc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/espncricinfo/misc.py b/espncricinfo/misc.py index 5700515..1d6c692 100644 --- a/espncricinfo/misc.py +++ b/espncricinfo/misc.py @@ -191,7 +191,6 @@ def __init__(self, json_data): self.batting = [ BatterPlaying(data) for data in json_data['batting'] ] self.bowling = [ BowlerPlaying(data) for data in json_data['bowling'] ] self.status = json_data['status'] - self.is_finished = True if (json_data['event_name']=='complete') else False self.ball_limit = int(json_data.get('innings', {}).get('ball_limit') or 0) self.balls = int(json_data.get('innings', {}).get('balls') or 0) self.current_inning = int(json_data.get('innings', {}).get('innings_number') or 0) @@ -204,4 +203,4 @@ def __init__(self, json_data): self.runs = int(json_data.get('innings', {}).get('runs') or 0) self.target = int(json_data.get('innings', {}).get('target') or 0) self.team_id = int(json_data.get('innings', {}).get('team_id') or 0) - self.wickets = int(json_data.get('innings', {}).get('wickets') or 0) \ No newline at end of file + self.wickets = int(json_data.get('innings', {}).get('wickets') or 0) From 7eab1c268fd88bee1eb6358882d8520213eb461a Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sat, 8 Mar 2025 13:37:46 +0530 Subject: [PATCH 28/31] Create livematches.py --- espncricinfo/livematches.py | 82 +++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 espncricinfo/livematches.py diff --git a/espncricinfo/livematches.py b/espncricinfo/livematches.py new file mode 100644 index 0000000..d47cdb3 --- /dev/null +++ b/espncricinfo/livematches.py @@ -0,0 +1,82 @@ +import requests +from bs4 import BeautifulSoup + +class LiveMatch(object): + def __init__(self, match_time, match_number, venue, date, year, series, teams, match_status): + self.match_time = match_time + 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 + + 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): + self._get_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: + matches = [] + 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 = "N/A" + teams.append((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" + + matches.append(LiveMatch(match_time, match_number, venue, date, year, series, teams, match_status)) + return matches From f034fe688366f5f235a6b0a941488464c2f0ce66 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sat, 8 Mar 2025 13:38:19 +0530 Subject: [PATCH 29/31] Update livematches.py --- espncricinfo/livematches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espncricinfo/livematches.py b/espncricinfo/livematches.py index d47cdb3..9565ed6 100644 --- a/espncricinfo/livematches.py +++ b/espncricinfo/livematches.py @@ -35,7 +35,7 @@ def live_matches(self): self._get_live_matches() def _fetch_html(self): - response = requests.get(self.MATCH_URL, headers=self.HEADERS) + response = requests.get(self.match_url, headers=self.headers) if response.status_code != 200: print("Failed to retrieve page") return None From 5e77e5d1e72a566fc7adf8477f767110572d1641 Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sat, 8 Mar 2025 16:40:17 +0530 Subject: [PATCH 30/31] Update livematches.py --- espncricinfo/livematches.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/espncricinfo/livematches.py b/espncricinfo/livematches.py index 9565ed6..c3c075a 100644 --- a/espncricinfo/livematches.py +++ b/espncricinfo/livematches.py @@ -1,9 +1,10 @@ -import requests +import requests, re from bs4 import BeautifulSoup class LiveMatch(object): - def __init__(self, match_time, match_number, venue, date, year, series, teams, match_status): + 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 @@ -50,6 +51,9 @@ def _get_live_matches(self): if parent_div: matches = [] for match_ in parent_div.find_all(recursive=False): + 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) 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" @@ -78,5 +82,5 @@ def _get_live_matches(self): 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" - matches.append(LiveMatch(match_time, match_number, venue, date, year, series, teams, match_status)) + matches.append(LiveMatch(match_time, match_id, match_number, venue, date, year, series, teams, match_status)) return matches From 46c0a74e81b08492cae6a1fed639123a48be9baa Mon Sep 17 00:00:00 2001 From: Killua Zoldyck <58257876+killuazoldyckreal@users.noreply.github.com> Date: Sat, 8 Mar 2025 17:27:26 +0530 Subject: [PATCH 31/31] Update livematches.py --- espncricinfo/livematches.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/espncricinfo/livematches.py b/espncricinfo/livematches.py index c3c075a..13df5aa 100644 --- a/espncricinfo/livematches.py +++ b/espncricinfo/livematches.py @@ -1,6 +1,11 @@ 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 @@ -12,6 +17,7 @@ def __init__(self, match_time, match_id, match_number, venue, date, year, series 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]) @@ -33,7 +39,9 @@ def __init__(self): @property def live_matches(self): - self._get_live_matches() + 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) @@ -43,17 +51,13 @@ def _fetch_html(self): return BeautifulSoup(response.text, "html.parser") def _get_live_matches(self): - self.html = self.fetch_html() + 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: - matches = [] for match_ in parent_div.find_all(recursive=False): - 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) 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" @@ -71,8 +75,8 @@ def _get_live_matches(self): 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 = "N/A" - teams.append((team_name, formatted_score)) + formatted_score = None + teams.append(Team(team_name, formatted_score)) if match_date != "N/A": match_number, venue, date, year, series = match_date.split(", ") @@ -81,6 +85,9 @@ def _get_live_matches(self): 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) - matches.append(LiveMatch(match_time, match_id, match_number, venue, date, year, series, teams, match_status)) - return matches + self._live_matches.append(LiveMatch(match_time, match_id, match_number, venue, date, year, series, teams, match_status)) + return self._live_matches