sportradar-api 0.9.12 → 0.11.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +6 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile.lock +32 -30
  5. data/README.md +12 -9
  6. data/lib/sportradar/api/baseball/README.md +28 -0
  7. data/lib/sportradar/api/baseball/error.rb +25 -0
  8. data/lib/sportradar/api/baseball/event.rb +44 -0
  9. data/lib/sportradar/api/baseball/events/at_bat.rb +96 -0
  10. data/lib/sportradar/api/baseball/events/lineup.rb +41 -0
  11. data/lib/sportradar/api/baseball/events/warming_up.rb +35 -0
  12. data/lib/sportradar/api/baseball/fielder.rb +26 -0
  13. data/lib/sportradar/api/baseball/game.rb +472 -0
  14. data/lib/sportradar/api/baseball/half_inning.rb +69 -0
  15. data/lib/sportradar/api/baseball/inning.rb +42 -0
  16. data/lib/sportradar/api/baseball/lineup.rb +116 -0
  17. data/lib/sportradar/api/baseball/mlb/division.rb +32 -0
  18. data/lib/sportradar/api/baseball/mlb/hierarchy.rb +273 -0
  19. data/lib/sportradar/api/baseball/mlb/league.rb +27 -0
  20. data/lib/sportradar/api/baseball/mlb.rb +84 -0
  21. data/lib/sportradar/api/baseball/outcome.rb +87 -0
  22. data/lib/sportradar/api/baseball/pitch.rb +245 -0
  23. data/lib/sportradar/api/baseball/player.rb +119 -0
  24. data/lib/sportradar/api/baseball/record.rb +42 -0
  25. data/lib/sportradar/api/baseball/runner.rb +78 -0
  26. data/lib/sportradar/api/baseball/scoring.rb +86 -0
  27. data/lib/sportradar/api/baseball/team.rb +147 -0
  28. data/lib/sportradar/api/baseball/venue.rb +51 -0
  29. data/lib/sportradar/api/baseball.rb +46 -0
  30. data/lib/sportradar/api/basketball/broadcast.rb +15 -0
  31. data/lib/sportradar/api/basketball/game.rb +339 -0
  32. data/lib/sportradar/api/basketball/injury.rb +41 -0
  33. data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
  34. data/lib/sportradar/api/basketball/nba/division.rb +30 -0
  35. data/lib/sportradar/api/basketball/nba/game.rb +62 -0
  36. data/lib/sportradar/api/basketball/nba/hierarchy.rb +47 -0
  37. data/lib/sportradar/api/basketball/nba/player.rb +160 -0
  38. data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
  39. data/lib/sportradar/api/basketball/nba/schedule.rb +43 -0
  40. data/lib/sportradar/api/basketball/nba/scoring.rb +15 -0
  41. data/lib/sportradar/api/basketball/nba/season.rb +54 -0
  42. data/lib/sportradar/api/basketball/nba/series.rb +82 -0
  43. data/lib/sportradar/api/basketball/nba/team.rb +74 -0
  44. data/lib/sportradar/api/basketball/nba.rb +129 -0
  45. data/lib/sportradar/api/basketball/ncaamb/bracket.rb +44 -0
  46. data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
  47. data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
  48. data/lib/sportradar/api/basketball/ncaamb/game.rb +75 -0
  49. data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
  50. data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
  51. data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
  52. data/lib/sportradar/api/basketball/ncaamb/round.rb +55 -0
  53. data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
  54. data/lib/sportradar/api/basketball/ncaamb/season.rb +55 -0
  55. data/lib/sportradar/api/basketball/ncaamb/team.rb +61 -0
  56. data/lib/sportradar/api/basketball/ncaamb/tournament.rb +154 -0
  57. data/lib/sportradar/api/basketball/ncaamb.rb +149 -0
  58. data/lib/sportradar/api/basketball/play.rb +75 -0
  59. data/lib/sportradar/api/basketball/plays/assist.rb +14 -0
  60. data/lib/sportradar/api/basketball/plays/base.rb +126 -0
  61. data/lib/sportradar/api/basketball/plays/block.rb +14 -0
  62. data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +11 -0
  63. data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
  64. data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +11 -0
  65. data/lib/sportradar/api/basketball/plays/delay.rb +11 -0
  66. data/lib/sportradar/api/basketball/plays/ejection.rb +14 -0
  67. data/lib/sportradar/api/basketball/plays/end_period.rb +28 -0
  68. data/lib/sportradar/api/basketball/plays/flagrant_one.rb +11 -0
  69. data/lib/sportradar/api/basketball/plays/flagrant_two.rb +11 -0
  70. data/lib/sportradar/api/basketball/plays/foul.rb +17 -0
  71. data/lib/sportradar/api/basketball/plays/free_throw_made.rb +23 -0
  72. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +25 -0
  73. data/lib/sportradar/api/basketball/plays/jumpball.rb +12 -0
  74. data/lib/sportradar/api/basketball/plays/kickball.rb +11 -0
  75. data/lib/sportradar/api/basketball/plays/lineup_change.rb +11 -0
  76. data/lib/sportradar/api/basketball/plays/offensive_foul.rb +11 -0
  77. data/lib/sportradar/api/basketball/plays/official_timeout.rb +11 -0
  78. data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
  79. data/lib/sportradar/api/basketball/plays/open_tip.rb +11 -0
  80. data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
  81. data/lib/sportradar/api/basketball/plays/rebound.rb +28 -0
  82. data/lib/sportradar/api/basketball/plays/review.rb +11 -0
  83. data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
  84. data/lib/sportradar/api/basketball/plays/shot_made.rb +22 -0
  85. data/lib/sportradar/api/basketball/plays/shot_miss.rb +22 -0
  86. data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
  87. data/lib/sportradar/api/basketball/plays/team_timeout.rb +14 -0
  88. data/lib/sportradar/api/basketball/plays/technical_foul.rb +14 -0
  89. data/lib/sportradar/api/basketball/plays/three_point_made.rb +14 -0
  90. data/lib/sportradar/api/basketball/plays/three_point_miss.rb +11 -0
  91. data/lib/sportradar/api/basketball/plays/timeout.rb +24 -0
  92. data/lib/sportradar/api/basketball/plays/turnover.rb +19 -0
  93. data/lib/sportradar/api/basketball/plays/tv_timeout.rb +11 -0
  94. data/lib/sportradar/api/basketball/plays/two_point_made.rb +14 -0
  95. data/lib/sportradar/api/basketball/plays/two_point_miss.rb +11 -0
  96. data/lib/sportradar/api/basketball/plays.rb +39 -0
  97. data/lib/sportradar/api/basketball/record.rb +28 -0
  98. data/lib/sportradar/api/basketball/scoring.rb +103 -0
  99. data/lib/sportradar/api/basketball/season.rb +20 -0
  100. data/lib/sportradar/api/basketball/team.rb +136 -0
  101. data/lib/sportradar/api/basketball/venue.rb +54 -0
  102. data/lib/sportradar/api/basketball.rb +35 -0
  103. data/lib/sportradar/api/{nfl/broadcast.rb → broadcast.rb} +1 -1
  104. data/lib/sportradar/api/content/article.rb +1 -1
  105. data/lib/sportradar/api/content/article_list.rb +1 -1
  106. data/lib/sportradar/api/content.rb +17 -5
  107. data/lib/sportradar/api/data.rb +53 -0
  108. data/lib/sportradar/api/football/README.md +62 -0
  109. data/lib/sportradar/api/football/drive.rb +114 -0
  110. data/lib/sportradar/api/football/event.rb +36 -0
  111. data/lib/sportradar/api/football/game.rb +404 -0
  112. data/lib/sportradar/api/football/game_stats.rb +135 -0
  113. data/lib/sportradar/api/football/ncaafb/api.rb +81 -0
  114. data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
  115. data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
  116. data/lib/sportradar/api/football/ncaafb/drive.rb +36 -0
  117. data/lib/sportradar/api/football/ncaafb/game.rb +130 -0
  118. data/lib/sportradar/api/football/ncaafb/play.rb +97 -0
  119. data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
  120. data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
  121. data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
  122. data/lib/sportradar/api/football/ncaafb/team.rb +49 -0
  123. data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
  124. data/lib/sportradar/api/football/ncaafb.rb +273 -0
  125. data/lib/sportradar/api/football/nfl/api.rb +76 -0
  126. data/lib/sportradar/api/football/nfl/conference.rb +35 -0
  127. data/lib/sportradar/api/football/nfl/depth_chart.rb +53 -0
  128. data/lib/sportradar/api/football/nfl/division.rb +37 -0
  129. data/lib/sportradar/api/football/nfl/drive.rb +19 -0
  130. data/lib/sportradar/api/football/nfl/event.rb +19 -0
  131. data/lib/sportradar/api/football/nfl/game.rb +77 -0
  132. data/lib/sportradar/api/football/nfl/league_depth_chart.rb +41 -0
  133. data/lib/sportradar/api/football/nfl/play.rb +27 -0
  134. data/lib/sportradar/api/football/nfl/player.rb +31 -0
  135. data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
  136. data/lib/sportradar/api/football/nfl/team.rb +42 -0
  137. data/lib/sportradar/api/football/nfl/team_depth_chart.rb +44 -0
  138. data/lib/sportradar/api/football/nfl/week.rb +24 -0
  139. data/lib/sportradar/api/football/nfl.rb +322 -0
  140. data/lib/sportradar/api/football/play.rb +116 -0
  141. data/lib/sportradar/api/football/play_statistics.rb +313 -0
  142. data/lib/sportradar/api/football/player.rb +121 -0
  143. data/lib/sportradar/api/football/quarter.rb +46 -0
  144. data/lib/sportradar/api/football/record.rb +48 -0
  145. data/lib/sportradar/api/football/scoring.rb +92 -0
  146. data/lib/sportradar/api/football/situation.rb +32 -0
  147. data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
  148. data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
  149. data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
  150. data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
  151. data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
  152. data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
  153. data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
  154. data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
  155. data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
  156. data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
  157. data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
  158. data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
  159. data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
  160. data/lib/sportradar/api/football/stat_pack.rb +7 -3
  161. data/lib/sportradar/api/football/team.rb +160 -0
  162. data/lib/sportradar/api/football/venue.rb +25 -0
  163. data/lib/sportradar/api/football/week.rb +57 -0
  164. data/lib/sportradar/api/football.rb +47 -0
  165. data/lib/sportradar/api/images/asset.rb +2 -1
  166. data/lib/sportradar/api/images/ref.rb +15 -0
  167. data/lib/sportradar/api/images.rb +51 -9
  168. data/lib/sportradar/api/mma/event.rb +111 -0
  169. data/lib/sportradar/api/mma/fight.rb +107 -0
  170. data/lib/sportradar/api/mma/fighter.rb +95 -0
  171. data/lib/sportradar/api/mma/judge.rb +70 -0
  172. data/lib/sportradar/api/mma/league.rb +63 -0
  173. data/lib/sportradar/api/mma/referee.rb +70 -0
  174. data/lib/sportradar/api/mma/result.rb +68 -0
  175. data/lib/sportradar/api/mma/roster.rb +72 -0
  176. data/lib/sportradar/api/mma/schedule.rb +53 -0
  177. data/lib/sportradar/api/mma/score.rb +83 -0
  178. data/lib/sportradar/api/mma/venue.rb +72 -0
  179. data/lib/sportradar/api/mma.rb +195 -0
  180. data/lib/sportradar/api/poll.rb +40 -0
  181. data/lib/sportradar/api/request.rb +40 -8
  182. data/lib/sportradar/api/soccer/schedule.rb +1 -0
  183. data/lib/sportradar/api/version.rb +1 -1
  184. data/lib/sportradar/api.rb +20 -34
  185. metadata +157 -34
  186. data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
  187. data/lib/sportradar/api/nfl/changelog.rb +0 -17
  188. data/lib/sportradar/api/nfl/coach.rb +0 -17
  189. data/lib/sportradar/api/nfl/conference.rb +0 -16
  190. data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
  191. data/lib/sportradar/api/nfl/division.rb +0 -16
  192. data/lib/sportradar/api/nfl/draft.rb +0 -16
  193. data/lib/sportradar/api/nfl/drive.rb +0 -73
  194. data/lib/sportradar/api/nfl/event.rb +0 -19
  195. data/lib/sportradar/api/nfl/franchise.rb +0 -14
  196. data/lib/sportradar/api/nfl/game.rb +0 -94
  197. data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
  198. data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
  199. data/lib/sportradar/api/nfl/injury.rb +0 -16
  200. data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
  201. data/lib/sportradar/api/nfl/play.rb +0 -39
  202. data/lib/sportradar/api/nfl/play_statistics.rb +0 -247
  203. data/lib/sportradar/api/nfl/player.rb +0 -49
  204. data/lib/sportradar/api/nfl/position.rb +0 -14
  205. data/lib/sportradar/api/nfl/quarter.rb +0 -29
  206. data/lib/sportradar/api/nfl/scoring.rb +0 -25
  207. data/lib/sportradar/api/nfl/season.rb +0 -23
  208. data/lib/sportradar/api/nfl/situation.rb +0 -18
  209. data/lib/sportradar/api/nfl/statistic.rb +0 -28
  210. data/lib/sportradar/api/nfl/summary.rb +0 -17
  211. data/lib/sportradar/api/nfl/team.rb +0 -56
  212. data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
  213. data/lib/sportradar/api/nfl/venue.rb +0 -22
  214. data/lib/sportradar/api/nfl/week.rb +0 -16
  215. data/lib/sportradar/api/nfl.rb +0 -205
@@ -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,44 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class TeamDepthChart < Data
6
+ include Enumerable
7
+ attr_accessor :response, :season, :team_id, :abbrev
8
+ alias :id :team_id
9
+
10
+ # data.keys => ["offense", "defense", "special_teams", "name", "market", "alias", "id"]
11
+ def initialize(data, **opts)
12
+ @response = data
13
+ @team_id = data['id']
14
+ @abbrev = data['alias']
15
+ end
16
+
17
+ def offense
18
+ @offense ||= DepthChart.new(response['offense']) if response['offense']
19
+ end
20
+
21
+ def defense
22
+ @defense ||= DepthChart.new(response['defense']) if response['defense']
23
+ end
24
+
25
+ def special_teams
26
+ @special_teams ||= DepthChart.new(response['special_teams']) if response['special_teams']
27
+ end
28
+
29
+ def each
30
+ [:offense, :defense, :special_teams].each { |type| yield type, send(type) }
31
+ end
32
+
33
+ # These aren't ever used, but handy if you need to invoke for testing
34
+ # private
35
+
36
+ # def set_charts
37
+ # [offense, defense, special_teams]
38
+ # end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -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,322 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl < Data
5
+ attr_accessor :response, :id, :name, :alias, :type, :season
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
+ @depth_charts_hash = {}
20
+ # @injuries_hash = {}
21
+ @games_hash = {}
22
+ @teams_hash = {}
23
+
24
+ end
25
+
26
+ def update(data, source: nil, **opts)
27
+ # update stuff
28
+ @id = data['id'] if data['id']
29
+ if data['season'].is_a?(Hash)
30
+ @season = data.dig('season', 'year') if data.dig('season', 'year')
31
+ @type = data.dig('season', 'type') if data.dig('season', 'type')
32
+ else
33
+ @season = data['season'] if data['season']
34
+ @type = data['type'] if data['type']
35
+ end
36
+ # @name = data.dig('league', 'name') if data.dig('league', 'name')
37
+ # @alias = data.dig('league', 'alias') if data.dig('league', 'alias')
38
+
39
+ # @year = data.dig('season', 'year') if data.dig('season', 'year')
40
+ # @type = data.dig('season', 'type') if data.dig('season', 'type')
41
+
42
+ create_data(@conferences_hash, data['conferences'], klass: Conference, hierarchy: self, api: api) if data['conferences']
43
+ create_data(@teams_hash, data['teams'], klass: Team, hierarchy: self, api: api) if data['teams']
44
+
45
+ if data['weeks']
46
+ create_data(@weeks_hash, data['weeks'], klass: Week, hierarchy: self, api: @api)
47
+ end
48
+ if data['league']
49
+ @id = data['id']
50
+ @name = data['name']
51
+ @alias = data['alias']
52
+ end
53
+
54
+ if data['games']
55
+ if data['games'].first.keys == ['game']
56
+ data['games'].map! { |hash| hash['game'] }
57
+ end
58
+ @games_hash = create_data(@games_hash, data['games'], klass: Game, hierarchy: self, api: api)
59
+ end
60
+
61
+ self
62
+ end
63
+
64
+ def weekly_depth_charts(week_number)
65
+ @depth_charts_hash[week_number] ||= get_weekly_depth_charts(week_number)
66
+ end
67
+
68
+ def weeks
69
+ @weeks_hash.values
70
+ end
71
+ def conferences
72
+ @conferences_hash.values
73
+ end
74
+ # def conference(code_name)
75
+ # conferences_by_name[code_name]
76
+ # end
77
+ # private def conferences_by_name
78
+ # @conferences_by_name ||= conferences.map { |d| [d.alias, d] }.to_h
79
+ # end
80
+ def divisions
81
+ conferences.flat_map(&:divisions)
82
+ end
83
+ def teams
84
+ divisions.flat_map(&:teams)
85
+ end
86
+
87
+ def schedule
88
+ get_schedule if games.empty?
89
+ self
90
+ end
91
+
92
+ def standings
93
+ get_standings if divisions.empty? || teams.first&.record.nil?
94
+ self
95
+ end
96
+
97
+ def hierarchy
98
+ get_hierarchy if divisions.empty?
99
+ self
100
+ end
101
+
102
+ def games
103
+ get_schedule if @weeks_hash.empty?
104
+ weeks.flat_map(&:games)
105
+ end
106
+ def teams
107
+ teams = divisions.flat_map(&:teams)
108
+ if teams.empty?
109
+ if @teams_hash.empty?
110
+ get_hierarchy
111
+ divisions.flat_map(&:teams)
112
+ else
113
+ @teams_hash.values
114
+ end
115
+ else
116
+ teams
117
+ end
118
+ end
119
+ def team(team_id)
120
+ teams.detect { |team| team.id == team_id }
121
+ end
122
+
123
+ # api stuff
124
+ def api
125
+ @api || Sportradar::Api::Football::Nfl::Api.new
126
+ end
127
+
128
+ def default_year
129
+ (Date.today - 60).year
130
+ end
131
+ def default_date
132
+ Date.today
133
+ end
134
+ def default_season
135
+ 'reg'
136
+ end
137
+ def season_year
138
+ @season || default_year
139
+ end
140
+ alias :year :season_year
141
+ def nfl_season
142
+ @type || default_season
143
+ end
144
+ alias :season :nfl_season
145
+
146
+
147
+ # url paths
148
+ def path_base
149
+ "league"
150
+ end
151
+ def path_hierarchy
152
+ "league/hierarchy"
153
+ end
154
+ def path_schedule
155
+ "games/#{season_year}/#{nfl_season}/schedule"
156
+ end
157
+ def path_weekly_schedule(nfl_season_week)
158
+ "games/#{season_year}/#{nfl_season}/#{nfl_season_week}/schedule"
159
+ end
160
+ def path_weekly_depth_charts(nfl_season_week)
161
+ "seasontd/#{season_year}/#{nfl_season}/#{nfl_season_week}/depth_charts"
162
+ end
163
+ def path_weekly_depth_injuries(nfl_season_week)
164
+ "seasontd/#{season_year}/#{nfl_season}/#{nfl_season_week}/injuries"
165
+ end
166
+ def path_standings
167
+ "seasontd/#{season_year}/standings"
168
+ end
169
+
170
+ # data retrieval
171
+
172
+ ## schedule
173
+ def get_schedule
174
+ data = api.get_data(path_schedule).to_h
175
+ ingest_schedule(data)
176
+ end
177
+
178
+ def ingest_schedule(data)
179
+ update(data, source: :weeks)
180
+ data
181
+ end
182
+
183
+ def queue_schedule
184
+ url, headers, options, timeout = api.get_request_info(path_schedule)
185
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
186
+ end
187
+
188
+ ## weekly schedule
189
+ def get_weekly_schedule(nfl_season_week = 1)
190
+ data = api.get_data(path_weekly_schedule(nfl_season_week)).to_h
191
+ ingest_weekly_schedule(data)
192
+ end
193
+
194
+ def ingest_weekly_schedule(data)
195
+ # update(data, source: :weeks)
196
+ create_data(@weeks_hash, data['week'], klass: Week, hierarchy: self, api: api)
197
+ data
198
+ end
199
+
200
+ def queue_weekly_schedule(nfl_season_week = 1)
201
+ url, headers, options, timeout = api.get_request_info(path_weekly_schedule(nfl_season_week))
202
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_weekly_schedule)}
203
+ end
204
+
205
+ ## weekly depth charts
206
+ private def get_weekly_depth_charts(nfl_season_week = 1)
207
+ data = api.get_data(path_weekly_depth_charts(nfl_season_week)).to_h
208
+ ingest_weekly_depth_charts(data)
209
+ end
210
+
211
+ private def ingest_weekly_depth_charts(data)
212
+ LeagueDepthChart.new(data, api: api)
213
+ end
214
+
215
+ # def queue_weekly_depth_charts(nfl_season_week = 1)
216
+ # url, headers, options, timeout = api.get_request_info(path_weekly_depth_charts(nfl_season_week))
217
+ # {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_weekly_depth_charts)}
218
+ # end
219
+
220
+ ## hierarchy
221
+ def get_hierarchy
222
+ data = api.get_data(path_hierarchy).to_h
223
+ ingest_hierarchy(data)
224
+ end
225
+
226
+ def ingest_hierarchy(data)
227
+ # create_data(@divisions_hash, data, klass: Division, hierarchy: self, api: api)
228
+ update(data, source: :teams)
229
+ data
230
+ end
231
+
232
+ def queue_hierarchy
233
+ url, headers, options, timeout = api.get_request_info(path_hierarchy)
234
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_hierarchy)}
235
+ end
236
+
237
+ ## depth_charts
238
+ def get_depth_charts
239
+ data = api.get_data(path_depth_charts).to_h
240
+ ingest_depth_charts(data)
241
+ end
242
+
243
+ def ingest_depth_charts(data)
244
+ update(data, source: :teams)
245
+ data
246
+ end
247
+
248
+ def queue_depth_charts
249
+ url, headers, options, timeout = api.get_request_info(path_depth_charts)
250
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)}
251
+ end
252
+
253
+ ## standings
254
+ def get_standings
255
+ data = api.get_data(path_standings).to_h
256
+ ingest_standings(data)
257
+ end
258
+
259
+ def ingest_standings(data)
260
+ update(data, source: :teams)
261
+ data
262
+ end
263
+
264
+ def queue_standings
265
+ url, headers, options, timeout = api.get_request_info(path_standings)
266
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_standings)}
267
+ end
268
+
269
+ ## statistics
270
+
271
+ ## venues
272
+ # def get_venues
273
+ # data = api.get_data(path_venues).to_h
274
+ # ingest_venues(data)
275
+ # end
276
+
277
+ # def ingest_venues(data)
278
+ # update(data, source: :teams)
279
+ # data
280
+ # end
281
+
282
+ # def queue_venues
283
+ # url, headers, options, timeout = api.get_request_info(path_venues)
284
+ # {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_venues)}
285
+ # end
286
+
287
+ def self.sim_api
288
+ Sportradar::Api::Football::Nfl::Api.new.sim!
289
+ end
290
+ def self.simulation
291
+ new({}, api: sim_api, year: 2015, type: 'reg')
292
+ end
293
+ def self.simulations
294
+ api = sim_api
295
+ ['f45b4a31-b009-4039-8394-42efbc6d5532', '5a7042cb-fe7a-4838-b93f-6b8c167ec384', '7f761bb5-7963-43ea-a01b-baf4f5d50fe3'].map do |game_id|
296
+ Game.new({'id' => game_id}).sim!
297
+ end
298
+ end
299
+
300
+ end
301
+ end
302
+ end
303
+ end
304
+
305
+ __END__
306
+
307
+
308
+
309
+ nfl = Sportradar::Api::Football::Nfl.new
310
+ nfl = Sportradar::Api::Football::Nfl.new(year: 2016)
311
+ res1 = nfl.get_schedule;
312
+ res1 = nfl.get_hierarchy;
313
+ res1 = nfl.get_standings;
314
+ res2 = nfl.get_weekly_schedule;
315
+
316
+ nfl = Marshal.load(File.binread('nfl.bin'));
317
+ File.binwrite('nfl.bin', Marshal.dump(nfl))
318
+
319
+ nfl = Sportradar::Api::Football::Nfl.new
320
+ nfl.season = 2016
321
+ res = nfl.get_weekly_depth_charts
322
+ dc = nfl.instance_variable_get(:@depth_charts_hash)
@@ -0,0 +1,116 @@
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, :play_type, :players, :down, :yfd
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
+ @api = opts[:api] || @api
16
+ @drive = opts[:drive] || @drive
17
+ @description = data["description"] || data['summary'] || @description
18
+ @alt_description = data['alt_description'] if data['alt_description']
19
+ @away_points = data['away_points'] if data['away_points']
20
+ @home_points = data['home_points'] if data['home_points']
21
+
22
+ @end_situation = Sportradar::Api::Football::Situation.new(data["end_situation"]) if data["end_situation"]
23
+ @start_situation = Sportradar::Api::Football::Situation.new(data["start_situation"]) if data["start_situation"]
24
+
25
+ @team_id = end_situation.team_id if end_situation
26
+ @play_clock = data["play_clock"]
27
+ @reference = data["reference"]
28
+ @score = data["score"]
29
+ @scoring_play = data["scoring_play"]
30
+ @sequence = data["sequence"]
31
+
32
+ @clock = data["clock"] if data["clock"]
33
+ @type = data["type"] if data["type"]
34
+ @summary = data["summary"] if data["summary"]
35
+ @updated = data["updated"] if data["updated"]
36
+ @side = data["side"] if data["side"]
37
+ @yard_line = data["yard_line"] if data["yard_line"]
38
+ @down = data["down"] if data["down"]
39
+ @yfd = data["yfd"] if data["yfd"]
40
+ @formation = data["formation"] if data["formation"]
41
+ @direction = data["direction"] if data["direction"]
42
+ @distance = data["distance"] if data["distance"]
43
+ @participants = data["participants"] if data["participants"]
44
+ @play_type = data["play_type"] if data["play_type"]
45
+ @sequence = data["sequence"] if data["sequence"]
46
+ @players = data["players"] if data["players"]
47
+
48
+ @details = data["details"].gsub('.json', '') if data["details"]
49
+
50
+ @statistics = Sportradar::Api::Football::PlayStatistics.new(data['statistics']) if data['statistics']
51
+ parse_player if @statistics
52
+ @wall_clock = data["wall_clock"]
53
+
54
+ self
55
+ end
56
+
57
+ def start_spot
58
+ start_situation&.spot
59
+ end
60
+
61
+ def end_spot
62
+ end_situation&.spot
63
+ end
64
+
65
+ def down_distance
66
+ [down, yfd].compact.join(' & ')
67
+ end
68
+
69
+ def end_of_regulation?
70
+ false
71
+ end
72
+
73
+ def halftime?
74
+ false
75
+ end
76
+
77
+ def parse_player
78
+ # 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.
79
+ play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
80
+ if play_stats.is_a?(Array)
81
+ play_stats = play_stats.first
82
+ end
83
+ @player_id = play_stats&.player&.id
84
+ end
85
+ end
86
+
87
+ end
88
+ end
89
+ end
90
+
91
+ __END__
92
+
93
+ ncaafb = Marshal.load(File.binread('ncaafb.bin'));
94
+ g = ncaafb.games.first;
95
+ res = g.get_pbp;
96
+ g.plays.count
97
+ g.plays.map(&:type)
98
+ g.plays.select {|p| p.type == 'event' } # => find the commercial breaks
99
+
100
+ sr = Sportradar::Api::Nfl.new
101
+ sch = sr.schedule(2016);
102
+ sch.weeks.count
103
+ sch.weeks.first.class
104
+ sch.weeks.first.games.size
105
+ sch.weeks.first.games.first;
106
+ sg = sch.weeks.first.games.first;
107
+ sg
108
+ pbp = sr.play_by_play(sg.id);
109
+ pbp.drives.size
110
+ pbp.drives.flat_map(&:plays)
111
+ pbp.drives.flat_map(&:plays).first.response
112
+ pbp.drives.flat_map(&:events).compact
113
+ pbp.drives.flat_map(&:plays).map(&:type)
114
+ g.drives.select {|d| d.type == 'event' }
115
+ g.plays.select {|p| p.type == 'event' }.size
116
+ g.plays.select {|p| p.type == 'event' }.map(&:description)