sportradar-api 0.9.24 → 0.9.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env.sample +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/lib/sportradar/api.rb +23 -1
- data/lib/sportradar/api/basketball.rb +21 -0
- data/lib/sportradar/api/basketball/bio.rb +33 -0
- data/lib/sportradar/api/basketball/broadcast.rb +15 -0
- data/lib/sportradar/api/basketball/nba.rb +123 -0
- data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
- data/lib/sportradar/api/basketball/nba/division.rb +29 -0
- data/lib/sportradar/api/basketball/nba/game.rb +263 -0
- data/lib/sportradar/api/basketball/nba/hierarchy.rb +46 -0
- data/lib/sportradar/api/basketball/nba/overview.rb +64 -0
- data/lib/sportradar/api/basketball/nba/player.rb +146 -0
- data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
- data/lib/sportradar/api/basketball/nba/record.rb +34 -0
- data/lib/sportradar/api/basketball/nba/schedule.rb +32 -0
- data/lib/sportradar/api/basketball/nba/scoring.rb +89 -0
- data/lib/sportradar/api/basketball/nba/season.rb +42 -0
- data/lib/sportradar/api/basketball/nba/team.rb +166 -0
- data/lib/sportradar/api/basketball/overview.rb +74 -0
- data/lib/sportradar/api/basketball/play.rb +65 -0
- data/lib/sportradar/api/basketball/plays.rb +38 -0
- data/lib/sportradar/api/basketball/plays/assist.rb +11 -0
- data/lib/sportradar/api/basketball/plays/base.rb +88 -0
- data/lib/sportradar/api/basketball/plays/block.rb +11 -0
- data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +8 -0
- data/lib/sportradar/api/basketball/plays/delay.rb +9 -0
- data/lib/sportradar/api/basketball/plays/ejection.rb +9 -0
- data/lib/sportradar/api/basketball/plays/end_period.rb +15 -0
- data/lib/sportradar/api/basketball/plays/flagrant_one.rb +9 -0
- data/lib/sportradar/api/basketball/plays/flagrant_two.rb +9 -0
- data/lib/sportradar/api/basketball/plays/foul.rb +14 -0
- data/lib/sportradar/api/basketball/plays/free_throw_made.rb +20 -0
- data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +20 -0
- data/lib/sportradar/api/basketball/plays/jumpball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/kickball.rb +9 -0
- data/lib/sportradar/api/basketball/plays/lineup_change.rb +9 -0
- data/lib/sportradar/api/basketball/plays/offensive_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/official_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_tip.rb +9 -0
- data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/rebound.rb +15 -0
- data/lib/sportradar/api/basketball/plays/review.rb +8 -0
- data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/shot_made.rb +21 -0
- data/lib/sportradar/api/basketball/plays/shot_miss.rb +21 -0
- data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
- data/lib/sportradar/api/basketball/plays/team_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/technical_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/three_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/plays/timeout.rb +15 -0
- data/lib/sportradar/api/basketball/plays/turnover.rb +16 -0
- data/lib/sportradar/api/basketball/plays/tv_timeout.rb +9 -0
- data/lib/sportradar/api/basketball/plays/two_point_made.rb +11 -0
- data/lib/sportradar/api/basketball/plays/two_point_miss.rb +8 -0
- data/lib/sportradar/api/basketball/profile.rb +48 -0
- data/lib/sportradar/api/basketball/season.rb +20 -0
- data/lib/sportradar/api/basketball/venue.rb +53 -0
- data/lib/sportradar/api/data.rb +42 -0
- data/lib/sportradar/api/mma.rb +195 -0
- data/lib/sportradar/api/mma/event.rb +111 -0
- data/lib/sportradar/api/mma/fight.rb +107 -0
- data/lib/sportradar/api/mma/fighter.rb +95 -0
- data/lib/sportradar/api/mma/judge.rb +70 -0
- data/lib/sportradar/api/mma/league.rb +63 -0
- data/lib/sportradar/api/mma/referee.rb +70 -0
- data/lib/sportradar/api/mma/result.rb +68 -0
- data/lib/sportradar/api/mma/roster.rb +72 -0
- data/lib/sportradar/api/mma/schedule.rb +53 -0
- data/lib/sportradar/api/mma/score.rb +83 -0
- data/lib/sportradar/api/mma/venue.rb +72 -0
- data/lib/sportradar/api/ncaafb.rb +185 -0
- data/lib/sportradar/api/ncaafb/drive.rb +89 -0
- data/lib/sportradar/api/ncaafb/game.rb +161 -0
- data/lib/sportradar/api/ncaafb/play.rb +39 -0
- data/lib/sportradar/api/ncaafb/player.rb +61 -0
- data/lib/sportradar/api/ncaafb/quarter.rb +37 -0
- data/lib/sportradar/api/ncaafb/season.rb +71 -0
- data/lib/sportradar/api/ncaafb/team.rb +69 -0
- data/lib/sportradar/api/ncaafb/week.rb +33 -0
- data/lib/sportradar/api/nfl.rb +6 -0
- data/lib/sportradar/api/nfl/conference.rb +2 -1
- data/lib/sportradar/api/request.rb +1 -0
- data/lib/sportradar/api/version.rb +1 -1
- metadata +81 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd6d7916dd9fc049204233084a6a7ce5b10673ef
|
4
|
+
data.tar.gz: 6fe2b2da4640b71028828be5a4fd108642b38768
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6045f549f1e54a084fb3303b50bb8ef9fa8cbabcf512068dd5332cf2c3a5773ebed64b340cb6e3b7feeba4e191cf3de72e23dc4ca5f52083bf3dee13d86f79d5
|
7
|
+
data.tar.gz: 0de364ca8a0f659c78b7daa35d3850b555bb8728e3910c7deba4f16ee62acd6d64d4bfe9ec2787de30d1d97ae63b18a18af115b395effc85f763b5402f9a070a
|
data/.env.sample
CHANGED
@@ -14,7 +14,7 @@ SPORTRADAR_MLB: your-mlb-api-key
|
|
14
14
|
SPORTRADAR_MMA: your-mma-api-key
|
15
15
|
SPORTRADAR_NASCAR: your-nascar-api-key
|
16
16
|
SPORTRADAR_NBA: your-nba-api-key
|
17
|
-
|
17
|
+
SPORTRADAR_NCAAFB: your-ncaaf-api-key
|
18
18
|
SPORTRADAR_NCAAMB: your-ncaamb-api-key
|
19
19
|
SPORTRADAR_NCAAWB: your-ncaawb-api-key
|
20
20
|
SPORTRADAR_NFL: your-nfl-api-key
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sportradar-api (0.9.
|
4
|
+
sportradar-api (0.9.25)
|
5
5
|
activesupport
|
6
6
|
httparty (>= 0.14.0)
|
7
7
|
|
@@ -57,7 +57,7 @@ GEM
|
|
57
57
|
minitest (5.9.1)
|
58
58
|
minitest-focus (1.1.2)
|
59
59
|
minitest (>= 4, < 6)
|
60
|
-
multi_xml (0.
|
60
|
+
multi_xml (0.6.0)
|
61
61
|
nenv (0.3.0)
|
62
62
|
notiffany (0.1.1)
|
63
63
|
nenv (~> 0.1)
|
data/README.md
CHANGED
@@ -25,7 +25,7 @@ Our goal is to incrementally integrate with them. **Contributions are welcome**
|
|
25
25
|
| NFL | 1 | [📚](http://developer.sportradar.us/page/NFL_Official) | ✅ | 👍 |
|
26
26
|
| MLB | 5 | [📚](http://developer.sportradar.us/docs/MLB_API) | - | - |
|
27
27
|
| NHL | 3 | [📚](http://developer.sportradar.us/docs/NHL_API) | - | - |
|
28
|
-
| NBA | 3 | [📚](http://developer.sportradar.us/docs/NBA_API) |
|
28
|
+
| NBA | 3 | [📚](http://developer.sportradar.us/docs/NBA_API) | ✅ | - |
|
29
29
|
| NCAAMB | 3 | [📚](http://developer.sportradar.us/docs/NCAA_Mens_Basketball) | - | - |
|
30
30
|
| NCAAFB | 1 | [📚](http://developer.sportradar.us/docs/NCAA_Football_API) | - | - |
|
31
31
|
| Golf | 2 | [📚](http://developer.sportradar.us/docs/Golf_API) | - | - |
|
data/lib/sportradar/api.rb
CHANGED
@@ -28,6 +28,15 @@ require "sportradar/api/soccer/tournament_group"
|
|
28
28
|
require "sportradar/api/soccer/venue"
|
29
29
|
|
30
30
|
require "sportradar/api/football"
|
31
|
+
require "sportradar/api/ncaafb"
|
32
|
+
require "sportradar/api/ncaafb/season"
|
33
|
+
require "sportradar/api/ncaafb/week"
|
34
|
+
require "sportradar/api/ncaafb/game"
|
35
|
+
require "sportradar/api/ncaafb/team"
|
36
|
+
require "sportradar/api/ncaafb/player"
|
37
|
+
require "sportradar/api/ncaafb/quarter"
|
38
|
+
require "sportradar/api/ncaafb/drive"
|
39
|
+
require "sportradar/api/ncaafb/play"
|
31
40
|
|
32
41
|
require "sportradar/api/nfl"
|
33
42
|
require "sportradar/api/nfl/broadcast"
|
@@ -60,6 +69,8 @@ require "sportradar/api/nfl/team_depth_chart"
|
|
60
69
|
require "sportradar/api/nfl/venue"
|
61
70
|
require "sportradar/api/nfl/week"
|
62
71
|
|
72
|
+
require "sportradar/api/basketball"
|
73
|
+
|
63
74
|
|
64
75
|
require "sportradar/api/live_images"
|
65
76
|
require "sportradar/api/images"
|
@@ -68,7 +79,18 @@ require "sportradar/api/images/asset"
|
|
68
79
|
require "sportradar/api/images/link"
|
69
80
|
require "sportradar/api/images/tag"
|
70
81
|
|
71
|
-
|
82
|
+
require "sportradar/api/mma"
|
83
|
+
require "sportradar/api/mma/schedule"
|
84
|
+
require "sportradar/api/mma/roster"
|
85
|
+
require "sportradar/api/mma/fighter"
|
86
|
+
require "sportradar/api/mma/event"
|
87
|
+
require "sportradar/api/mma/fight"
|
88
|
+
require "sportradar/api/mma/judge"
|
89
|
+
require "sportradar/api/mma/referee"
|
90
|
+
require "sportradar/api/mma/result"
|
91
|
+
require "sportradar/api/mma/score"
|
92
|
+
require "sportradar/api/mma/venue"
|
93
|
+
require "sportradar/api/mma/league"
|
72
94
|
|
73
95
|
|
74
96
|
require "sportradar/api/content"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'basketball/season'
|
2
|
+
require_relative 'basketball/overview'
|
3
|
+
require_relative 'basketball/venue'
|
4
|
+
require_relative 'basketball/broadcast'
|
5
|
+
require_relative 'basketball/profile'
|
6
|
+
require_relative 'basketball/bio'
|
7
|
+
require_relative 'basketball/plays'
|
8
|
+
|
9
|
+
require_relative 'basketball/nba'
|
10
|
+
require_relative 'basketball/nba/hierarchy'
|
11
|
+
require_relative 'basketball/nba/conference'
|
12
|
+
require_relative 'basketball/nba/division'
|
13
|
+
require_relative 'basketball/nba/record'
|
14
|
+
require_relative 'basketball/nba/season'
|
15
|
+
require_relative 'basketball/nba/schedule'
|
16
|
+
require_relative 'basketball/nba/game'
|
17
|
+
require_relative 'basketball/nba/scoring'
|
18
|
+
require_relative 'basketball/nba/overview'
|
19
|
+
require_relative 'basketball/nba/team'
|
20
|
+
require_relative 'basketball/nba/player'
|
21
|
+
require_relative 'basketball/nba/quarter'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Bio < Data
|
5
|
+
attr_accessor :player, :name
|
6
|
+
|
7
|
+
def initialize(player)
|
8
|
+
# @player = player
|
9
|
+
@id = player.id
|
10
|
+
@status = player.status
|
11
|
+
@full_name = player.full_name
|
12
|
+
@first_name = player.first_name
|
13
|
+
@last_name = player.last_name
|
14
|
+
@abbr_name = player.abbr_name
|
15
|
+
@height = player.height
|
16
|
+
@weight = player.weight
|
17
|
+
@position = player.position
|
18
|
+
@primary_position = player.primary_position
|
19
|
+
@jersey_number = player.jersey_number
|
20
|
+
@experience = player.experience
|
21
|
+
@college = player.college
|
22
|
+
@birth_place = player.birth_place
|
23
|
+
@birthdate = player.birthdate
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
__END__
|
32
|
+
|
33
|
+
sr = Sportradar::Api::Nba.new
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba < Request
|
5
|
+
attr_accessor :league, :access_level, :simulation, :error
|
6
|
+
|
7
|
+
def initialize(access_level = 't')
|
8
|
+
@league = 'nba'
|
9
|
+
raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
10
|
+
@access_level = access_level
|
11
|
+
end
|
12
|
+
|
13
|
+
def schedule(season_year = default_year, nba_season = default_season)
|
14
|
+
raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? nba_season
|
15
|
+
response = get request_url("games/#{season_year}/#{nba_season}/schedule")
|
16
|
+
if response.success? && response['league']
|
17
|
+
Sportradar::Api::Basketball::Nba::Season.new(response['league'], api: self)
|
18
|
+
else
|
19
|
+
@error = response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def daily_schedule(date = default_date, nba_season = default_season)
|
24
|
+
response = get request_url("games/#{ date.year }/#{ date.month }/#{ date.day }/schedule")
|
25
|
+
if response.success? && response['league']
|
26
|
+
Sportradar::Api::Basketball::Nba::Schedule.new(response['league'], api: self)
|
27
|
+
else
|
28
|
+
@error = response
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def league_hierarchy
|
33
|
+
response = get request_url("league/hierarchy")
|
34
|
+
if response.success? && response["league"]
|
35
|
+
Sportradar::Api::Basketball::Nba::Hierarchy.new(response["league"], api: self)
|
36
|
+
else
|
37
|
+
response
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def team_stats(season_year = default_year, nba_season = default_season, team_id)
|
42
|
+
response = get request_url("seasontd/#{season_year}/#{nba_season}/teams/#{team_id}/statistics")
|
43
|
+
if response.success? && response["season"]
|
44
|
+
# Sportradar::Api::Basketball::Nba::Team.new response["season"]
|
45
|
+
response
|
46
|
+
else
|
47
|
+
response
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def standings(season_year = default_year, nba_season = default_season)
|
52
|
+
response = get request_url("seasontd/#{season_year}/#{nba_season}/standings")
|
53
|
+
if response.success? && response["league"]
|
54
|
+
Sportradar::Api::Basketball::Nba::Hierarchy.new(response['league']["season"], api: self)
|
55
|
+
else
|
56
|
+
response
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_data(url)
|
61
|
+
get request_url(url)
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_pbp(*args)
|
65
|
+
'pbp'
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def default_year
|
70
|
+
2016
|
71
|
+
end
|
72
|
+
def default_date
|
73
|
+
Date.today
|
74
|
+
end
|
75
|
+
def default_season
|
76
|
+
'reg'
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def check_simulation(game_id)
|
82
|
+
@simulation = true if simulation_games.include?(game_id)
|
83
|
+
end
|
84
|
+
|
85
|
+
def request_url(path)
|
86
|
+
puts "/nba-#{access_level}#{version}/#{path}"
|
87
|
+
if simulation
|
88
|
+
# "/nfl-sim1/#{path}"
|
89
|
+
else
|
90
|
+
"/nba-#{access_level}#{version}/#{path}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def api_key
|
95
|
+
if access_level != 't'
|
96
|
+
Sportradar::Api.api_key_params('nba', 'production')
|
97
|
+
else
|
98
|
+
Sportradar::Api.api_key_params('nba')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def version
|
103
|
+
Sportradar::Api.version('nba')
|
104
|
+
end
|
105
|
+
|
106
|
+
def allowed_access_levels
|
107
|
+
%w[p t]
|
108
|
+
end
|
109
|
+
|
110
|
+
def allowed_seasons
|
111
|
+
["pre", "reg", "pst"]
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
__END__
|
120
|
+
|
121
|
+
sr = Sportradar::Api::Basketball::Nba.new
|
122
|
+
lh = sr.league_hierarchy;
|
123
|
+
ls = sr.standings;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba
|
5
|
+
class Conference < Data
|
6
|
+
attr_accessor :response, :id, :name, :alias
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
|
12
|
+
@id = data["id"]
|
13
|
+
@name = data["name"]
|
14
|
+
@alias = data["alias"]
|
15
|
+
@divisions_hash = create_data({}, response["division"], klass: Division, conference: self, api: @api) # if response["division"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def divisions
|
19
|
+
@divisions_hash.values
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba
|
5
|
+
class Division < Data
|
6
|
+
attr_accessor :response, :id, :name, :alias
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
|
12
|
+
@id = data["id"]
|
13
|
+
@name = data["name"]
|
14
|
+
@alias = data["alias"]
|
15
|
+
@teams_hash = create_data({}, response["team"], klass: Team, division: self, api: @api) # if response["team"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def teams
|
19
|
+
@assigned_teams || @teams_hash.values
|
20
|
+
end
|
21
|
+
def teams=(array)
|
22
|
+
@assigned_teams = array
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Basketball
|
4
|
+
class Nba
|
5
|
+
class Game < Data
|
6
|
+
attr_accessor :response, :id, :home, :away, :home_id, :away_id, :score, :scoring, :status, :scheduled, :venue, :broadcast, :clock, :duration, :attendance, :quarter, :team_stats, :player_stats, :changes, :media_timeouts
|
7
|
+
@all_hash = {}
|
8
|
+
# def self.new(data, **opts)
|
9
|
+
# existing = @all_hash[data['id']]
|
10
|
+
# if existing
|
11
|
+
# existing.update(data, **opts)
|
12
|
+
# existing
|
13
|
+
# else
|
14
|
+
# @all_hash[data['id']] = super
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
# def self.all
|
18
|
+
# @all_hash.values
|
19
|
+
# end
|
20
|
+
|
21
|
+
def initialize(data, **opts)
|
22
|
+
@response = data
|
23
|
+
@api = opts[:api]
|
24
|
+
# @season = opts[:season]
|
25
|
+
@updates = {}
|
26
|
+
@changes = {}
|
27
|
+
|
28
|
+
@score = {}
|
29
|
+
@team_stats = {}
|
30
|
+
@player_stats = {}
|
31
|
+
@scoring_raw = Scoring.new(data, game: self)
|
32
|
+
@teams_hash = {}
|
33
|
+
@quarters_hash = {}
|
34
|
+
|
35
|
+
@id = data['id']
|
36
|
+
|
37
|
+
update(data, **opts)
|
38
|
+
end
|
39
|
+
def timeouts
|
40
|
+
{}
|
41
|
+
end
|
42
|
+
|
43
|
+
def overview
|
44
|
+
Overview.new(self)
|
45
|
+
end
|
46
|
+
def points(team_id)
|
47
|
+
team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i
|
48
|
+
end
|
49
|
+
def stats(team_id)
|
50
|
+
team_id.is_a?(Symbol) ? @team_stats[@team_ids[team_id]].to_i : @team_stats[team_id].to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def scoring
|
54
|
+
@scoring_raw.scores
|
55
|
+
end
|
56
|
+
def update_score(score)
|
57
|
+
@score.merge!(score)
|
58
|
+
end
|
59
|
+
def update_stats(team, stats)
|
60
|
+
@team_stats.merge!(team.id => stats.merge!(team: team))
|
61
|
+
end
|
62
|
+
def update_player_stats(player, stats)
|
63
|
+
@player_stats.merge!(player.id => stats.merge!(player: player))
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_score(data)
|
67
|
+
update_score(data.dig('home', 'id') => data.dig('home', 'points').to_i)
|
68
|
+
update_score(data.dig('away', 'id') => data.dig('away', 'points').to_i)
|
69
|
+
end
|
70
|
+
def clock_seconds
|
71
|
+
return unless @clock
|
72
|
+
m,s = @clock.split(':')
|
73
|
+
m.to_i * 60 + s.to_i
|
74
|
+
end
|
75
|
+
|
76
|
+
def update(data, source: nil, **opts)
|
77
|
+
# via pbp
|
78
|
+
@status = data['status'] if data['status']
|
79
|
+
@coverage = data['coverage'] if data['coverage']
|
80
|
+
@home_id = data['home_team'] if data['home_team'] # GUID
|
81
|
+
@away_id = data['away_team'] if data['away_team'] # GUID
|
82
|
+
@home_points = data['home_points'].to_i if data['home_points']
|
83
|
+
@away_points = data['away_points'].to_i if data['away_points']
|
84
|
+
|
85
|
+
@scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
|
86
|
+
@venue = Venue.new(data['venue']) if data['venue']
|
87
|
+
@broadcast = Broadcast.new(data['broadcast']) if data['broadcast']
|
88
|
+
@home = Team.new(data['home'], api: api, game: self) if data['home']
|
89
|
+
@away = Team.new(data['away'], api: api, game: self) if data['away']
|
90
|
+
|
91
|
+
@duration = data['duration'] if data['duration']
|
92
|
+
@clock = data['clock'] if data['clock']
|
93
|
+
@attendance = data['attendance'] if data['attendance']
|
94
|
+
@lead_changes = data['lead_changes'] if data['lead_changes']
|
95
|
+
@times_tied = data['times_tied'] if data['times_tied']
|
96
|
+
|
97
|
+
@team_ids = { home: @home_id, away: @away_id}
|
98
|
+
|
99
|
+
update_score(@home_id => @home_points.to_i) if @home_points
|
100
|
+
update_score(@away_id => @away_points.to_i) if @away_points
|
101
|
+
parse_score(data['scoring']) if data['scoring']
|
102
|
+
@scoring_raw.update(data, source: source)
|
103
|
+
|
104
|
+
create_data(@teams_hash, data['team'], klass: Team, api: api, game: self) if data['team']
|
105
|
+
end
|
106
|
+
|
107
|
+
def box
|
108
|
+
@box ||= get_box
|
109
|
+
end
|
110
|
+
def pbp
|
111
|
+
if !future? && quarters.empty?
|
112
|
+
get_pbp
|
113
|
+
end
|
114
|
+
@pbp ||= quarters
|
115
|
+
end
|
116
|
+
def plays
|
117
|
+
quarters.flat_map(&:plays)
|
118
|
+
end
|
119
|
+
def summary
|
120
|
+
@summary ||= get_summary
|
121
|
+
end
|
122
|
+
alias :events :plays
|
123
|
+
|
124
|
+
def quarters
|
125
|
+
@quarters_hash.values
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
# tracking updates
|
130
|
+
def remember(key, object)
|
131
|
+
@updates[key] = object
|
132
|
+
end
|
133
|
+
def not_updated?(key, object)
|
134
|
+
@updates[key] == object
|
135
|
+
end
|
136
|
+
def changed?(key)
|
137
|
+
@changes[key]
|
138
|
+
end
|
139
|
+
def check_newness(key, new_object)
|
140
|
+
@changes[key] = !not_updated?(key, new_object)
|
141
|
+
remember(key, new_object)
|
142
|
+
end
|
143
|
+
|
144
|
+
# url paths
|
145
|
+
def path_base
|
146
|
+
"games/#{ id }"
|
147
|
+
end
|
148
|
+
def path_box
|
149
|
+
"#{ path_base }/boxscore"
|
150
|
+
end
|
151
|
+
def path_pbp
|
152
|
+
"#{ path_base }/pbp"
|
153
|
+
end
|
154
|
+
def path_summary
|
155
|
+
"#{ path_base }/summary"
|
156
|
+
end
|
157
|
+
|
158
|
+
# status helpers
|
159
|
+
def future?
|
160
|
+
['scheduled', 'delayed', 'created'].include? status
|
161
|
+
end
|
162
|
+
def started?
|
163
|
+
['inprogress', 'halftime', 'delayed'].include? status
|
164
|
+
end
|
165
|
+
def finished?
|
166
|
+
['completed', 'closed'].include? status
|
167
|
+
end
|
168
|
+
def completed?
|
169
|
+
'complete' == status
|
170
|
+
end
|
171
|
+
def closed?
|
172
|
+
'closed' == status
|
173
|
+
end
|
174
|
+
|
175
|
+
# data retrieval
|
176
|
+
def sync
|
177
|
+
g.get_pbp
|
178
|
+
g.get_box
|
179
|
+
g.get_summary if finished?
|
180
|
+
end
|
181
|
+
|
182
|
+
def get_box
|
183
|
+
api_res = api.get_data(path_box)
|
184
|
+
data = api_res['game']
|
185
|
+
update(data, source: :box)
|
186
|
+
@quarter = data.delete('quarter').to_i
|
187
|
+
check_newness(:box, @clock)
|
188
|
+
data
|
189
|
+
end
|
190
|
+
|
191
|
+
def get_pbp
|
192
|
+
api_res = api.get_data(path_pbp)
|
193
|
+
data = api_res['game']
|
194
|
+
update(data, source: :pbp)
|
195
|
+
quarter_data = if data['quarter']
|
196
|
+
@quarter = data['quarter'].first.to_i
|
197
|
+
quarts = data['quarter'][1..-1]
|
198
|
+
quarts.is_a?(Array) ? quarts[0] : quarts
|
199
|
+
else
|
200
|
+
@quarter = nil
|
201
|
+
[]
|
202
|
+
end
|
203
|
+
set_pbp(quarter_data)
|
204
|
+
@pbp = @quarters_hash.values
|
205
|
+
check_newness(:pbp, plays.last)
|
206
|
+
data
|
207
|
+
end
|
208
|
+
|
209
|
+
def get_summary
|
210
|
+
api_res = api.get_data(path_summary)
|
211
|
+
data = api_res['game']
|
212
|
+
update(data, source: :summary)
|
213
|
+
@quarter = data.delete('quarter').to_i
|
214
|
+
check_newness(:box, @clock)
|
215
|
+
data
|
216
|
+
end
|
217
|
+
|
218
|
+
def set_pbp(data)
|
219
|
+
create_data(@quarters_hash, data, klass: Quarter, api: api, game: self)
|
220
|
+
@plays = nil # to clear empty array empty
|
221
|
+
@quarters_hash
|
222
|
+
end
|
223
|
+
|
224
|
+
def api
|
225
|
+
@api || Sportradar::Api::Basketball::Nba.new
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"]
|
230
|
+
|
231
|
+
KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"]
|
232
|
+
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
__END__
|
240
|
+
|
241
|
+
ss = sr.schedule;
|
242
|
+
sr = Sportradar::Api::Basketball::Nba.new
|
243
|
+
sd = sr.daily_schedule;
|
244
|
+
sd = sr.daily_schedule(Date.yesterday)
|
245
|
+
g = sd.games.last;
|
246
|
+
box = g.get_box;
|
247
|
+
pbp = g.get_pbp;
|
248
|
+
g.quarters.size
|
249
|
+
g.plays.size
|
250
|
+
|
251
|
+
Sportradar::Api::Basketball::Nba::Team.all.size # => 32 - includes all star teams
|
252
|
+
|
253
|
+
g1 = sd.games.first;
|
254
|
+
sd = sr.schedule;
|
255
|
+
sd = sr.daily_schedule;
|
256
|
+
sr = Sportradar::Api::Basketball::Nba.new
|
257
|
+
sd = sr.daily_schedule(Date.yesterday);
|
258
|
+
g = sd.games.last;
|
259
|
+
g.get_summary;
|
260
|
+
g.get_pbp;
|
261
|
+
g.get_box;
|
262
|
+
g.scoring
|
263
|
+
g.get_pbp; g.changed? :pbp
|