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,42 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Season < Basketball::Season
6
+ attr_accessor :response
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = response['id']
13
+ @name = response['name']
14
+ @alias = response['alias']
15
+ @games_hash = {}
16
+
17
+ update_games(data.dig('season_schedule', 'games', 'game'))
18
+ end
19
+
20
+ def games
21
+ @games_hash.values
22
+ end
23
+
24
+ def year
25
+ 2016
26
+ end
27
+
28
+ def update_games(data)
29
+ create_data(@games_hash, data, klass: Game, api: @api, season: self)
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ __END__
39
+
40
+ sd = sr.daily_schedule;
41
+ sr = Sportradar::Api::Nba.new
42
+ ss = sr.schedule;
@@ -0,0 +1,166 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Nba
5
+ class Team < Data
6
+ attr_accessor :response, :id, :market, :name, :alias, :full_name, :venue, :records, :player_stats, :team_stats
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
+ @games_hash = {}
25
+ @players_hash = {}
26
+ @player_stats = {}
27
+ @records = {}
28
+
29
+ case response
30
+ when String
31
+ @id = response
32
+ when Hash
33
+ @id = data['id']
34
+ update(response, **opts)
35
+ end
36
+ end
37
+
38
+ def profile
39
+ Profile.new(self)
40
+ end
41
+
42
+ def update(data, **opts)
43
+ handle_names(data)
44
+
45
+ @venue = Venue.new(data['venue']) if data['venue']
46
+
47
+ @alias = data['alias'] if data['alias']
48
+ @points = data['points'].to_i if data['points']
49
+ @home = data['home'] == 'true' if data['home']
50
+ @away = data['away'] == 'true' if data['away']
51
+ @scoring = data.dig('scoring', 'quarter') if data.dig('scoring', 'quarter')
52
+
53
+ parse_records(data) if data['records']
54
+ parse_players(data.dig('players', 'player'), opts[:game]) if data.dig('players', 'player')
55
+ parse_stats(data['statistics']) if data['statistics']
56
+ if opts[:game]
57
+ add_game(opts[:game])
58
+ opts[:game].update_score(id => @points) if @points
59
+ opts[:game].update_stats(self, @stats) if @stats
60
+ end
61
+ end
62
+ def handle_names(data)
63
+ # need to do some more work here
64
+ @name = data['name'] if data['name']
65
+ if data['name'] && !data.key?('market')
66
+ @full_name = data['name']
67
+ if @full_name.split.size > 1
68
+ @market = @full_name.split[0..-2].join(' ')
69
+ @name = @full_name.split.last
70
+ end
71
+ elsif data['name'] && data['market']
72
+ @market = data['market']
73
+ @full_name = [@market, data['name']].join(' ')
74
+ end
75
+ end
76
+
77
+ def record(type = 'overall')
78
+ @records[type]
79
+ end
80
+
81
+ def games
82
+ @games_hash.values
83
+ end
84
+ def add_game(game)
85
+ @games_hash[game.id] = game.id if game
86
+ end
87
+
88
+ def parse_stats(data)
89
+ @stats = data
90
+ end
91
+
92
+ def players
93
+ get_roster if @players_hash.empty?
94
+ @players_hash.values
95
+ end
96
+ alias :roster :players
97
+ def parse_players(data, game)
98
+ create_data(@players_hash, data, klass: Player, api: api, team: self, game: game)
99
+ end
100
+ def update_player_stats(player, stats, game = nil)
101
+ game ? game.update_player_stats(player, stats) : @player_stats.merge!(player.id => stats.merge!(player: player))
102
+ end
103
+
104
+ def get_roster
105
+ data = api.get_data(path_roster)['team']
106
+ update(data)
107
+ end
108
+
109
+ def get_season_stats
110
+ data = api.get_data(path_season_stats).dig('season', 'team')
111
+ parse_season_stats(data)
112
+ end
113
+
114
+ def parse_records(data)
115
+ @records['overall'] = Record.new(data, type: 'overall')
116
+ data['records'].each { |type, record| @records[type] = Record.new(record, type: type) }
117
+ end
118
+
119
+ def parse_season_stats(data)
120
+ @team_stats = data.dig('team_records')
121
+ update(data)
122
+ create_data(@players_hash, data.dig('player_records', 'player'), klass: Player, api: api, team: self)
123
+ data
124
+ end
125
+
126
+ def path_base
127
+ "teams/#{ id }"
128
+ end
129
+ def path_base_stats(season_year = api.default_year, nba_season = api.default_season)
130
+ "seasontd/#{season_year}/#{nba_season}/teams/#{id}/"
131
+ end
132
+ def path_roster
133
+ "#{ path_base }/profile"
134
+ end
135
+ def path_season_stats
136
+ "#{ path_base_stats }/statistics"
137
+ end
138
+
139
+
140
+ def api
141
+ @api || Sportradar::Api::Basketball::Nba.new
142
+ end
143
+
144
+ KEYS_SCHEDULE = ["name", "alias", "id", "__content__"]
145
+
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ __END__
153
+ ss = sr.schedule;
154
+ sd = sr.daily_schedule;
155
+ sr = Sportradar::Api::Basketball::Nba.new
156
+ lh = sr.league_hierarchy;
157
+ t = lh.teams.first;
158
+ ss = t.get_season_stats;
159
+ g = sd.games.last;
160
+ t = g.home;
161
+ Sportradar::Api::Basketball::Nba::Team.all.size
162
+
163
+
164
+ # week_count = ss.weeks.count;
165
+ # w1 = ss.weeks.first;
166
+ # w1 = ss.weeks(1);
@@ -0,0 +1,74 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Overview < Data
5
+ attr_accessor :game, :home_id, :away_id, :clock, :quarter, :status, :home, :away, :scoring, :venue, :scheduled, :broadcast
6
+
7
+ def initialize(game)
8
+ # @game = game
9
+ @id = game.id
10
+ @score = game.score
11
+ @home_id = game.home_id
12
+ @away_id = game.away_id
13
+ @home_full = game.home.full_name
14
+ @away_full = game.away.full_name
15
+ @team_ids = game.instance_variable_get(:@team_ids)
16
+ @status = game.status
17
+ @clock = game.clock
18
+ @quarter = game.quarter.to_i
19
+ @broadcast = game.broadcast
20
+ @scheduled = game.scheduled
21
+ @timeouts = game.timeouts
22
+ @scoring = game.scoring
23
+ @duration = game.duration
24
+ @attendance = game.attendance
25
+
26
+ @venue = OpenStruct.new(name: game.venue.name, city: game.venue.city, location: game.venue.location)
27
+ @home = OpenStruct.new(id: game.home.id, alias: game.home.alias, name: game.home.name, full_name: game.home.full_name)
28
+ @away = OpenStruct.new(id: game.away.id, alias: game.away.alias, name: game.away.name, full_name: game.away.full_name)
29
+ rescue => e
30
+ binding.pry
31
+ end
32
+
33
+ def points(team_id)
34
+ team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i
35
+ end
36
+
37
+ def scoring(quarter)
38
+ @scoring
39
+ end
40
+
41
+ # status helpers
42
+ def future?
43
+ ['scheduled', 'delayed'].include? status
44
+ end
45
+ def started?
46
+ ['inprogress', 'halftime', 'delayed'].include? status
47
+ end
48
+ def finished?
49
+ ['completed', 'closed'].include? status
50
+ end
51
+ def closed?
52
+ 'closed' == status
53
+ end
54
+
55
+
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ __END__
62
+
63
+ ss = sr.schedule;
64
+ sr = Sportradar::Api::Nba.new
65
+ sd = sr.daily_schedule;
66
+ g = sd.games.last;
67
+ g.overview
68
+ box = g.get_box;
69
+ pbp = g.get_pbp;
70
+ g.quarters.size
71
+ g.plays.size
72
+
73
+ Sportradar::Api::Nba::Team.all.size # => 32 - includes all star teams
74
+
@@ -0,0 +1,65 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Play < Data
5
+ attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :updated, :location, :possession, :on_court
6
+ alias :type :event_type
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
+ # klass = subclass(data['event_type'])
15
+ # @all_hash[data['id']] = klass.new(data, **opts) rescue (puts data['event_type']; binding.pry)
16
+ # end
17
+ # end
18
+ def self.new(data, **opts)
19
+ klass = subclass(data['event_type'])
20
+ klass.new(data, **opts) rescue (puts data['event_type']; binding.pry)
21
+ end
22
+ # def self.all
23
+ # @all_hash.values
24
+ # end
25
+
26
+ def self.subclass(event_type)
27
+ {
28
+ "opentip" => OpenTip,
29
+ "twopointmiss" => TwoPointMiss,
30
+ "rebound" => Rebound,
31
+ "threepointmiss" => ThreePointMiss,
32
+ "twopointmade" => TwoPointMade,
33
+ "threepointmade" => ThreePointMade,
34
+ "turnover" => Turnover,
35
+ "personalfoul" => PersonalFoul,
36
+ "jumpball" => Jumpball,
37
+ "teamtimeout" => TeamTimeout,
38
+ "shootingfoul" => ShootingFoul,
39
+ "freethrowmade" => FreeThrowMade,
40
+ "freethrowmiss" => FreeThrowMiss,
41
+ "lineupchange" => LineupChange,
42
+ "offensivefoul" => OffensiveFoul,
43
+ "endperiod" => EndPeriod,
44
+ "openinbound" => OpenInbound,
45
+ "officialtimeout" => OfficialTimeout,
46
+ "kickball" => Kickball,
47
+ "tvtimeout" => TvTimeout,
48
+ "clearpathfoul" => ClearPathFoul,
49
+ "technicalfoul" => TechnicalFoul,
50
+ "review" => Review,
51
+ "defensivethreeseconds" => DefensiveThreeSeconds,
52
+ "flagrantone" => FlagrantOne,
53
+ "flagranttwo" => FlagrantTwo,
54
+ "delay" => Delay,
55
+ "ejection" => Ejection,
56
+ }[event_type]
57
+ end
58
+
59
+ SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
60
+
61
+ PLAY_TYPES = %w[clearpathfoul defensivethreeseconds delay ejection endperiod flagrantone flagranttwo freethrowmade freethrowmiss jumpball kickball offensivefoul officialtimeout openinbound opentip personalfoul possession rebound review shootingfoul teamtimeout technicalfoul threepointmade threepointmiss turnover tvtimeout twopointmade twopointmiss warning]
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,38 @@
1
+ require_relative 'play'
2
+
3
+ require_relative 'plays/base'
4
+ require_relative 'plays/timeout'
5
+ require_relative 'plays/foul'
6
+ require_relative 'plays/end_period'
7
+ require_relative 'plays/assist'
8
+ require_relative 'plays/block'
9
+ require_relative 'plays/shot_made'
10
+ require_relative 'plays/shot_miss'
11
+ require_relative 'plays/free_throw_made'
12
+ require_relative 'plays/free_throw_miss'
13
+ require_relative 'plays/jumpball'
14
+ require_relative 'plays/kickball'
15
+ require_relative 'plays/lineup_change'
16
+ require_relative 'plays/offensive_foul'
17
+ require_relative 'plays/official_timeout'
18
+ require_relative 'plays/open_inbound'
19
+ require_relative 'plays/open_tip'
20
+ require_relative 'plays/personal_foul'
21
+ require_relative 'plays/rebound'
22
+ require_relative 'plays/shooting_foul'
23
+ require_relative 'plays/team_timeout'
24
+ require_relative 'plays/three_point_made'
25
+ require_relative 'plays/three_point_miss'
26
+ require_relative 'plays/steal'
27
+ require_relative 'plays/turnover'
28
+ require_relative 'plays/tv_timeout'
29
+ require_relative 'plays/two_point_made'
30
+ require_relative 'plays/two_point_miss'
31
+ require_relative 'plays/clear_path_foul'
32
+ require_relative 'plays/technical_foul'
33
+ require_relative 'plays/review'
34
+ require_relative 'plays/defensive_three_seconds'
35
+ require_relative 'plays/flagrant_one'
36
+ require_relative 'plays/flagrant_two'
37
+ require_relative 'plays/delay'
38
+ require_relative 'plays/ejection'
@@ -0,0 +1,11 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Assist < Play::Base
5
+ def base_key
6
+ 'assist'
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,88 @@
1
+ module Sportradar
2
+ module Api
3
+ module Basketball
4
+ class Play
5
+ class Base < Data
6
+ attr_accessor :response, :id, :clock, :event_type, :description, :statistics, :score, :team_id, :player_id, :quarter, :updated, :location, :possession, :on_court
7
+ alias :type :event_type
8
+
9
+ def initialize(data, **opts)
10
+ @response = data
11
+ @api = opts[:api]
12
+
13
+ @quarter = opts[:quarter].number.to_i rescue opts[:quarter].to_i
14
+ @id = data['id']
15
+
16
+ update(data)
17
+ end
18
+
19
+ # def game
20
+ # quarter.game
21
+ # end
22
+
23
+ def scoring_play?
24
+ points.nonzero?
25
+ end
26
+ def timeout?
27
+ false
28
+ end
29
+ def media_timeout?
30
+ false
31
+ end
32
+ def quarter_break?
33
+ false
34
+ end
35
+ def halftime?
36
+ false
37
+ end
38
+ def base_key
39
+ nil
40
+ end
41
+
42
+ def points
43
+ 0
44
+ end
45
+
46
+ def ==(other)
47
+ id == other.id && description == other.description
48
+ end
49
+
50
+ def clock_seconds
51
+ m,s = @clock.split(':')
52
+ m.to_i * 60 + s.to_i
53
+ end
54
+ def game_seconds
55
+ ([quarter, 4].min * 720) + ([quarter - 4, 0].max * 300) - clock_seconds # seconds elapsed in game, will be wrong in overtime
56
+ end
57
+
58
+ def update(data, **opts)
59
+ @event_type = data['event_type'] # "lineupchange",
60
+ @clock = data['clock'] # "12:00",
61
+ @updated = data['updated'] # "2016-10-26T00:07:52+00:00",
62
+ @description = data['description'] # "Cavaliers lineup change (Richard Jefferson, Kyrie Irving, Mike Dunleavy, Channing Frye, LeBron James)",
63
+ @attribution = data['attribution'] # {"name"=>"Cavaliers", "market"=>"Cleveland", "id"=>"583ec773-fb46-11e1-82cb-f4ce4684ea4c", "team_basket"=>"left"},
64
+ @team_id = data.dig('attribution', "id")
65
+ @location = data['location'] # {"coord_x"=>"0", "coord_y"=>"0"},
66
+ @possession = data['possession'] # {"name"=>"Knicks", "market"=>"New York", "id"=>"583ec70e-fb46-11e1-82cb-f4ce4684ea4c"},
67
+ # @on_court = data['on_court'] # hash
68
+ parse_statistics(data) if data['statistics']
69
+ end
70
+
71
+ def parse_statistics(data)
72
+ return unless data['statistics']
73
+ @statistics = data['statistics']
74
+ stat = data.dig('statistics', base_key)
75
+ stat = stat[0] if stat.is_a?(Array) # sometimes SR has an array of identical assist hashes
76
+ @team = stat['team']
77
+ @team_id = @team['id'] if @team
78
+ @player = data['player']
79
+ @player_id = @player['id'] if @player
80
+ rescue => e
81
+ binding.pry
82
+ end
83
+
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end