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.
- checksums.yaml +4 -4
- data/.env.sample +6 -0
- data/.travis.yml +1 -0
- data/Gemfile.lock +32 -30
- data/README.md +12 -9
- data/lib/sportradar/api/baseball/README.md +28 -0
- data/lib/sportradar/api/baseball/error.rb +25 -0
- data/lib/sportradar/api/baseball/event.rb +44 -0
- data/lib/sportradar/api/baseball/events/at_bat.rb +96 -0
- data/lib/sportradar/api/baseball/events/lineup.rb +41 -0
- data/lib/sportradar/api/baseball/events/warming_up.rb +35 -0
- data/lib/sportradar/api/baseball/fielder.rb +26 -0
- data/lib/sportradar/api/baseball/game.rb +472 -0
- data/lib/sportradar/api/baseball/half_inning.rb +69 -0
- data/lib/sportradar/api/baseball/inning.rb +42 -0
- data/lib/sportradar/api/baseball/lineup.rb +116 -0
- data/lib/sportradar/api/baseball/mlb/division.rb +32 -0
- data/lib/sportradar/api/baseball/mlb/hierarchy.rb +273 -0
- data/lib/sportradar/api/baseball/mlb/league.rb +27 -0
- data/lib/sportradar/api/baseball/mlb.rb +84 -0
- data/lib/sportradar/api/baseball/outcome.rb +87 -0
- data/lib/sportradar/api/baseball/pitch.rb +245 -0
- data/lib/sportradar/api/baseball/player.rb +119 -0
- data/lib/sportradar/api/baseball/record.rb +42 -0
- data/lib/sportradar/api/baseball/runner.rb +78 -0
- data/lib/sportradar/api/baseball/scoring.rb +86 -0
- data/lib/sportradar/api/baseball/team.rb +147 -0
- data/lib/sportradar/api/baseball/venue.rb +51 -0
- data/lib/sportradar/api/baseball.rb +46 -0
- data/lib/sportradar/api/basketball/broadcast.rb +15 -0
- data/lib/sportradar/api/basketball/game.rb +339 -0
- data/lib/sportradar/api/basketball/injury.rb +41 -0
- data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
- data/lib/sportradar/api/basketball/nba/division.rb +30 -0
- data/lib/sportradar/api/basketball/nba/game.rb +62 -0
- data/lib/sportradar/api/basketball/nba/hierarchy.rb +47 -0
- data/lib/sportradar/api/basketball/nba/player.rb +160 -0
- data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
- data/lib/sportradar/api/basketball/nba/schedule.rb +43 -0
- data/lib/sportradar/api/basketball/nba/scoring.rb +15 -0
- data/lib/sportradar/api/basketball/nba/season.rb +54 -0
- data/lib/sportradar/api/basketball/nba/series.rb +82 -0
- data/lib/sportradar/api/basketball/nba/team.rb +74 -0
- data/lib/sportradar/api/basketball/nba.rb +129 -0
- data/lib/sportradar/api/basketball/ncaamb/bracket.rb +44 -0
- data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
- data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
- data/lib/sportradar/api/basketball/ncaamb/game.rb +75 -0
- data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
- data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
- data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
- data/lib/sportradar/api/basketball/ncaamb/round.rb +55 -0
- data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
- data/lib/sportradar/api/basketball/ncaamb/season.rb +55 -0
- data/lib/sportradar/api/basketball/ncaamb/team.rb +61 -0
- data/lib/sportradar/api/basketball/ncaamb/tournament.rb +154 -0
- data/lib/sportradar/api/basketball/ncaamb.rb +149 -0
- data/lib/sportradar/api/basketball/play.rb +75 -0
- data/lib/sportradar/api/basketball/plays/assist.rb +14 -0
- data/lib/sportradar/api/basketball/plays/base.rb +126 -0
- data/lib/sportradar/api/basketball/plays/block.rb +14 -0
- data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
- data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +11 -0
- data/lib/sportradar/api/basketball/plays/delay.rb +11 -0
- data/lib/sportradar/api/basketball/plays/ejection.rb +14 -0
- data/lib/sportradar/api/basketball/plays/end_period.rb +28 -0
- data/lib/sportradar/api/basketball/plays/flagrant_one.rb +11 -0
- data/lib/sportradar/api/basketball/plays/flagrant_two.rb +11 -0
- data/lib/sportradar/api/basketball/plays/foul.rb +17 -0
- data/lib/sportradar/api/basketball/plays/free_throw_made.rb +23 -0
- data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +25 -0
- data/lib/sportradar/api/basketball/plays/jumpball.rb +12 -0
- data/lib/sportradar/api/basketball/plays/kickball.rb +11 -0
- data/lib/sportradar/api/basketball/plays/lineup_change.rb +11 -0
- data/lib/sportradar/api/basketball/plays/offensive_foul.rb +11 -0
- data/lib/sportradar/api/basketball/plays/official_timeout.rb +11 -0
- data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
- data/lib/sportradar/api/basketball/plays/open_tip.rb +11 -0
- data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/rebound.rb +28 -0
- data/lib/sportradar/api/basketball/plays/review.rb +11 -0
- data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
- data/lib/sportradar/api/basketball/plays/shot_made.rb +22 -0
- data/lib/sportradar/api/basketball/plays/shot_miss.rb +22 -0
- data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
- data/lib/sportradar/api/basketball/plays/team_timeout.rb +14 -0
- data/lib/sportradar/api/basketball/plays/technical_foul.rb +14 -0
- data/lib/sportradar/api/basketball/plays/three_point_made.rb +14 -0
- data/lib/sportradar/api/basketball/plays/three_point_miss.rb +11 -0
- data/lib/sportradar/api/basketball/plays/timeout.rb +24 -0
- data/lib/sportradar/api/basketball/plays/turnover.rb +19 -0
- data/lib/sportradar/api/basketball/plays/tv_timeout.rb +11 -0
- data/lib/sportradar/api/basketball/plays/two_point_made.rb +14 -0
- data/lib/sportradar/api/basketball/plays/two_point_miss.rb +11 -0
- data/lib/sportradar/api/basketball/plays.rb +39 -0
- data/lib/sportradar/api/basketball/record.rb +28 -0
- data/lib/sportradar/api/basketball/scoring.rb +103 -0
- data/lib/sportradar/api/basketball/season.rb +20 -0
- data/lib/sportradar/api/basketball/team.rb +136 -0
- data/lib/sportradar/api/basketball/venue.rb +54 -0
- data/lib/sportradar/api/basketball.rb +35 -0
- data/lib/sportradar/api/{nfl/broadcast.rb → broadcast.rb} +1 -1
- data/lib/sportradar/api/content/article.rb +1 -1
- data/lib/sportradar/api/content/article_list.rb +1 -1
- data/lib/sportradar/api/content.rb +17 -5
- data/lib/sportradar/api/data.rb +53 -0
- data/lib/sportradar/api/football/README.md +62 -0
- data/lib/sportradar/api/football/drive.rb +114 -0
- data/lib/sportradar/api/football/event.rb +36 -0
- data/lib/sportradar/api/football/game.rb +404 -0
- data/lib/sportradar/api/football/game_stats.rb +135 -0
- data/lib/sportradar/api/football/ncaafb/api.rb +81 -0
- data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
- data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
- data/lib/sportradar/api/football/ncaafb/drive.rb +36 -0
- data/lib/sportradar/api/football/ncaafb/game.rb +130 -0
- data/lib/sportradar/api/football/ncaafb/play.rb +97 -0
- data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
- data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
- data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
- data/lib/sportradar/api/football/ncaafb/team.rb +49 -0
- data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
- data/lib/sportradar/api/football/ncaafb.rb +273 -0
- data/lib/sportradar/api/football/nfl/api.rb +76 -0
- data/lib/sportradar/api/football/nfl/conference.rb +35 -0
- data/lib/sportradar/api/football/nfl/depth_chart.rb +53 -0
- data/lib/sportradar/api/football/nfl/division.rb +37 -0
- data/lib/sportradar/api/football/nfl/drive.rb +19 -0
- data/lib/sportradar/api/football/nfl/event.rb +19 -0
- data/lib/sportradar/api/football/nfl/game.rb +77 -0
- data/lib/sportradar/api/football/nfl/league_depth_chart.rb +41 -0
- data/lib/sportradar/api/football/nfl/play.rb +27 -0
- data/lib/sportradar/api/football/nfl/player.rb +31 -0
- data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
- data/lib/sportradar/api/football/nfl/team.rb +42 -0
- data/lib/sportradar/api/football/nfl/team_depth_chart.rb +44 -0
- data/lib/sportradar/api/football/nfl/week.rb +24 -0
- data/lib/sportradar/api/football/nfl.rb +322 -0
- data/lib/sportradar/api/football/play.rb +116 -0
- data/lib/sportradar/api/football/play_statistics.rb +313 -0
- data/lib/sportradar/api/football/player.rb +121 -0
- data/lib/sportradar/api/football/quarter.rb +46 -0
- data/lib/sportradar/api/football/record.rb +48 -0
- data/lib/sportradar/api/football/scoring.rb +92 -0
- data/lib/sportradar/api/football/situation.rb +32 -0
- data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
- data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
- data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
- data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
- data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
- data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
- data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
- data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
- data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
- data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
- data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
- data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
- data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
- data/lib/sportradar/api/football/stat_pack.rb +7 -3
- data/lib/sportradar/api/football/team.rb +160 -0
- data/lib/sportradar/api/football/venue.rb +25 -0
- data/lib/sportradar/api/football/week.rb +57 -0
- data/lib/sportradar/api/football.rb +47 -0
- data/lib/sportradar/api/images/asset.rb +2 -1
- data/lib/sportradar/api/images/ref.rb +15 -0
- data/lib/sportradar/api/images.rb +51 -9
- 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/mma.rb +195 -0
- data/lib/sportradar/api/poll.rb +40 -0
- data/lib/sportradar/api/request.rb +40 -8
- data/lib/sportradar/api/soccer/schedule.rb +1 -0
- data/lib/sportradar/api/version.rb +1 -1
- data/lib/sportradar/api.rb +20 -34
- metadata +157 -34
- data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
- data/lib/sportradar/api/nfl/changelog.rb +0 -17
- data/lib/sportradar/api/nfl/coach.rb +0 -17
- data/lib/sportradar/api/nfl/conference.rb +0 -16
- data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
- data/lib/sportradar/api/nfl/division.rb +0 -16
- data/lib/sportradar/api/nfl/draft.rb +0 -16
- data/lib/sportradar/api/nfl/drive.rb +0 -73
- data/lib/sportradar/api/nfl/event.rb +0 -19
- data/lib/sportradar/api/nfl/franchise.rb +0 -14
- data/lib/sportradar/api/nfl/game.rb +0 -94
- data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
- data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
- data/lib/sportradar/api/nfl/injury.rb +0 -16
- data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
- data/lib/sportradar/api/nfl/play.rb +0 -39
- data/lib/sportradar/api/nfl/play_statistics.rb +0 -247
- data/lib/sportradar/api/nfl/player.rb +0 -49
- data/lib/sportradar/api/nfl/position.rb +0 -14
- data/lib/sportradar/api/nfl/quarter.rb +0 -29
- data/lib/sportradar/api/nfl/scoring.rb +0 -25
- data/lib/sportradar/api/nfl/season.rb +0 -23
- data/lib/sportradar/api/nfl/situation.rb +0 -18
- data/lib/sportradar/api/nfl/statistic.rb +0 -28
- data/lib/sportradar/api/nfl/summary.rb +0 -17
- data/lib/sportradar/api/nfl/team.rb +0 -56
- data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
- data/lib/sportradar/api/nfl/venue.rb +0 -22
- data/lib/sportradar/api/nfl/week.rb +0 -16
- data/lib/sportradar/api/nfl.rb +0 -205
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Basketball
|
|
4
|
+
class Ncaamb
|
|
5
|
+
class Schedule < Data
|
|
6
|
+
attr_accessor :response, :id, :name, :alias, :date
|
|
7
|
+
|
|
8
|
+
def initialize(data, **opts)
|
|
9
|
+
@response = data
|
|
10
|
+
@api = opts[:api]
|
|
11
|
+
|
|
12
|
+
@id = data.dig('league', 'id')
|
|
13
|
+
@name = data.dig('league', 'name')
|
|
14
|
+
@alias = data.dig('league', 'alias')
|
|
15
|
+
@date = data['date']
|
|
16
|
+
|
|
17
|
+
@games_hash = {}
|
|
18
|
+
update_games(data['games']) if data['games']
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def games
|
|
22
|
+
@games_hash.values
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def update_games(data)
|
|
26
|
+
create_data(@games_hash, data, klass: Game, api: @api, season: self)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
__END__
|
|
36
|
+
|
|
37
|
+
sr = Sportradar::Api::Basketball::Ncaamb.new
|
|
38
|
+
sd = sr.daily_schedule(Date.new(2017, 1, 21));
|
|
39
|
+
g = sd.games.sample
|
|
40
|
+
|
|
41
|
+
ss = sr.schedule;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Basketball
|
|
4
|
+
class Ncaamb
|
|
5
|
+
class Season < Basketball::Season
|
|
6
|
+
attr_accessor :response, :id, :name, :alias, :year
|
|
7
|
+
|
|
8
|
+
def initialize(data, **opts)
|
|
9
|
+
@response = data
|
|
10
|
+
@api = opts[:api]
|
|
11
|
+
|
|
12
|
+
@id = data.dig('league', 'id')
|
|
13
|
+
@name = data.dig('league', 'name')
|
|
14
|
+
@alias = data.dig('league', 'alias')
|
|
15
|
+
|
|
16
|
+
@year = data.dig('season', 'year')
|
|
17
|
+
@type = data.dig('season', 'type')
|
|
18
|
+
|
|
19
|
+
@games_hash = {}
|
|
20
|
+
@tournaments_hash = {}
|
|
21
|
+
update_games(data['games']) if data['games']
|
|
22
|
+
update_tournaments(data['tournaments']) if data['tournaments']
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def games
|
|
26
|
+
@games_hash.values
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def tournaments
|
|
30
|
+
@tournaments_hash.values
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def tournament(id)
|
|
34
|
+
@tournaments_hash[id]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def update_games(data)
|
|
38
|
+
create_data(@games_hash, data, klass: Game, api: @api, season: self)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def update_tournaments(data)
|
|
42
|
+
create_data(@tournaments_hash, data, klass: Tournament, api: @api, season: self)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
__END__
|
|
52
|
+
|
|
53
|
+
sr = Sportradar::Api::Basketball::Ncaamb.new
|
|
54
|
+
sd = sr.daily_schedule;
|
|
55
|
+
ss = sr.schedule;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Basketball
|
|
4
|
+
class Ncaamb
|
|
5
|
+
class Team < Sportradar::Api::Basketball::Team
|
|
6
|
+
attr_accessor :source, :source_id
|
|
7
|
+
|
|
8
|
+
@all_hash = {}
|
|
9
|
+
def self.new(data, **opts)
|
|
10
|
+
existing = @all_hash[data['id']]
|
|
11
|
+
if existing
|
|
12
|
+
existing.update(data, **opts)
|
|
13
|
+
existing
|
|
14
|
+
else
|
|
15
|
+
if data['id']
|
|
16
|
+
@all_hash[data['id']] = super
|
|
17
|
+
else # tournament placeholder
|
|
18
|
+
super.tap do |team|
|
|
19
|
+
team.source = data['source']
|
|
20
|
+
team.source_id = data.dig('source', 'id')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
def self.all
|
|
26
|
+
@all_hash.values
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def player_class
|
|
30
|
+
Player
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def api
|
|
34
|
+
@api || Sportradar::Api::Basketball::Ncaamb.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def good_guys?
|
|
38
|
+
id == "9b166a3f-e64b-4825-bb6b-92c6f0418263"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
__END__
|
|
48
|
+
ss = sr.schedule;
|
|
49
|
+
sd = sr.daily_schedule;
|
|
50
|
+
sr = Sportradar::Api::Basketball::Nba.new
|
|
51
|
+
lh = sr.league_hierarchy;
|
|
52
|
+
t = lh.teams.first;
|
|
53
|
+
ss = t.get_season_stats;
|
|
54
|
+
g = sd.games.last;
|
|
55
|
+
t = g.home;
|
|
56
|
+
Sportradar::Api::Basketball::Nba::Team.all.size
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# week_count = ss.weeks.count;
|
|
60
|
+
# w1 = ss.weeks.first;
|
|
61
|
+
# w1 = ss.weeks(1);
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Basketball
|
|
4
|
+
class Ncaamb
|
|
5
|
+
class Tournament < Data
|
|
6
|
+
attr_accessor :response, :id, :name, :status, :location, :start, :end
|
|
7
|
+
|
|
8
|
+
def initialize(data, **opts)
|
|
9
|
+
# @response = data
|
|
10
|
+
@api = opts[:api]
|
|
11
|
+
|
|
12
|
+
@id = data['id']
|
|
13
|
+
|
|
14
|
+
@rounds_hash = {}
|
|
15
|
+
@brackets_hash = {}
|
|
16
|
+
|
|
17
|
+
update(data, **opts)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def update(data, **opts)
|
|
21
|
+
|
|
22
|
+
@season = opts[:season] if opts[:season]
|
|
23
|
+
|
|
24
|
+
@status = data['status'] if data['status']
|
|
25
|
+
@name = data['name'] if data['name']
|
|
26
|
+
@location = data['location'] if data['location']
|
|
27
|
+
@start = Date.parse(data['start_date']) if data['start_date']
|
|
28
|
+
@end = Date.parse(data['end_date']) if data['end_date']
|
|
29
|
+
@type = data.dig('season', 'type') if data.dig('season', 'type')
|
|
30
|
+
|
|
31
|
+
update_rounds(data['rounds']) if data['rounds'] # switch to rounds
|
|
32
|
+
update_brackets(data['brackets']) if data['brackets'] # switch to brackets
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def games
|
|
36
|
+
rounds.flat_map(&:games)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def game(id)
|
|
40
|
+
games.detect { |g| g.id == id }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def year
|
|
44
|
+
@season&.year || (@start&.-120)&.year
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def rounds
|
|
48
|
+
@rounds_hash.values
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def brackets
|
|
52
|
+
@brackets_hash.values
|
|
53
|
+
end
|
|
54
|
+
def bracket(id)
|
|
55
|
+
@brackets_hash[id]
|
|
56
|
+
end
|
|
57
|
+
def update_bracket(id, data)
|
|
58
|
+
if @brackets_hash[id]
|
|
59
|
+
@brackets_hash[id].update(data)
|
|
60
|
+
else
|
|
61
|
+
@brackets_hash[id] = Bracket.new(data, tournament: self)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
def update_brackets(data)
|
|
65
|
+
create_data(@brackets_hash, data, klass: Round, api: @api, tournament: self)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# switch to rounds
|
|
69
|
+
# rounds are either bracketed (bracketed) or not (games)
|
|
70
|
+
def update_rounds(data)
|
|
71
|
+
create_data(@rounds_hash, data, klass: Round, api: @api, tournament: self)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# url paths
|
|
75
|
+
def path_base
|
|
76
|
+
"tournaments/#{ id }"
|
|
77
|
+
end
|
|
78
|
+
def path_schedule
|
|
79
|
+
"#{ path_base }/schedule"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def path_summary
|
|
83
|
+
"#{ path_base }/summary"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# data retrieval
|
|
87
|
+
def sync
|
|
88
|
+
get_summary
|
|
89
|
+
get_schedule
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# summary
|
|
93
|
+
def get_summary
|
|
94
|
+
data = api.get_data(path_summary)
|
|
95
|
+
ingest_summary(data)
|
|
96
|
+
end
|
|
97
|
+
def queue_summary
|
|
98
|
+
url, headers, options, timeout = api.get_request_info(path_summary)
|
|
99
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_summary)}
|
|
100
|
+
end
|
|
101
|
+
def ingest_summary(data)
|
|
102
|
+
update(data, source: :summary)
|
|
103
|
+
data
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# schedule
|
|
107
|
+
def get_schedule
|
|
108
|
+
data = api.get_data(path_schedule)
|
|
109
|
+
ingest_schedule(data)
|
|
110
|
+
end
|
|
111
|
+
def queue_schedule
|
|
112
|
+
url, headers, options, timeout = api.get_request_info(path_schedule)
|
|
113
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
|
|
114
|
+
end
|
|
115
|
+
def ingest_schedule(data)
|
|
116
|
+
update(data, source: :schedule)
|
|
117
|
+
data
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def api
|
|
121
|
+
@api ||= Sportradar::Api::Basketball::Ncaamb.new
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
__END__
|
|
131
|
+
|
|
132
|
+
sr = Sportradar::Api::Basketball::Ncaamb.new
|
|
133
|
+
ss = sr.tournaments(2015);
|
|
134
|
+
ss = sr.conference_tournaments(2015);
|
|
135
|
+
ts = sr.conference_tournaments;
|
|
136
|
+
ts = sr.tournaments;
|
|
137
|
+
t = ss.tournament("608152a4-cccc-4569-83ac-27062580099e") # => NCAA tourney 2015
|
|
138
|
+
t = ts.tournament("74db39e5-be49-4ec8-9169-0cc20ed9f792") # => NCAA tourney 2016
|
|
139
|
+
tt = Sportradar::Api::Basketball::Ncaamb::Tournament.new('id' => "608152a4-cccc-4569-83ac-27062580099e") # => NCAA tourney 2015
|
|
140
|
+
t = ss.tournament("1a4a1d3d-b734-4136-a7c2-711b4b3821a5") # => Pac12 tourney 2015
|
|
141
|
+
t = Sportradar::Api::Basketball::Ncaamb::Tournament.new('id' => "1a4a1d3d-b734-4136-a7c2-711b4b3821a5") # => NCAA tourney 2015
|
|
142
|
+
t = ts.first
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
sr = Sportradar::Api::Basketball::Ncaamb.new
|
|
148
|
+
ts = sr.conference_tournaments;
|
|
149
|
+
asun = "40e97e30-980c-4146-bf69-1791852c5527"
|
|
150
|
+
t = ts.tournament(asun);
|
|
151
|
+
t.get_schedule;
|
|
152
|
+
g = t.game("1fc9ea90-8145-47a6-86a7-9cd05513fb2c")
|
|
153
|
+
|
|
154
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
module Sportradar
|
|
2
|
+
module Api
|
|
3
|
+
module Basketball
|
|
4
|
+
class Ncaamb < Request
|
|
5
|
+
attr_accessor :league, :access_level, :simulation, :error
|
|
6
|
+
|
|
7
|
+
def initialize(access_level = default_access_level)
|
|
8
|
+
@league = 'ncaamb'
|
|
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, ncaamb_season = default_season)
|
|
14
|
+
raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? ncaamb_season
|
|
15
|
+
response = get request_url("games/#{season_year}/#{ncaamb_season}/schedule")
|
|
16
|
+
if response.success?
|
|
17
|
+
Sportradar::Api::Basketball::Ncaamb::Season.new(response.to_h, api: self)
|
|
18
|
+
else
|
|
19
|
+
@error = response
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def tournaments(season_year = default_year, ncaamb_season = 'pst')
|
|
24
|
+
raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? ncaamb_season
|
|
25
|
+
response = get request_url("tournaments/#{season_year}/#{ncaamb_season}/schedule")
|
|
26
|
+
if response.success?
|
|
27
|
+
Sportradar::Api::Basketball::Ncaamb::Season.new(response.to_h, api: self)
|
|
28
|
+
else
|
|
29
|
+
@error = response
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def conference_tournaments(season_year = default_year)
|
|
34
|
+
tournaments(season_year, 'ct')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def daily_schedule(date = default_date)
|
|
38
|
+
response = get request_url("games/#{ date.year }/#{ date.month }/#{ date.day }/schedule")
|
|
39
|
+
if response.success?
|
|
40
|
+
Sportradar::Api::Basketball::Ncaamb::Schedule.new(response.to_h, api: self)
|
|
41
|
+
else
|
|
42
|
+
@error = response
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def rankings(poll_name, ncaamb_week = nil, season_year = default_year)
|
|
47
|
+
# response = get request_url("polls/#{poll_name}/#{season_year}/rankings")
|
|
48
|
+
response = get request_url("polls/#{poll_name}/#{season_year}/#{ncaamb_week}/rankings")
|
|
49
|
+
if response.success?
|
|
50
|
+
Sportradar::Api::Poll.new(response.to_h)
|
|
51
|
+
else
|
|
52
|
+
@error = response
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def hierarchy
|
|
57
|
+
response = get request_url("league/hierarchy")
|
|
58
|
+
if response.success?
|
|
59
|
+
Sportradar::Api::Basketball::Ncaamb::Hierarchy.new(response.to_h, api: self)
|
|
60
|
+
else
|
|
61
|
+
response
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def standings(season_year = default_year, ncaamb_season = default_season)
|
|
66
|
+
response = get request_url("seasontd/#{season_year}/#{ncaamb_season}/standings")
|
|
67
|
+
if response.success?
|
|
68
|
+
Sportradar::Api::Basketball::Ncaamb::Division.new(response.to_h, api: self)
|
|
69
|
+
else
|
|
70
|
+
response
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def get_data(url)
|
|
75
|
+
get request_url(url)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def default_year
|
|
79
|
+
2016
|
|
80
|
+
end
|
|
81
|
+
def default_date
|
|
82
|
+
Date.today
|
|
83
|
+
end
|
|
84
|
+
def default_season
|
|
85
|
+
'reg'
|
|
86
|
+
end
|
|
87
|
+
def default_access_level
|
|
88
|
+
if (ENV['SPORTRADAR_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']) == 'production'
|
|
89
|
+
'p'
|
|
90
|
+
else
|
|
91
|
+
't'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def content_format
|
|
96
|
+
'json'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def check_simulation(game_id)
|
|
102
|
+
@simulation = true if simulation_games.include?(game_id)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def request_url(path)
|
|
106
|
+
# puts "/ncaamb-#{access_level}#{version}/#{path}"
|
|
107
|
+
if simulation
|
|
108
|
+
# "/nfl-sim1/#{path}"
|
|
109
|
+
else
|
|
110
|
+
"/ncaamb-#{access_level}#{version}/#{path}"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def api_key
|
|
115
|
+
if !['t', 'sim'].include?(access_level)
|
|
116
|
+
Sportradar::Api.api_key_params('ncaamb', 'production')
|
|
117
|
+
else
|
|
118
|
+
Sportradar::Api.api_key_params('ncaamb')
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def version
|
|
123
|
+
Sportradar::Api.version('nba')
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def allowed_access_levels
|
|
127
|
+
%w[p t sim]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def allowed_seasons
|
|
131
|
+
["pre", "reg", 'ct', "pst"]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
__END__
|
|
140
|
+
|
|
141
|
+
sr = Sportradar::Api::Basketball::Ncaamb.new
|
|
142
|
+
ss = sr.schedule(2015, 'ct');
|
|
143
|
+
ss = sr.schedule(2015, 'pst');
|
|
144
|
+
rank = sr.rankings('US');
|
|
145
|
+
ds = sr.daily_schedule;
|
|
146
|
+
|
|
147
|
+
# not ready
|
|
148
|
+
lh = sr.league_hierarchy;
|
|
149
|
+
ls = sr.standings;
|
|
@@ -0,0 +1,75 @@
|
|
|
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)
|
|
21
|
+
# rescue => e
|
|
22
|
+
# binding.pry
|
|
23
|
+
end
|
|
24
|
+
# def self.all
|
|
25
|
+
# @all_hash.values
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
def self.subclass(event_type)
|
|
29
|
+
subclasses[event_type]
|
|
30
|
+
end
|
|
31
|
+
def self.subclasses
|
|
32
|
+
@subclasses ||= {
|
|
33
|
+
"opentip" => OpenTip,
|
|
34
|
+
"twopointmiss" => TwoPointMiss,
|
|
35
|
+
"rebound" => Rebound,
|
|
36
|
+
"threepointmiss" => ThreePointMiss,
|
|
37
|
+
"twopointmade" => TwoPointMade,
|
|
38
|
+
"threepointmade" => ThreePointMade,
|
|
39
|
+
"turnover" => Turnover,
|
|
40
|
+
"personalfoul" => PersonalFoul,
|
|
41
|
+
"jumpball" => Jumpball,
|
|
42
|
+
"deadball" => Deadball,
|
|
43
|
+
"teamtimeout" => TeamTimeout,
|
|
44
|
+
"shootingfoul" => ShootingFoul,
|
|
45
|
+
"freethrowmade" => FreeThrowMade,
|
|
46
|
+
"freethrowmiss" => FreeThrowMiss,
|
|
47
|
+
"lineupchange" => LineupChange,
|
|
48
|
+
"offensivefoul" => OffensiveFoul,
|
|
49
|
+
"endperiod" => EndPeriod,
|
|
50
|
+
"openinbound" => OpenInbound,
|
|
51
|
+
"officialtimeout" => OfficialTimeout,
|
|
52
|
+
"kickball" => Kickball,
|
|
53
|
+
"tvtimeout" => TvTimeout,
|
|
54
|
+
"clearpathfoul" => ClearPathFoul,
|
|
55
|
+
"technicalfoul" => TechnicalFoul,
|
|
56
|
+
"review" => Review,
|
|
57
|
+
"defensivethreeseconds" => DefensiveThreeSeconds,
|
|
58
|
+
"flagrantone" => FlagrantOne,
|
|
59
|
+
"flagranttwo" => FlagrantTwo,
|
|
60
|
+
"delay" => Delay,
|
|
61
|
+
"ejection" => Ejection,
|
|
62
|
+
# abstract types, used for lookup purposes
|
|
63
|
+
"foul" => Foul,
|
|
64
|
+
"shotmade" => ShotMade,
|
|
65
|
+
"shotmiss" => ShotMiss,
|
|
66
|
+
}.freeze
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# SHOT_TYPES = %w[driving pullup step back fadeaway putback floating finger roll turnaround reverse alley-oop]
|
|
70
|
+
|
|
71
|
+
# 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]
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
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, :half, :updated, :location, :possession, :on_court, :game_seconds, :identifier
|
|
7
|
+
alias :type :event_type
|
|
8
|
+
|
|
9
|
+
def initialize(data, **opts)
|
|
10
|
+
@response = data
|
|
11
|
+
@api = opts[:api]
|
|
12
|
+
|
|
13
|
+
@id = data['id']
|
|
14
|
+
|
|
15
|
+
@quarter = opts[:quarter].sequence.to_i rescue opts[:quarter].to_i
|
|
16
|
+
@half = opts[:half].sequence.to_i rescue opts[:half].to_i
|
|
17
|
+
|
|
18
|
+
update(data, **opts)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def period
|
|
22
|
+
@quarter.nonzero? || @half.nonzero?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# def game
|
|
26
|
+
# quarter.game
|
|
27
|
+
# end
|
|
28
|
+
def display_type
|
|
29
|
+
''
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def scoring_play?
|
|
33
|
+
points.nonzero?
|
|
34
|
+
end
|
|
35
|
+
def timeout?
|
|
36
|
+
false
|
|
37
|
+
end
|
|
38
|
+
def media_timeout?
|
|
39
|
+
false
|
|
40
|
+
end
|
|
41
|
+
def quarter_break?
|
|
42
|
+
false
|
|
43
|
+
end
|
|
44
|
+
def halftime?
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
def end_of_period?
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
def end_of_regulation?
|
|
51
|
+
false
|
|
52
|
+
end
|
|
53
|
+
def end_of_ot?
|
|
54
|
+
false
|
|
55
|
+
end
|
|
56
|
+
def base_key
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def points
|
|
61
|
+
0
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def ==(other)
|
|
65
|
+
id == other.id && description == other.description
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def clock_seconds
|
|
69
|
+
m,s = @clock.split(':')
|
|
70
|
+
m.to_i * 60 + s.to_i
|
|
71
|
+
end
|
|
72
|
+
def nba_game_seconds
|
|
73
|
+
([quarter, 4].min * 720) + ([quarter - 4, 0].max * 300) - clock_seconds # seconds elapsed in game, only works for NBA
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private def ncaa_game_seconds
|
|
77
|
+
([half, 2].min * 1200) + ([half - 2, 0].max * 300) - clock_seconds # seconds elapsed in game, only works for NBA
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def update(data, **opts)
|
|
81
|
+
@event_type = data['event_type'] # "lineupchange",
|
|
82
|
+
@clock = data['clock'] # "12:00",
|
|
83
|
+
@updated = data['updated'] # "2016-10-26T00:07:52+00:00",
|
|
84
|
+
@description = data['description'] # "Cavaliers lineup change (Richard Jefferson, Kyrie Irving, Mike Dunleavy, Channing Frye, LeBron James)",
|
|
85
|
+
@attribution = data['attribution'] # {"name"=>"Cavaliers", "market"=>"Cleveland", "id"=>"583ec773-fb46-11e1-82cb-f4ce4684ea4c", "team_basket"=>"left"},
|
|
86
|
+
@team_id = data.dig('attribution', "id")
|
|
87
|
+
@location = data['location'] # {"coord_x"=>"0", "coord_y"=>"0"},
|
|
88
|
+
@possession = data['possession'] # {"name"=>"Knicks", "market"=>"New York", "id"=>"583ec70e-fb46-11e1-82cb-f4ce4684ea4c"},
|
|
89
|
+
# @on_court = data['on_court'] # hash
|
|
90
|
+
|
|
91
|
+
handle_time(data, **opts)
|
|
92
|
+
parse_statistics(data) if data['statistics']
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def handle_time(data, **opts)
|
|
96
|
+
@game_seconds = if opts[:quarter]
|
|
97
|
+
@quarter = opts[:quarter].sequence.to_i rescue opts[:quarter].to_i
|
|
98
|
+
@identifier = "#{quarter}_#{(720 - clock_seconds).to_s.rjust(3, '0')}".to_i
|
|
99
|
+
nba_game_seconds
|
|
100
|
+
elsif opts[:half]
|
|
101
|
+
@half = opts[:half].sequence.to_i rescue opts[:half].to_i
|
|
102
|
+
@identifier = "#{half}_#{(1200 - clock_seconds).to_s.rjust(4, '0')}".to_i
|
|
103
|
+
ncaa_game_seconds
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def parse_statistics(data)
|
|
108
|
+
return unless data['statistics']
|
|
109
|
+
@statistics = data['statistics']
|
|
110
|
+
stat = @statistics.detect { |hash| hash['type'] == base_key }
|
|
111
|
+
# stat = data.dig('statistics', base_key) rescue data.dig('statistics', 0, base_key)
|
|
112
|
+
# stat = stat[0] if stat.is_a?(Array) # sometimes SR has an array of identical assist hashes
|
|
113
|
+
@team = stat['team']
|
|
114
|
+
@team_id = @team['id'] if @team
|
|
115
|
+
@player = stat['player']
|
|
116
|
+
@player_id = @player['id'] if @player
|
|
117
|
+
rescue => e
|
|
118
|
+
puts e
|
|
119
|
+
# binding.pry
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|