sportradar-api 0.10.55 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +28 -26
  3. data/README.md +7 -6
  4. data/lib/sportradar/api/baseball/{REAME.md → README.md} +0 -0
  5. data/lib/sportradar/api/baseball/game.rb +29 -2
  6. data/lib/sportradar/api/baseball/mlb/hierarchy.rb +1 -0
  7. data/lib/sportradar/api/baseball/record.rb +0 -4
  8. data/lib/sportradar/api/baseball/venue.rb +2 -1
  9. data/lib/sportradar/api/basketball/game.rb +2 -2
  10. data/lib/sportradar/api/basketball/record.rb +0 -4
  11. data/lib/sportradar/api/basketball/venue.rb +2 -1
  12. data/lib/sportradar/api/data.rb +3 -3
  13. data/lib/sportradar/api/football/README.md +62 -0
  14. data/lib/sportradar/api/football/drive.rb +105 -0
  15. data/lib/sportradar/api/football/event.rb +33 -0
  16. data/lib/sportradar/api/football/game.rb +389 -0
  17. data/lib/sportradar/api/football/game_stats.rb +135 -0
  18. data/lib/sportradar/api/football/ncaafb/api.rb +76 -0
  19. data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
  20. data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
  21. data/lib/sportradar/api/football/ncaafb/drive.rb +16 -0
  22. data/lib/sportradar/api/football/ncaafb/game.rb +110 -0
  23. data/lib/sportradar/api/football/ncaafb/play.rb +20 -0
  24. data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
  25. data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
  26. data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
  27. data/lib/sportradar/api/football/ncaafb/team.rb +45 -0
  28. data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
  29. data/lib/sportradar/api/football/ncaafb.rb +273 -0
  30. data/lib/sportradar/api/football/nfl/api.rb +76 -0
  31. data/lib/sportradar/api/football/nfl/conference.rb +35 -0
  32. data/lib/sportradar/api/football/nfl/division.rb +37 -0
  33. data/lib/sportradar/api/football/nfl/drive.rb +19 -0
  34. data/lib/sportradar/api/football/nfl/event.rb +19 -0
  35. data/lib/sportradar/api/football/nfl/game.rb +77 -0
  36. data/lib/sportradar/api/football/nfl/play.rb +20 -0
  37. data/lib/sportradar/api/football/nfl/player.rb +31 -0
  38. data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
  39. data/lib/sportradar/api/football/nfl/team.rb +42 -0
  40. data/lib/sportradar/api/football/nfl/week.rb +24 -0
  41. data/lib/sportradar/api/football/nfl.rb +293 -0
  42. data/lib/sportradar/api/football/play.rb +93 -0
  43. data/lib/sportradar/api/football/player.rb +111 -0
  44. data/lib/sportradar/api/football/quarter.rb +42 -0
  45. data/lib/sportradar/api/football/record.rb +48 -0
  46. data/lib/sportradar/api/football/scoring.rb +92 -0
  47. data/lib/sportradar/api/football/situation.rb +20 -0
  48. data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
  49. data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
  50. data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
  51. data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
  52. data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
  53. data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
  54. data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
  55. data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
  56. data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
  57. data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
  58. data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
  59. data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
  60. data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
  61. data/lib/sportradar/api/football/stat_pack.rb +7 -3
  62. data/lib/sportradar/api/football/team.rb +160 -0
  63. data/lib/sportradar/api/football/venue.rb +25 -0
  64. data/lib/sportradar/api/football/week.rb +57 -0
  65. data/lib/sportradar/api/football.rb +43 -0
  66. data/lib/sportradar/api/mma/venue.rb +1 -1
  67. data/lib/sportradar/api/request.rb +19 -2
  68. data/lib/sportradar/api/version.rb +1 -1
  69. data/lib/sportradar/api.rb +0 -41
  70. metadata +41 -43
  71. data/lib/sportradar/api/ncaafb/drive.rb +0 -89
  72. data/lib/sportradar/api/ncaafb/game.rb +0 -161
  73. data/lib/sportradar/api/ncaafb/play.rb +0 -39
  74. data/lib/sportradar/api/ncaafb/player.rb +0 -61
  75. data/lib/sportradar/api/ncaafb/quarter.rb +0 -37
  76. data/lib/sportradar/api/ncaafb/season.rb +0 -71
  77. data/lib/sportradar/api/ncaafb/team.rb +0 -69
  78. data/lib/sportradar/api/ncaafb/week.rb +0 -33
  79. data/lib/sportradar/api/ncaafb.rb +0 -185
  80. data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
  81. data/lib/sportradar/api/nfl/broadcast.rb +0 -13
  82. data/lib/sportradar/api/nfl/changelog.rb +0 -17
  83. data/lib/sportradar/api/nfl/coach.rb +0 -17
  84. data/lib/sportradar/api/nfl/conference.rb +0 -17
  85. data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
  86. data/lib/sportradar/api/nfl/division.rb +0 -16
  87. data/lib/sportradar/api/nfl/draft.rb +0 -16
  88. data/lib/sportradar/api/nfl/drive.rb +0 -73
  89. data/lib/sportradar/api/nfl/event.rb +0 -19
  90. data/lib/sportradar/api/nfl/franchise.rb +0 -14
  91. data/lib/sportradar/api/nfl/game.rb +0 -123
  92. data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
  93. data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
  94. data/lib/sportradar/api/nfl/injury.rb +0 -16
  95. data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
  96. data/lib/sportradar/api/nfl/play.rb +0 -39
  97. data/lib/sportradar/api/nfl/play_statistics.rb +0 -249
  98. data/lib/sportradar/api/nfl/player.rb +0 -56
  99. data/lib/sportradar/api/nfl/position.rb +0 -14
  100. data/lib/sportradar/api/nfl/quarter.rb +0 -29
  101. data/lib/sportradar/api/nfl/scoring.rb +0 -25
  102. data/lib/sportradar/api/nfl/season.rb +0 -23
  103. data/lib/sportradar/api/nfl/situation.rb +0 -18
  104. data/lib/sportradar/api/nfl/statistic.rb +0 -28
  105. data/lib/sportradar/api/nfl/summary.rb +0 -17
  106. data/lib/sportradar/api/nfl/team.rb +0 -56
  107. data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
  108. data/lib/sportradar/api/nfl/venue.rb +0 -22
  109. data/lib/sportradar/api/nfl/week.rb +0 -16
  110. data/lib/sportradar/api/nfl.rb +0 -211
@@ -0,0 +1,37 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
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
+ @teams_hash = {}
14
+
15
+ update(data, **opts)
16
+ end
17
+
18
+ def update(data, **opts)
19
+ @name = data["name"]
20
+ @alias = data["alias"]
21
+ create_data(@teams_hash, data["teams"], klass: Team, division: self, api: @api)
22
+
23
+ self
24
+ end
25
+
26
+ def teams
27
+ @assigned_teams || @teams_hash.values
28
+ end
29
+ def teams=(array)
30
+ @assigned_teams = array
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Drive < Sportradar::Api::Football::Drive
6
+
7
+ def handle_plays_and_events(data, **opts)
8
+ things = (Array(data['events']) + Array(data['actions'])).group_by { |hash| hash['type'] }
9
+
10
+ create_data(@plays_hash, things['play'], klass: Play, api: api, game: self) if things['play']
11
+ create_data(@events_hash, things['event'], klass: Event, api: api, game: self) if things['setup']
12
+ create_data(@events_hash, things['event'], klass: Event, api: api, game: self) if things['event']
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Event < Sportradar::Api::Football::Event
6
+
7
+ def self.new(data, **opts)
8
+ if data['type'] == 'play'
9
+ Play.new(data, **opts)
10
+ else
11
+ super(data, **opts)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,77 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Game < Sportradar::Api::Football::Game
6
+
7
+
8
+ def update_teams(data)
9
+ if data['summary']
10
+ @home.update(data.dig('summary', 'home'), game: self)
11
+ @away.update(data.dig('summary', 'away'), game: self)
12
+ else
13
+ @home.update(data['home'], api: api, game: self) if data['home'].is_a?(Hash)
14
+ @away.update(data['away'], api: api, game: self) if data['away'].is_a?(Hash)
15
+ @home_alias = data['home'] if data['home'].is_a?(String) # this might actually be team ID and not alias. check in NFL
16
+ @away_alias = data['away'] if data['away'].is_a?(String) # this might actually be team ID and not alias. check in NFL
17
+ end
18
+ end
19
+
20
+
21
+ def path_base
22
+ "games/#{ id }"
23
+ end
24
+
25
+ def team_class
26
+ Team
27
+ end
28
+ def period_class
29
+ Quarter
30
+ end
31
+
32
+ def period_key
33
+ 'periods'
34
+ end
35
+
36
+ def quarter_class
37
+ Sportradar::Api::Football::Nfl::Quarter
38
+ end
39
+
40
+
41
+ def api
42
+ @api || Sportradar::Api::Football::Nfl::Api.new
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ __END__
52
+
53
+
54
+ nfl = Sportradar::Api::Football::Nfl.new
55
+ nfl = Sportradar::Api::Football::Nfl.new(year: 2016)
56
+ gg = nfl.games;
57
+ tt = nfl.teams;
58
+ File.binwrite('nfl.bin', Marshal.dump(nfl))
59
+ nfl = Marshal.load(File.binread('nfl.bin'));
60
+ g1 = nfl.games.sample;
61
+ g = gg.first;
62
+ g = gg.sample;
63
+ g.week_number
64
+ g.year
65
+ g.type
66
+ g.path_pbp
67
+ res = g.get_pbp;
68
+
69
+ nfl = Marshal.load(File.binread('nfl.bin'));
70
+ g = nfl.games.first;
71
+ res = g.get_pbp;
72
+ g.quarters.first.drives[1]
73
+
74
+ g = gg.detect{|g| g.id == "" } # overtime game
75
+
76
+ stats = %i[defense extra_points field_goals fumbles int_returns kickoffs misc_returns passing penalties punt_returns punts receiving rushing]
77
+ stats.all? { |st| g.stats(:home).send(st) }
@@ -0,0 +1,20 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Play < Sportradar::Api::Football::Play
6
+
7
+ # def parse_player
8
+ # # TODO: Currently there is an issue where we are only mapping one player_id to a play, but there are plays with multiple players involved.
9
+ # play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
10
+ # if play_stats.is_a?(Array)
11
+ # play_stats = play_stats.first
12
+ # end
13
+ # @player_id = play_stats&.player&.id
14
+ # end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Player < Sportradar::Api::Football::Player
6
+
7
+ def api
8
+ @api || Sportradar::Api::Football::Nfl::Api.new
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ __END__
18
+
19
+ nfl = Marshal.load(File.binread('nfl.bin'));
20
+
21
+ t = nfl.teams.first;
22
+ t.get_roster;
23
+ t.players.first
24
+ t.players.first.totals
25
+
26
+ nfl = Marshal.load(File.binread('nfl.bin'));
27
+ t = nfl.teams.sample
28
+ data = t.get_season_stats(2016);
29
+ t.get_roster;
30
+ t.players.sample
31
+ t.players.sample.totals
@@ -0,0 +1,15 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Quarter < Sportradar::Api::Football::Quarter
6
+
7
+ def drive_class
8
+ Drive
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,42 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Team < Sportradar::Api::Football::Team
6
+
7
+ def players
8
+ get_roster if @players_hash.empty?
9
+ @players_hash.values
10
+ end
11
+ alias :roster :players
12
+
13
+ def player_class
14
+ Player
15
+ end
16
+
17
+ def path_season_stats(year = season_year, season = nfl_season)
18
+ "seasontd/#{year}/#{nfl_season}/teams/#{ id }/statistics"
19
+ end
20
+
21
+ def api
22
+ @api || Sportradar::Api::Football::Nfl::Api.new
23
+ end
24
+ def nfl_season
25
+ @type || default_season
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ __END__
36
+
37
+ nfl = Marshal.load(File.binread('nfl.bin'));
38
+
39
+ t = nfl.teams.first
40
+ data = t.get_season_stats
41
+ data = t.get_season_stats(2016)
42
+ t.players.count
@@ -0,0 +1,24 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Week < Sportradar::Api::Football::Week
6
+
7
+ def game_class
8
+ Game
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ __END__
18
+
19
+
20
+
21
+ nfl = Sportradar::Api::Football::Nfl.new
22
+ nfl = Sportradar::Api::Football::Nfl.new
23
+ res1 = nfl.get_schedule;
24
+ res2 = nfl.get_weekly_schedule;
@@ -0,0 +1,293 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl < Data
5
+ attr_accessor :response, :id, :name, :alias, :type
6
+ def all_attributes
7
+ [:name, :alias, :leagues, :divisions, :teams]
8
+ end
9
+
10
+ def initialize(data = {}, **opts)
11
+ # @response = data
12
+ @api = opts[:api]
13
+ @id = data['id']
14
+ @season = opts[:year]
15
+ @type = opts[:type]
16
+
17
+ @conferences_hash = {}
18
+ @weeks_hash = {}
19
+ @games_hash = {}
20
+ @teams_hash = {}
21
+
22
+ end
23
+
24
+ def update(data, source: nil, **opts)
25
+ # update stuff
26
+ @id = data['id'] if data['id']
27
+ if data['season'].is_a?(Hash)
28
+ @season = data.dig('season', 'year') if data.dig('season', 'year')
29
+ @type = data.dig('season', 'type') if data.dig('season', 'type')
30
+ else
31
+ @season = data['season'] if data['season']
32
+ @type = data['type'] if data['type']
33
+ end
34
+ # @name = data.dig('league', 'name') if data.dig('league', 'name')
35
+ # @alias = data.dig('league', 'alias') if data.dig('league', 'alias')
36
+
37
+ # @year = data.dig('season', 'year') if data.dig('season', 'year')
38
+ # @type = data.dig('season', 'type') if data.dig('season', 'type')
39
+
40
+ create_data(@conferences_hash, data['conferences'], klass: Conference, hierarchy: self, api: api) if data['conferences']
41
+ create_data(@teams_hash, data['teams'], klass: Team, hierarchy: self, api: api) if data['teams']
42
+
43
+ if data['weeks']
44
+ create_data(@weeks_hash, data['weeks'], klass: Week, hierarchy: self, api: @api)
45
+ end
46
+ if data['league']
47
+ @id = data['id']
48
+ @name = data['name']
49
+ @alias = data['alias']
50
+ end
51
+
52
+ if data['games']
53
+ if data['games'].first.keys == ['game']
54
+ data['games'].map! { |hash| hash['game'] }
55
+ end
56
+ @games_hash = create_data(@games_hash, data['games'], klass: Game, hierarchy: self, api: api)
57
+ end
58
+
59
+ self
60
+ end
61
+ def weeks
62
+ @weeks_hash.values
63
+ end
64
+ def conferences
65
+ @conferences_hash.values
66
+ end
67
+ # def conference(code_name)
68
+ # conferences_by_name[code_name]
69
+ # end
70
+ # private def conferences_by_name
71
+ # @conferences_by_name ||= conferences.map { |d| [d.alias, d] }.to_h
72
+ # end
73
+ def divisions
74
+ conferences.flat_map(&:divisions)
75
+ end
76
+ def teams
77
+ divisions.flat_map(&:teams)
78
+ end
79
+
80
+ def schedule
81
+ get_schedule if games.empty?
82
+ self
83
+ end
84
+
85
+ def standings
86
+ get_standings if divisions.empty? || teams.first&.record.nil?
87
+ self
88
+ end
89
+
90
+ def hierarchy
91
+ get_hierarchy if divisions.empty?
92
+ self
93
+ end
94
+
95
+ def games
96
+ get_schedule if @weeks_hash.empty?
97
+ weeks.flat_map(&:games)
98
+ end
99
+ def teams
100
+ teams = divisions.flat_map(&:teams)
101
+ if teams.empty?
102
+ if @teams_hash.empty?
103
+ get_hierarchy
104
+ divisions.flat_map(&:teams)
105
+ else
106
+ @teams_hash.values
107
+ end
108
+ else
109
+ teams
110
+ end
111
+ end
112
+ def team(team_id)
113
+ teams.detect { |team| team.id == team_id }
114
+ end
115
+
116
+ # api stuff
117
+ def api
118
+ @api || Sportradar::Api::Football::Nfl::Api.new
119
+ end
120
+
121
+ def default_year
122
+ (Date.today - 60).year
123
+ end
124
+ def default_date
125
+ Date.today
126
+ end
127
+ def default_season
128
+ 'reg'
129
+ end
130
+ def season_year
131
+ @season || default_year
132
+ end
133
+ alias :year :season_year
134
+ def nfl_season
135
+ @type || default_season
136
+ end
137
+ alias :season :nfl_season
138
+
139
+
140
+ # url paths
141
+ def path_base
142
+ "league"
143
+ end
144
+ def path_hierarchy
145
+ "league/hierarchy"
146
+ end
147
+ def path_schedule
148
+ "games/#{season_year}/#{nfl_season}/schedule"
149
+ end
150
+ def path_weekly_schedule(nfl_season_week)
151
+ "games/#{season_year}/#{nfl_season}/#{nfl_season_week}/schedule"
152
+ end
153
+ # def path_rankings(nfl_season_week, poll_name = 'AP25')
154
+ # "polls/#{poll_name}/#{season_year}/#{nfl_season_week}/rankings"
155
+ # end
156
+ def path_standings
157
+ "seasontd/#{season_year}/standings"
158
+ end
159
+
160
+ # data retrieval
161
+
162
+ ## schedule
163
+ def get_schedule
164
+ data = api.get_data(path_schedule).to_h
165
+ ingest_schedule(data)
166
+ end
167
+
168
+ def ingest_schedule(data)
169
+ update(data, source: :weeks)
170
+ data
171
+ end
172
+
173
+ def queue_schedule
174
+ url, headers, options, timeout = api.get_request_info(path_schedule)
175
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
176
+ end
177
+
178
+ ## weekly schedule
179
+ def get_weekly_schedule(nfl_season_week = 1)
180
+ data = api.get_data(path_weekly_schedule(nfl_season_week)).to_h
181
+ ingest_weekly_schedule(data)
182
+ end
183
+
184
+ def ingest_weekly_schedule(data)
185
+ # update(data, source: :weeks)
186
+ create_data(@weeks_hash, data['week'], klass: Week, hierarchy: self, api: api)
187
+ data
188
+ end
189
+
190
+ def queue_weekly_schedule(nfl_season_week = 1)
191
+ url, headers, options, timeout = api.get_request_info(path_weekly_schedule(nfl_season_week))
192
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_weekly_schedule)}
193
+ end
194
+
195
+ ## hierarchy
196
+ def get_hierarchy
197
+ data = api.get_data(path_hierarchy).to_h
198
+ ingest_hierarchy(data)
199
+ end
200
+
201
+ def ingest_hierarchy(data)
202
+ # create_data(@divisions_hash, data, klass: Division, hierarchy: self, api: api)
203
+ update(data, source: :teams)
204
+ data
205
+ end
206
+
207
+ def queue_hierarchy
208
+ url, headers, options, timeout = api.get_request_info(path_hierarchy)
209
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_hierarchy)}
210
+ end
211
+
212
+ ## depth_charts
213
+ def get_depth_charts
214
+ data = api.get_data(path_depth_charts).to_h
215
+ ingest_depth_charts(data)
216
+ end
217
+
218
+ def ingest_depth_charts(data)
219
+ update(data, source: :teams)
220
+ data
221
+ end
222
+
223
+ def queue_depth_charts
224
+ url, headers, options, timeout = api.get_request_info(path_depth_charts)
225
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)}
226
+ end
227
+
228
+ ## standings
229
+ def get_standings
230
+ data = api.get_data(path_standings).to_h
231
+ ingest_standings(data)
232
+ end
233
+
234
+ def ingest_standings(data)
235
+ update(data, source: :teams)
236
+ data
237
+ end
238
+
239
+ def queue_standings
240
+ url, headers, options, timeout = api.get_request_info(path_standings)
241
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_standings)}
242
+ end
243
+
244
+ ## statistics
245
+
246
+ ## venues
247
+ # def get_venues
248
+ # data = api.get_data(path_venues).to_h
249
+ # ingest_venues(data)
250
+ # end
251
+
252
+ # def ingest_venues(data)
253
+ # update(data, source: :teams)
254
+ # data
255
+ # end
256
+
257
+ # def queue_venues
258
+ # url, headers, options, timeout = api.get_request_info(path_venues)
259
+ # {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_venues)}
260
+ # end
261
+
262
+ def self.sim_api
263
+ Sportradar::Api::Football::Nfl::Api.new('sim')
264
+ end
265
+ def self.simulation
266
+ new({}, api: sim_api, year: 2015, type: 'reg')
267
+ end
268
+ def self.simulations
269
+ api = sim_api
270
+ ['f45b4a31-b009-4039-8394-42efbc6d5532', '5a7042cb-fe7a-4838-b93f-6b8c167ec384', '7f761bb5-7963-43ea-a01b-baf4f5d50fe3'].map do |game_id|
271
+ Game.new({'id' => game_id}, api: api)
272
+ end
273
+ end
274
+
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ __END__
281
+
282
+
283
+
284
+ nfl = Sportradar::Api::Football::Nfl.new
285
+ nfl = Sportradar::Api::Football::Nfl.new(year: 2016)
286
+ res1 = nfl.get_schedule;
287
+ res1 = nfl.get_hierarchy;
288
+ res1 = nfl.get_standings;
289
+ res2 = nfl.get_weekly_schedule;
290
+
291
+ nfl = Marshal.load(File.binread('nfl.bin'));
292
+ File.binwrite('nfl.bin', Marshal.dump(nfl))
293
+
@@ -0,0 +1,93 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Play < Data
5
+ attr_accessor :response, :id, :sequence, :reference, :clock, :home_points, :away_points, :type, :play_clock, :wall_clock, :start_situation, :end_situation, :description, :alt_description, :statistics, :score, :scoring_play, :team_id, :player_id
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ @id = data["id"]
10
+
11
+ update(data, **opts)
12
+ end
13
+
14
+ def update(data, **opts)
15
+ @description = data["description"] || data['summary'] || @description
16
+ @alt_description = data['alt_description'] if data['alt_description']
17
+ @away_points = data['away_points'] if data['away_points']
18
+ @home_points = data['home_points'] if data['home_points']
19
+
20
+ @end_situation = Sportradar::Api::Football::Situation.new(data["end_situation"]) if data["end_situation"]
21
+ @start_situation = Sportradar::Api::Football::Situation.new(data["start_situation"]) if data["start_situation"]
22
+
23
+ @team_id = end_situation.team_id if end_situation
24
+ @play_clock = data["play_clock"]
25
+ @reference = data["reference"]
26
+ @score = data["score"]
27
+ @scoring_play = data["scoring_play"]
28
+ @sequence = data["sequence"]
29
+
30
+ @clock = data["clock"] if data["clock"]
31
+ @type = data["type"] if data["type"]
32
+ @summary = data["summary"] if data["summary"]
33
+ @updated = data["updated"] if data["updated"]
34
+ @side = data["side"] if data["side"]
35
+ @yard_line = data["yard_line"] if data["yard_line"]
36
+ @down = data["down"] if data["down"]
37
+ @yfd = data["yfd"] if data["yfd"]
38
+ @formation = data["formation"] if data["formation"]
39
+ @direction = data["direction"] if data["direction"]
40
+ @distance = data["distance"] if data["distance"]
41
+ @participants = data["participants"] if data["participants"]
42
+ @details = data["details"] if data["details"]
43
+ @play_type = data["play_type"] if data["play_type"]
44
+ @sequence = data["sequence"] if data["sequence"]
45
+
46
+
47
+ # @statistics = Sportradar::Api::Nfl::PlayStatistics.new data["statistics"] if data["statistics"]
48
+ # parse_player if @statistics
49
+ @wall_clock = data["wall_clock"]
50
+
51
+ self
52
+ end
53
+
54
+ def parse_player
55
+ # TODO: Currently there is an issue where we are only mapping one player_id to a play, but there are plays with multiple players involved.
56
+ play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
57
+ if play_stats.is_a?(Array)
58
+ play_stats = play_stats.first
59
+ end
60
+ @player_id = play_stats&.player&.id
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
67
+
68
+ __END__
69
+
70
+ ncaafb = Marshal.load(File.binread('ncaafb.bin'));
71
+ g = ncaafb.games.first;
72
+ res = g.get_pbp;
73
+ g.plays.count
74
+ g.plays.map(&:type)
75
+ g.plays.select {|p| p.type == 'event' } # => find the commercial breaks
76
+
77
+ sr = Sportradar::Api::Nfl.new
78
+ sch = sr.schedule(2016);
79
+ sch.weeks.count
80
+ sch.weeks.first.class
81
+ sch.weeks.first.games.size
82
+ sch.weeks.first.games.first;
83
+ sg = sch.weeks.first.games.first;
84
+ sg
85
+ pbp = sr.play_by_play(sg.id);
86
+ pbp.drives.size
87
+ pbp.drives.flat_map(&:plays)
88
+ pbp.drives.flat_map(&:plays).first.response
89
+ pbp.drives.flat_map(&:events).compact
90
+ pbp.drives.flat_map(&:plays).map(&:type)
91
+ g.drives.select {|d| d.type == 'event' }
92
+ g.plays.select {|p| p.type == 'event' }.size
93
+ g.plays.select {|p| p.type == 'event' }.map(&:description)