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,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)
|