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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/README.md +1 -1
  5. data/lib/sportradar/api.rb +23 -1
  6. data/lib/sportradar/api/basketball.rb +21 -0
  7. data/lib/sportradar/api/basketball/bio.rb +33 -0
  8. data/lib/sportradar/api/basketball/broadcast.rb +15 -0
  9. data/lib/sportradar/api/basketball/nba.rb +123 -0
  10. data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
  11. data/lib/sportradar/api/basketball/nba/division.rb +29 -0
  12. data/lib/sportradar/api/basketball/nba/game.rb +263 -0
  13. data/lib/sportradar/api/basketball/nba/hierarchy.rb +46 -0
  14. data/lib/sportradar/api/basketball/nba/overview.rb +64 -0
  15. data/lib/sportradar/api/basketball/nba/player.rb +146 -0
  16. data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
  17. data/lib/sportradar/api/basketball/nba/record.rb +34 -0
  18. data/lib/sportradar/api/basketball/nba/schedule.rb +32 -0
  19. data/lib/sportradar/api/basketball/nba/scoring.rb +89 -0
  20. data/lib/sportradar/api/basketball/nba/season.rb +42 -0
  21. data/lib/sportradar/api/basketball/nba/team.rb +166 -0
  22. data/lib/sportradar/api/basketball/overview.rb +74 -0
  23. data/lib/sportradar/api/basketball/play.rb +65 -0
  24. data/lib/sportradar/api/basketball/plays.rb +38 -0
  25. data/lib/sportradar/api/basketball/plays/assist.rb +11 -0
  26. data/lib/sportradar/api/basketball/plays/base.rb +88 -0
  27. data/lib/sportradar/api/basketball/plays/block.rb +11 -0
  28. data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +9 -0
  29. data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +8 -0
  30. data/lib/sportradar/api/basketball/plays/delay.rb +9 -0
  31. data/lib/sportradar/api/basketball/plays/ejection.rb +9 -0
  32. data/lib/sportradar/api/basketball/plays/end_period.rb +15 -0
  33. data/lib/sportradar/api/basketball/plays/flagrant_one.rb +9 -0
  34. data/lib/sportradar/api/basketball/plays/flagrant_two.rb +9 -0
  35. data/lib/sportradar/api/basketball/plays/foul.rb +14 -0
  36. data/lib/sportradar/api/basketball/plays/free_throw_made.rb +20 -0
  37. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +20 -0
  38. data/lib/sportradar/api/basketball/plays/jumpball.rb +9 -0
  39. data/lib/sportradar/api/basketball/plays/kickball.rb +9 -0
  40. data/lib/sportradar/api/basketball/plays/lineup_change.rb +9 -0
  41. data/lib/sportradar/api/basketball/plays/offensive_foul.rb +9 -0
  42. data/lib/sportradar/api/basketball/plays/official_timeout.rb +9 -0
  43. data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
  44. data/lib/sportradar/api/basketball/plays/open_tip.rb +9 -0
  45. data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
  46. data/lib/sportradar/api/basketball/plays/rebound.rb +15 -0
  47. data/lib/sportradar/api/basketball/plays/review.rb +8 -0
  48. data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
  49. data/lib/sportradar/api/basketball/plays/shot_made.rb +21 -0
  50. data/lib/sportradar/api/basketball/plays/shot_miss.rb +21 -0
  51. data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
  52. data/lib/sportradar/api/basketball/plays/team_timeout.rb +9 -0
  53. data/lib/sportradar/api/basketball/plays/technical_foul.rb +11 -0
  54. data/lib/sportradar/api/basketball/plays/three_point_made.rb +11 -0
  55. data/lib/sportradar/api/basketball/plays/three_point_miss.rb +8 -0
  56. data/lib/sportradar/api/basketball/plays/timeout.rb +15 -0
  57. data/lib/sportradar/api/basketball/plays/turnover.rb +16 -0
  58. data/lib/sportradar/api/basketball/plays/tv_timeout.rb +9 -0
  59. data/lib/sportradar/api/basketball/plays/two_point_made.rb +11 -0
  60. data/lib/sportradar/api/basketball/plays/two_point_miss.rb +8 -0
  61. data/lib/sportradar/api/basketball/profile.rb +48 -0
  62. data/lib/sportradar/api/basketball/season.rb +20 -0
  63. data/lib/sportradar/api/basketball/venue.rb +53 -0
  64. data/lib/sportradar/api/data.rb +42 -0
  65. data/lib/sportradar/api/mma.rb +195 -0
  66. data/lib/sportradar/api/mma/event.rb +111 -0
  67. data/lib/sportradar/api/mma/fight.rb +107 -0
  68. data/lib/sportradar/api/mma/fighter.rb +95 -0
  69. data/lib/sportradar/api/mma/judge.rb +70 -0
  70. data/lib/sportradar/api/mma/league.rb +63 -0
  71. data/lib/sportradar/api/mma/referee.rb +70 -0
  72. data/lib/sportradar/api/mma/result.rb +68 -0
  73. data/lib/sportradar/api/mma/roster.rb +72 -0
  74. data/lib/sportradar/api/mma/schedule.rb +53 -0
  75. data/lib/sportradar/api/mma/score.rb +83 -0
  76. data/lib/sportradar/api/mma/venue.rb +72 -0
  77. data/lib/sportradar/api/ncaafb.rb +185 -0
  78. data/lib/sportradar/api/ncaafb/drive.rb +89 -0
  79. data/lib/sportradar/api/ncaafb/game.rb +161 -0
  80. data/lib/sportradar/api/ncaafb/play.rb +39 -0
  81. data/lib/sportradar/api/ncaafb/player.rb +61 -0
  82. data/lib/sportradar/api/ncaafb/quarter.rb +37 -0
  83. data/lib/sportradar/api/ncaafb/season.rb +71 -0
  84. data/lib/sportradar/api/ncaafb/team.rb +69 -0
  85. data/lib/sportradar/api/ncaafb/week.rb +33 -0
  86. data/lib/sportradar/api/nfl.rb +6 -0
  87. data/lib/sportradar/api/nfl/conference.rb +2 -1
  88. data/lib/sportradar/api/request.rb +1 -0
  89. data/lib/sportradar/api/version.rb +1 -1
  90. metadata +81 -2
@@ -0,0 +1,8 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class TwoPointMiss < ShotMiss
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,48 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Profile < Data
5
+ attr_accessor :team, :name
6
+
7
+ def initialize(team)
8
+ # @team = team
9
+ @id = team.id
10
+ # @score = team.score
11
+ # @home_id = team.home_id
12
+ # @away_id = team.away_id
13
+ # @home_full = team.home.full_name
14
+ # @away_full = team.away.full_name
15
+ # @team_ids = team.instance_variable_get(:@team_ids)
16
+ # @status = team.status
17
+ # @clock = team.clock
18
+ # @quarter = team.quarter.to_i
19
+ # @broadcast = team.broadcast
20
+ # @scheduled = team.scheduled
21
+ # @venue_name = team.venue.name
22
+ # @venue_city = team.venue.city
23
+ # @location = team.venue.location
24
+ # @timeouts = team.timeouts
25
+ # @scoring = team.scoring
26
+ # @duration = team.duration
27
+ # @attendance = team.attendance
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ __END__
36
+
37
+ ss = sr.schedule;
38
+ sr = Sportradar::Api::Nba.new
39
+ sd = sr.daily_schedule;
40
+ g = sd.games.last;
41
+ g.overview
42
+ box = g.get_box;
43
+ pbp = g.get_pbp;
44
+ g.quarters.size
45
+ g.plays.size
46
+
47
+ Sportradar::Api::Nba::Team.all.size # => 32 - includes all star teams
48
+
@@ -0,0 +1,20 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Season < Data
5
+ attr_accessor :response
6
+
7
+ # def initialize(data, **opts)
8
+ # @response = data
9
+ # @api = opts[:api]
10
+
11
+ # @id = response['id']
12
+ # @name = response['name']
13
+ # @alias = response['alias']
14
+
15
+ # end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,53 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Venue < Data
5
+ attr_accessor :response, :id, :name, :address, :city, :state, :country, :zip, :capacity
6
+ @all_hash = {}
7
+ def self.new(data, **opts)
8
+ existing = @all_hash[data['id']]
9
+ if existing
10
+ existing.update(data, **opts)
11
+ existing
12
+ else
13
+ @all_hash[data['id']] = super
14
+ end
15
+ end
16
+ def self.all
17
+ @all_hash.values
18
+ end
19
+
20
+ def initialize(data, **opts)
21
+ @response = data
22
+ @id = data["id"]
23
+
24
+ update(data, **opts)
25
+ end
26
+ def update(data, **opts)
27
+ @name = data['name']
28
+ @address = data['address']
29
+ @city = data['city']
30
+ @state = data['state']
31
+ @zip = data['zip']
32
+ @country = data['country']
33
+ @capacity = data['capacity']
34
+ end
35
+
36
+ def location
37
+ "#{name}, #{city}"
38
+ end
39
+
40
+ KEYS_SCHEDULE = ["id", "name", "capacity", "address", "city", "state", "zip", "country"]
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ __END__
47
+
48
+ sr = Sportradar::Api::Nba.new
49
+ lh = sr.league_hierarchy;
50
+ t = lh.teams.first;
51
+ t.venue.id
52
+ t.venue.name
53
+ t.venue.city
@@ -18,6 +18,48 @@ module Sportradar
18
18
  [ klass.new(selector) ]
19
19
  end
20
20
  end
21
+ def parse_into_array_with_options(selector: , klass: , **opts)
22
+ if selector.is_a?(Array)
23
+ selector.map {|x| klass.new(x, **opts) }
24
+ elsif selector.is_a?(Hash)
25
+ [ klass.new(selector, **opts) ]
26
+ else
27
+ []
28
+ end
29
+ end
30
+
31
+ def structure_links(links_arr)
32
+ links_arr.map { |hash| [hash['rel'], hash['href'].gsub('.xml', '')] }.to_h
33
+ end
34
+
35
+ # @param existing [Hash{String=>Data}] Existing data hash, ID => entity
36
+ # @param data [Hash, Array] new data to update with
37
+ def update_data(existing, data)
38
+ case data
39
+ when Array
40
+ data.each { |hash| existing[hash['id']].update(hash) }
41
+ when Hash
42
+ existing[data['id']].update(data)
43
+ else
44
+ # raise
45
+ end
46
+ existing
47
+ end
48
+
49
+ # @param existing [Hash{String=>Data}] Existing data hasb, ID => entity
50
+ # @param data [Hash, Array] new data to update with
51
+ def create_data(existing = {}, data, klass: nil, **opts)
52
+ existing ||= {} # handles nil case, typically during object instantiation
53
+ case data
54
+ when Array
55
+ data.each { |hash| existing[hash['id']] = klass.new(hash, **opts) }
56
+ when Hash
57
+ existing[data['id']] = klass.new(data, **opts)
58
+ else
59
+ # raise
60
+ end
61
+ existing
62
+ end
21
63
 
22
64
  def parse_out_hashes(data_element)
23
65
  if data_element && data_element.is_a?(Array)
@@ -0,0 +1,195 @@
1
+ module Sportradar
2
+ module Api
3
+ class Mma < Request
4
+ attr_accessor :league, :access_level, :simulation, :error
5
+
6
+ def initialize(access_level = 't')
7
+ @league = 'mma'
8
+ raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
9
+ @access_level = access_level
10
+ end
11
+
12
+ def schedule
13
+ response = get request_url("schedule")
14
+ if response.success? && response['schedule']
15
+ Sportradar::Api::Mma::Schedule.new(response['schedule'], api: self)
16
+ else
17
+ @error = response
18
+ end
19
+ end
20
+
21
+ def participants
22
+ response = get request_url("profiles")
23
+ if response.success? && response['profile']
24
+ Sportradar::Api::Mma::Roster.new(response['profile'], api: self)
25
+ else
26
+ @error = response
27
+ end
28
+ end
29
+
30
+ def statistics(event_id = "8f85ecc5-0d4d-470b-b357-075cc7e7bedd")
31
+ event_hash = {"id" => event_id } # => UFC 205 - McGregor/Alvarez
32
+ event = Event.new({ 'id' => event_id })
33
+ event.get_stats
34
+ end
35
+ def generate_simulation_event(event_id = "8f85ecc5-0d4d-470b-b357-075cc7e7bedd")
36
+ event = Event.new({ 'id' => event_id })
37
+ i = 0
38
+ base_path = "simulations/mma/#{event_id}"
39
+ FileUtils.mkdir_p(base_path)
40
+ loop do
41
+ t = Time.now
42
+ print "#{t}: Data pull #{i+=1}\r"
43
+ res = event.get_stats.body
44
+ File.write("#{base_path}/#{t.to_i}.xml", res)
45
+ wait = (t.to_i + 60 - Time.now.to_i)
46
+ wait.times do |j|
47
+ print "#{t}: Data pull #{i} complete, #{wait - j} seconds until next.\r"
48
+ sleep 1
49
+ end
50
+ puts
51
+ end
52
+ end
53
+
54
+ # def roster(team_id, year = Date.today.year, season = "reg")
55
+ # Team.new(team_id).tap { |team| team.roster }
56
+ # end
57
+
58
+
59
+ # def weekly_depth_charts(week = 1, year = Date.today.year, season = "reg" )
60
+ # response = get request_url("seasontd/#{ week_path(year, season, week) }/depth_charts")
61
+ # Sportradar::Api::Nfl::LeagueDepthChart.new response
62
+ # end
63
+
64
+ # def weekly_injuries(week = 1, year = Date.today.year, season = "reg")
65
+ # response = get request_url("seasontd/#{ week_path(year, season, week) }/injuries")
66
+ # Sportradar::Api::Nfl::Season.new response["season"] if response.success? && response["season"]
67
+ # end
68
+
69
+ # # gid = '8494fbf9-fe96-4d6d-81b2-5ed32347676f'
70
+ # # past_game_id = "0141a0a5-13e5-4b28-b19f-0c3923aaef6e"
71
+ # # future_game_id = "28290722-4ceb-4a4c-a4e5-1f9bec7283b3"
72
+ # def game_boxscore(game_id)
73
+ # check_simulation(game_id)
74
+ # response = get request_url("games/#{ game_id }/boxscore")
75
+ # Sportradar::Api::Nfl::Game.new response["game"] if response.success? && response["game"] # mostly done, just missing play statistics
76
+ # end
77
+
78
+ # def game_roster(game_id)
79
+ # check_simulation(game_id)
80
+ # response = get request_url("games/#{ game_id }/roster")
81
+ # Sportradar::Api::Nfl::Game.new response["game"] if response.success? && response["game"]
82
+ # end
83
+
84
+ # def game_statistics(game_data)
85
+ # # check_simulation(game_id)
86
+ # base = "#{ year }/#{ mma_season }/#{ mma_season_week }/#{ away_team}/#{ home_team }/statistics"
87
+ # response = get_data(base)
88
+ # Sportradar::Api::Nfl::Game.new response["game"] if response.success? && response["game"]
89
+ # ## Need to properly implement statistics
90
+ # end
91
+
92
+ # def play_by_play(game_id)
93
+ # check_simulation(game_id)
94
+ # response = get request_url("games/#{ game_id }/pbp")
95
+ # Sportradar::Api::Nfl::Game.new response["game"] if response.success? && response["game"]
96
+ # # need to get into quarters, drives, plays, stats more still
97
+ # end
98
+
99
+ # # player_id = "ede260be-5ae6-4a06-887b-e4a130932705"
100
+ # def player_profile(player_id)
101
+ # response = get request_url("players/#{ player_id }/profile")
102
+ # Sportradar::Api::Nfl::Player.new response["player"] if response.success? && response["player"]
103
+ # end
104
+
105
+ # # team_id = "97354895-8c77-4fd4-a860-32e62ea7382a"
106
+ # def seasonal_statistics(team_id, year = Date.today.year, season = "reg")
107
+ # raise Sportradar::Api::Error::InvalidLeague unless allowed_seasons.include? season
108
+ # response = get request_url("seasontd/#{ year }/#{ season }/teams/#{ team_id }/statistics")
109
+ # Sportradar::Api::Nfl::Season.new response["season"] if response.success? && response["season"]
110
+ # # TODO: Object map team & player records - statistics
111
+ # end
112
+
113
+ # def team_profile(team_id)
114
+ # response = get request_url("teams/#{ team_id }/profile")
115
+ # Sportradar::Api::Nfl::Team.new response["team"] if response.success? && response["team"]
116
+ # end
117
+
118
+ # def league_hierarchy
119
+ # response = get request_url("league/hierarchy")
120
+ # Sportradar::Api::Nfl::Hierarchy.new response["league"] if response.success? && response["league"]
121
+ # end
122
+
123
+ # def standings(year = Date.today.year)
124
+ # response = get request_url("seasontd/#{ year }/standings")
125
+ # Sportradar::Api::Nfl::Season.new response["season"] if response.success? && response["season"]
126
+ # # TODO Needs implement rankings/records/stats on team
127
+ # end
128
+
129
+ # def daily_change_log(date = Date.today)
130
+ # response = get request_url("league/#{date_path(date)}/changes")
131
+ # Sportradar::Api::Nfl::Changelog.new response["league"]["changelog"] if response.success? && response["league"] && response["league"]["changelog"]
132
+ # end
133
+
134
+ # def simulation_games
135
+ # [
136
+ # # "f45b4a31-b009-4039-8394-42efbc6d5532",
137
+ # # "5a7042cb-fe7a-4838-b93f-6b8c167ec384",
138
+ # # "7f761bb5-7963-43ea-a01b-baf4f5d50fe3"
139
+ # ]
140
+ # end
141
+
142
+ # def active_simulation
143
+ # game = simulation_games.lazy.map {|game_id| game_boxscore game_id }.find{ |game| game.status == 'inprogress'}
144
+ # if game
145
+ # puts "Live Game: #{game.summary.home.full_name} vs #{game.summary.away.full_name}. Q#{game.quarter} #{game.clock}. game_id='#{game.id}'"
146
+ # game
147
+ # else
148
+ # puts "No active simulation"
149
+ # end
150
+ # end
151
+
152
+ def get_data(url)
153
+ get request_url(url)
154
+ end
155
+
156
+ private
157
+
158
+ # def check_simulation(game_id)
159
+ # @simulation = true if simulation_games.include?(game_id)
160
+ # end
161
+
162
+ def request_url(path)
163
+ "/mma-#{access_level}#{version}/#{path}"
164
+ end
165
+
166
+ def api_key
167
+ if access_level != 't'
168
+ Sportradar::Api.api_key_params('mma', 'production')
169
+ else
170
+ Sportradar::Api.api_key_params('mma')
171
+ end
172
+ end
173
+
174
+ def version
175
+ Sportradar::Api.version('mma')
176
+ end
177
+
178
+ def allowed_access_levels
179
+ %w[p t]
180
+ end
181
+
182
+ end
183
+ end
184
+ end
185
+
186
+ __END__
187
+
188
+ sr = Sportradar::Api::Mma.new
189
+ ss = sr.schedule;
190
+ sp = sr.participants;
191
+
192
+ ss.games.count
193
+ ss.weeks.count
194
+ ss.weeks.first.response['game'].count
195
+
@@ -0,0 +1,111 @@
1
+ module Sportradar
2
+ module Api
3
+ class Mma
4
+ class Event < Data
5
+ attr_accessor :response, :id, :name, :scheduled, :venue, :league
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ @api = opts[:api]
10
+ @fights_hash = {}
11
+ @updated_at = Time.now
12
+
13
+ @id = response['id']
14
+ @name = response['name']
15
+ update(data)
16
+ end
17
+
18
+ def fights
19
+ @fights_hash.values
20
+ end
21
+
22
+ def update(data)
23
+ @scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
24
+ @venue = Venue.new(data['venue'], event: self, api: api) if data['venue']
25
+ @league = League.new(data['league'], event: self, api: api) if data['league']
26
+ update_fights(data)
27
+
28
+ self
29
+ end
30
+
31
+ def update_fights(data)
32
+ return if String === data['fights']
33
+ create_data(@fights_hash, data.dig('fights', 'fight'), klass: Fight, api: api, event: self)
34
+ end
35
+
36
+
37
+ def path_base
38
+ "events/#{ id }"
39
+ end
40
+ def path_stats
41
+ "#{ path_base }/summary"
42
+ end
43
+ # def path_pbp
44
+ # "#{ path_base }/pbp"
45
+ # end
46
+
47
+ def get_stats
48
+ res = api.get_data(path_stats)
49
+ data = res['summary']
50
+ @updated_at = data['generated']
51
+ update(data.dig('events', 'event'))
52
+ res
53
+ end
54
+
55
+ def api
56
+ @api ||= Sportradar::Api::Mma.new
57
+ end
58
+
59
+
60
+ # def get_pbp
61
+ # data = api.get_data(path_pbp)['game']
62
+ # update(data)
63
+ # @quarter = data['quarter'].first
64
+ # @pbp = set_pbp(data['quarter'][1..-1])
65
+ # end
66
+
67
+ # def set_pbp(data)
68
+ # @quarters = parse_into_array_with_options(selector: data, klass: self.parent::Quarter, api: api, game: self)
69
+ # @plays = nil # to clear empty array empty
70
+ # @quarters
71
+ # end
72
+
73
+ KEYS_SCHED = ["id", "name", "scheduled", "venue", "league", "fights"]
74
+
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ __END__
81
+
82
+ m = Sportradar::Api::Mma.new
83
+ sc = m.schedule;
84
+ e = sc.events.sample;
85
+ e = sc.events.first;
86
+ e = sc.events.last;
87
+
88
+
89
+
90
+ m = Sportradar::Api::Mma.new
91
+ sr = m.participants;
92
+ e = sc.events.sample;
93
+ f = sr.fighters.sample;
94
+ f.fights.size
95
+ sc = m.schedule;
96
+ f.fights.size
97
+ f.fights.first
98
+ f.fights.first.event
99
+
100
+
101
+ event_hash = {"id"=>"f7c80a91-c6e7-4636-a5ec-62e59ca0afab" }
102
+ e = Sportradar::Api::Mma::Event.new(event_hash)
103
+ e.get_stats;
104
+ e
105
+
106
+ event_hash = {"id"=>"8f85ecc5-0d4d-470b-b357-075cc7e7bedd" } # => UFC 205 - McGregor/Alvarez
107
+ e = Sportradar::Api::Mma::Event.new(event_hash)
108
+ res = e.get_stats;
109
+ f = e.fights.last.result
110
+ f.scores
111
+