sportradar-api 0.10.55 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +28 -26
- data/README.md +7 -6
- data/lib/sportradar/api/baseball/{REAME.md → README.md} +0 -0
- data/lib/sportradar/api/baseball/game.rb +29 -2
- data/lib/sportradar/api/baseball/mlb/hierarchy.rb +1 -0
- data/lib/sportradar/api/baseball/record.rb +0 -4
- data/lib/sportradar/api/baseball/venue.rb +2 -1
- data/lib/sportradar/api/basketball/game.rb +2 -2
- data/lib/sportradar/api/basketball/record.rb +0 -4
- data/lib/sportradar/api/basketball/venue.rb +2 -1
- data/lib/sportradar/api/data.rb +3 -3
- data/lib/sportradar/api/football/README.md +62 -0
- data/lib/sportradar/api/football/drive.rb +105 -0
- data/lib/sportradar/api/football/event.rb +33 -0
- data/lib/sportradar/api/football/game.rb +389 -0
- data/lib/sportradar/api/football/game_stats.rb +135 -0
- data/lib/sportradar/api/football/ncaafb/api.rb +76 -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 +16 -0
- data/lib/sportradar/api/football/ncaafb/game.rb +110 -0
- data/lib/sportradar/api/football/ncaafb/play.rb +20 -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 +45 -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/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/play.rb +20 -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/week.rb +24 -0
- data/lib/sportradar/api/football/nfl.rb +293 -0
- data/lib/sportradar/api/football/play.rb +93 -0
- data/lib/sportradar/api/football/player.rb +111 -0
- data/lib/sportradar/api/football/quarter.rb +42 -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 +20 -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 +43 -0
- data/lib/sportradar/api/mma/venue.rb +1 -1
- data/lib/sportradar/api/request.rb +19 -2
- data/lib/sportradar/api/version.rb +1 -1
- data/lib/sportradar/api.rb +0 -41
- metadata +41 -43
- data/lib/sportradar/api/ncaafb/drive.rb +0 -89
- data/lib/sportradar/api/ncaafb/game.rb +0 -161
- data/lib/sportradar/api/ncaafb/play.rb +0 -39
- data/lib/sportradar/api/ncaafb/player.rb +0 -61
- data/lib/sportradar/api/ncaafb/quarter.rb +0 -37
- data/lib/sportradar/api/ncaafb/season.rb +0 -71
- data/lib/sportradar/api/ncaafb/team.rb +0 -69
- data/lib/sportradar/api/ncaafb/week.rb +0 -33
- data/lib/sportradar/api/ncaafb.rb +0 -185
- data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
- data/lib/sportradar/api/nfl/broadcast.rb +0 -13
- 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 -17
- 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 -123
- 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 -249
- data/lib/sportradar/api/nfl/player.rb +0 -56
- 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 -211
@@ -0,0 +1,16 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
5
|
+
class Drive < Sportradar::Api::Football::Drive
|
6
|
+
|
7
|
+
def handle_plays_and_events(data, **opts)
|
8
|
+
create_data(@plays_hash, data['actions'], klass: Play, api: api, game: self) if data['actions']
|
9
|
+
create_data(@events_hash, data['events'], klass: Event, api: api, game: self) if data['events']
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
5
|
+
class Game < Sportradar::Api::Football::Game
|
6
|
+
|
7
|
+
def initialize(data, **opts)
|
8
|
+
if data['uri']
|
9
|
+
@year, @type, @week_number, @away_alias, @home_alias = data['uri'].split('/')
|
10
|
+
end
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def path_base
|
15
|
+
"#{ year }/#{ type }/#{ week_number.to_s }/#{ away_alias }/#{ home_alias }"
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate_title
|
19
|
+
if home && away
|
20
|
+
"#{home.full_name} vs #{away.full_name}"
|
21
|
+
elsif home_alias && away_alias
|
22
|
+
"#{home_alias} vs #{away_alias}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def type # Bowl games don't seem to work when they use the bowl type instead of REG
|
27
|
+
'REG'
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def get_extended_box
|
32
|
+
data = api.get_data(path_extended_box).to_h
|
33
|
+
ingest_extended_box(data)
|
34
|
+
end
|
35
|
+
|
36
|
+
def ingest_extended_box(data)
|
37
|
+
data = data
|
38
|
+
update(data, source: :extended_box)
|
39
|
+
check_newness(:extended_box, @clock)
|
40
|
+
data
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_summary
|
44
|
+
data = api.get_data(path_summary).to_h
|
45
|
+
ingest_summary(data)
|
46
|
+
end
|
47
|
+
|
48
|
+
def queue_summary
|
49
|
+
url, headers, options, timeout = api.get_request_info(path_summary)
|
50
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_summary)}
|
51
|
+
end
|
52
|
+
|
53
|
+
def ingest_summary(data)
|
54
|
+
data = data
|
55
|
+
update(data, source: :summary)
|
56
|
+
@quarter = data.delete('quarter').to_i
|
57
|
+
check_newness(:box, @clock)
|
58
|
+
check_newness(:score, @score)
|
59
|
+
data
|
60
|
+
end
|
61
|
+
|
62
|
+
def team_class
|
63
|
+
Team
|
64
|
+
end
|
65
|
+
def period_class
|
66
|
+
Quarter
|
67
|
+
end
|
68
|
+
|
69
|
+
def period_name
|
70
|
+
'quarter'
|
71
|
+
end
|
72
|
+
|
73
|
+
def quarter_class
|
74
|
+
Sportradar::Api::Football::Ncaafb::Quarter
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
def api
|
79
|
+
@api || Sportradar::Api::Football::Ncaafb::Api.new
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
__END__
|
89
|
+
|
90
|
+
File.binwrite('ncaafb.bin', Marshal.dump(ncaafb))
|
91
|
+
|
92
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new(year: 2016)
|
93
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new
|
94
|
+
gg = ncaafb.games;
|
95
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
96
|
+
g2 = ncaafb.games.sample
|
97
|
+
g = gg.first;
|
98
|
+
g = gg.sample;
|
99
|
+
g.week_number
|
100
|
+
g.year
|
101
|
+
g.type
|
102
|
+
g.path_pbp
|
103
|
+
res = g.get_pbp;
|
104
|
+
|
105
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
106
|
+
g = ncaafb.games.first;
|
107
|
+
res = g.get_pbp;
|
108
|
+
g.quarters.first.drives[1]
|
109
|
+
|
110
|
+
g = gg.detect{|g| g.id == "b8001149-bb55-4014-a3e8-6ac0a261dfe1" } # overtime game
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaaf
|
5
|
+
class Play < Sportradar::Api::Football::Play
|
6
|
+
|
7
|
+
# def parse_player
|
8
|
+
# # TODO: Currently there is an issue where we are only mapping one player_id to a play, but there are plays with multiple players involved.
|
9
|
+
# play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
|
10
|
+
# if play_stats.is_a?(Array)
|
11
|
+
# play_stats = play_stats.first
|
12
|
+
# end
|
13
|
+
# @player_id = play_stats&.player&.id
|
14
|
+
# end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
5
|
+
class Player < Sportradar::Api::Football::Player
|
6
|
+
|
7
|
+
def api
|
8
|
+
@api || Sportradar::Api::Football::Ncaafb::Api.new
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
__END__
|
18
|
+
|
19
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
20
|
+
|
21
|
+
t = ncaafb.teams.first;
|
22
|
+
t.get_roster;
|
23
|
+
t.players.first
|
24
|
+
t.players.first.totals
|
25
|
+
|
26
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
27
|
+
t = ncaafb.teams.sample
|
28
|
+
data = t.get_season_stats(2016);
|
29
|
+
t.get_roster;
|
30
|
+
t.players.sample
|
31
|
+
t.players.sample.totals
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
5
|
+
class Subdivision < Data
|
6
|
+
attr_accessor :response, :id, :name, :alias
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
|
12
|
+
@id = data["id"]
|
13
|
+
@name = data["name"]
|
14
|
+
|
15
|
+
@teams_hash = {}
|
16
|
+
@assigned_teams = nil
|
17
|
+
# binding.pry
|
18
|
+
|
19
|
+
create_data(@teams_hash, data["teams"], klass: Team, conference: self, api: @api) if data["teams"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def teams
|
23
|
+
@assigned_teams || @teams_hash.values
|
24
|
+
end
|
25
|
+
def teams=(array)
|
26
|
+
@assigned_teams = array
|
27
|
+
end
|
28
|
+
def team(code_name)
|
29
|
+
teams_by_name[code_name]
|
30
|
+
end
|
31
|
+
private def teams_by_name
|
32
|
+
@teams_by_name ||= teams.map { |t| [t.alias, t] }.to_h
|
33
|
+
end
|
34
|
+
def conferences
|
35
|
+
teams.flat_map(&:conferences)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
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_roster
|
18
|
+
"#{ path_base }/roster"
|
19
|
+
end
|
20
|
+
def path_season_stats(year = season_year, season = ncaafb_season)
|
21
|
+
"#{path_base}/#{year}/#{ncaafb_season}/statistics"
|
22
|
+
end
|
23
|
+
|
24
|
+
def api
|
25
|
+
@api || Sportradar::Api::Football::Ncaafb::Api.new
|
26
|
+
end
|
27
|
+
def ncaafb_season
|
28
|
+
@type || default_season
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
__END__
|
39
|
+
|
40
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
41
|
+
|
42
|
+
t = ncaafb.teams.first
|
43
|
+
data = t.get_season_stats
|
44
|
+
data = t.get_season_stats(2016)
|
45
|
+
t.players.count
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb
|
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
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new
|
22
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new
|
23
|
+
res1 = ncaafb.get_schedule;
|
24
|
+
res2 = ncaafb.get_weekly_schedule;
|
@@ -0,0 +1,273 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Ncaafb < Data
|
5
|
+
attr_accessor :response, :id, :name, :alias, :type
|
6
|
+
def all_attributes
|
7
|
+
[:name, :alias, :leagues, :divisions, :teams]
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(data = {}, **opts)
|
11
|
+
# @response = data
|
12
|
+
@api = opts[:api]
|
13
|
+
@id = data['id']
|
14
|
+
@season = opts[:year]
|
15
|
+
@type = opts[:type]
|
16
|
+
|
17
|
+
@divisions_hash = {}
|
18
|
+
@weeks_hash = {}
|
19
|
+
@games_hash = {}
|
20
|
+
@teams_hash = {}
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def update(data, source: nil, **opts)
|
25
|
+
# update stuff
|
26
|
+
@id = data['id'] if data['id']
|
27
|
+
@season = data['season'] if data['season']
|
28
|
+
@type = data['type'] if data['type']
|
29
|
+
# @name = data.dig('league', 'name') if data.dig('league', 'name')
|
30
|
+
# @alias = data.dig('league', 'alias') if data.dig('league', 'alias')
|
31
|
+
|
32
|
+
# @year = data.dig('season', 'year') if data.dig('season', 'year')
|
33
|
+
# @type = data.dig('season', 'type') if data.dig('season', 'type')
|
34
|
+
|
35
|
+
create_data(@divisions_hash, data['divisions'], klass: Division, hierarchy: self, api: api) if data['divisions']
|
36
|
+
create_data(@teams_hash, data['teams'], klass: Team, hierarchy: self, api: api) if data['teams']
|
37
|
+
|
38
|
+
if data['weeks']
|
39
|
+
create_data(@weeks_hash, data['weeks'], klass: Week, hierarchy: self, api: @api)
|
40
|
+
end
|
41
|
+
|
42
|
+
if data['games']
|
43
|
+
if data['games'].first.keys == ['game']
|
44
|
+
data['games'].map! { |hash| hash['game'] }
|
45
|
+
end
|
46
|
+
@games_hash = create_data(@games_hash, data['games'], klass: Game, hierarchy: self, api: api)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
def weeks
|
50
|
+
@weeks_hash.values
|
51
|
+
end
|
52
|
+
def divisions
|
53
|
+
@divisions_hash.values
|
54
|
+
end
|
55
|
+
def division(code_name)
|
56
|
+
divisions_by_name[code_name]
|
57
|
+
end
|
58
|
+
private def divisions_by_name
|
59
|
+
@divisions_by_name ||= divisions.map { |d| [d.alias, d] }.to_h
|
60
|
+
end
|
61
|
+
def conferences
|
62
|
+
divisions.flat_map(&:conferences)
|
63
|
+
end
|
64
|
+
|
65
|
+
def schedule
|
66
|
+
get_schedule if games.empty?
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def standings
|
71
|
+
get_standings if divisions.empty? || teams.first&.record.nil?
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def hierarchy
|
76
|
+
get_hierarchy if divisions.empty?
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
def games
|
81
|
+
get_schedule if @weeks_hash.empty?
|
82
|
+
weeks.flat_map(&:games)
|
83
|
+
end
|
84
|
+
def teams
|
85
|
+
teams = conferences.flat_map(&:teams)
|
86
|
+
if teams.empty?
|
87
|
+
if @teams_hash.empty?
|
88
|
+
get_hierarchy
|
89
|
+
conferences.flat_map(&:teams)
|
90
|
+
else
|
91
|
+
@teams_hash.values
|
92
|
+
end
|
93
|
+
else
|
94
|
+
teams
|
95
|
+
end
|
96
|
+
end
|
97
|
+
def team(team_id)
|
98
|
+
teams.detect { |team| team.id == team_id }
|
99
|
+
end
|
100
|
+
|
101
|
+
# api stuff
|
102
|
+
def api
|
103
|
+
@api || Sportradar::Api::Football::Ncaafb::Api.new
|
104
|
+
end
|
105
|
+
|
106
|
+
def default_year
|
107
|
+
(Date.today - 60).year
|
108
|
+
end
|
109
|
+
def default_date
|
110
|
+
Date.today
|
111
|
+
end
|
112
|
+
def default_season
|
113
|
+
'reg'
|
114
|
+
end
|
115
|
+
def season_year
|
116
|
+
@season || default_year
|
117
|
+
end
|
118
|
+
alias :year :season_year
|
119
|
+
def ncaafb_season
|
120
|
+
@type || default_season
|
121
|
+
end
|
122
|
+
alias :season :ncaafb_season
|
123
|
+
|
124
|
+
|
125
|
+
# url paths
|
126
|
+
def path_base
|
127
|
+
"league"
|
128
|
+
end
|
129
|
+
def path_hierarchy(division = 'FBS')
|
130
|
+
"teams/#{division}/hierarchy"
|
131
|
+
end
|
132
|
+
def path_schedule
|
133
|
+
"#{season_year}/#{ncaafb_season}/schedule"
|
134
|
+
end
|
135
|
+
def path_weekly_schedule(ncaafb_season_week)
|
136
|
+
"#{season_year}/#{ncaafb_season}/#{ncaafb_season_week}/schedule"
|
137
|
+
end
|
138
|
+
def path_rankings(ncaafb_season_week, poll_name = 'AP25')
|
139
|
+
"polls/#{poll_name}/#{season_year}/#{ncaafb_season_week}/rankings"
|
140
|
+
end
|
141
|
+
def path_standings(division = 'FBS')
|
142
|
+
"teams/#{division}/#{season_year}/#{ncaafb_season}/standings"
|
143
|
+
end
|
144
|
+
|
145
|
+
# data retrieval
|
146
|
+
|
147
|
+
## schedule
|
148
|
+
def get_schedule
|
149
|
+
data = api.get_data(path_schedule).to_h
|
150
|
+
ingest_schedule(data)
|
151
|
+
end
|
152
|
+
|
153
|
+
def ingest_schedule(data)
|
154
|
+
update(data, source: :weeks)
|
155
|
+
data
|
156
|
+
end
|
157
|
+
|
158
|
+
def queue_schedule
|
159
|
+
url, headers, options, timeout = api.get_request_info(path_schedule)
|
160
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
|
161
|
+
end
|
162
|
+
|
163
|
+
## weekly schedule
|
164
|
+
def get_weekly_schedule(ncaafb_season_week = 1)
|
165
|
+
data = api.get_data(path_weekly_schedule(ncaafb_season_week)).to_h
|
166
|
+
ingest_weekly_schedule(data)
|
167
|
+
end
|
168
|
+
|
169
|
+
def ingest_weekly_schedule(data)
|
170
|
+
# update(data, source: :weeks)
|
171
|
+
create_data(@weeks_hash, data, klass: Week, hierarchy: self, api: api)
|
172
|
+
data
|
173
|
+
end
|
174
|
+
|
175
|
+
def queue_weekly_schedule(ncaafb_season_week = 1)
|
176
|
+
url, headers, options, timeout = api.get_request_info(path_weekly_schedule(ncaafb_season_week))
|
177
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_weekly_schedule)}
|
178
|
+
end
|
179
|
+
|
180
|
+
## hierarchy
|
181
|
+
def get_hierarchy
|
182
|
+
data = api.get_data(path_hierarchy).to_h
|
183
|
+
ingest_hierarchy(data)
|
184
|
+
end
|
185
|
+
|
186
|
+
def ingest_hierarchy(data)
|
187
|
+
create_data(@divisions_hash, data, klass: Division, hierarchy: self, api: api)
|
188
|
+
data
|
189
|
+
end
|
190
|
+
|
191
|
+
def queue_hierarchy
|
192
|
+
url, headers, options, timeout = api.get_request_info(path_hierarchy)
|
193
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_hierarchy)}
|
194
|
+
end
|
195
|
+
|
196
|
+
## depth_charts
|
197
|
+
def get_depth_charts
|
198
|
+
data = api.get_data(path_depth_charts).to_h
|
199
|
+
ingest_depth_charts(data)
|
200
|
+
end
|
201
|
+
|
202
|
+
def ingest_depth_charts(data)
|
203
|
+
update(data, source: :teams)
|
204
|
+
data
|
205
|
+
end
|
206
|
+
|
207
|
+
def queue_depth_charts
|
208
|
+
url, headers, options, timeout = api.get_request_info(path_depth_charts)
|
209
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)}
|
210
|
+
end
|
211
|
+
|
212
|
+
## standings
|
213
|
+
def get_standings
|
214
|
+
data = api.get_data(path_standings).to_h
|
215
|
+
ingest_standings(data)
|
216
|
+
end
|
217
|
+
|
218
|
+
def ingest_standings(data)
|
219
|
+
update(data.dig('league','season'), source: :teams)
|
220
|
+
data
|
221
|
+
end
|
222
|
+
|
223
|
+
def queue_standings
|
224
|
+
url, headers, options, timeout = api.get_request_info(path_standings)
|
225
|
+
{url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_standings)}
|
226
|
+
end
|
227
|
+
|
228
|
+
## statistics
|
229
|
+
|
230
|
+
## venues
|
231
|
+
# def get_venues
|
232
|
+
# data = api.get_data(path_venues).to_h
|
233
|
+
# ingest_venues(data)
|
234
|
+
# end
|
235
|
+
|
236
|
+
# def ingest_venues(data)
|
237
|
+
# update(data, source: :teams)
|
238
|
+
# data
|
239
|
+
# end
|
240
|
+
|
241
|
+
# def queue_venues
|
242
|
+
# url, headers, options, timeout = api.get_request_info(path_venues)
|
243
|
+
# {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_venues)}
|
244
|
+
# end
|
245
|
+
|
246
|
+
def self.sim_api
|
247
|
+
Sportradar::Api::Football::Ncaafb::Api.new('sim-t')
|
248
|
+
end
|
249
|
+
def self.simulation
|
250
|
+
new({}, api: sim_api, year: 2015, type: 'reg')
|
251
|
+
end
|
252
|
+
def self.simulations
|
253
|
+
api = sim_api
|
254
|
+
['2015/REG/1/WKY/MSH', '2015/REG/1/KEN/FLA', '2015/REG/1/WOU/PRST'].map do |game_uri|
|
255
|
+
Game.new({'uri' => game_uri}, api: api)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
__END__
|
265
|
+
|
266
|
+
|
267
|
+
|
268
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new
|
269
|
+
ncaafb = Sportradar::Api::Football::Ncaafb.new(year: 2016)
|
270
|
+
gg = ncaafb.games;
|
271
|
+
tt = ncaafb.teams;
|
272
|
+
File.binwrite('ncaafb.bin', Marshal.dump(ncaafb))
|
273
|
+
ncaafb = Marshal.load(File.binread('ncaafb.bin'));
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Nfl
|
5
|
+
class Api < Request
|
6
|
+
attr_accessor :league, :access_level, :error
|
7
|
+
|
8
|
+
def initialize(access_level = 'ot')
|
9
|
+
@league = 'nfl'
|
10
|
+
raise ::Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
11
|
+
@access_level = access_level
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_year
|
15
|
+
default_date.year
|
16
|
+
end
|
17
|
+
def default_date
|
18
|
+
Date.today - 90
|
19
|
+
end
|
20
|
+
def default_season
|
21
|
+
'reg'
|
22
|
+
end
|
23
|
+
def default_access_level
|
24
|
+
if (ENV['SPORTRADAR_ENV'] || ENV['SPORTRADAR_ENV_MLB'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']) == 'production'
|
25
|
+
'p'
|
26
|
+
else
|
27
|
+
'ot'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def content_format
|
34
|
+
'json'
|
35
|
+
end
|
36
|
+
|
37
|
+
def request_url(path)
|
38
|
+
"/nfl-#{access_level}#{version}/#{path}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def api_key
|
42
|
+
if access_level != 'ot'
|
43
|
+
::Sportradar::Api.api_key_params('nfl', 'production')
|
44
|
+
else
|
45
|
+
::Sportradar::Api.api_key_params('nfl')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def version
|
50
|
+
::Sportradar::Api.version('nfl')
|
51
|
+
end
|
52
|
+
|
53
|
+
def allowed_access_levels
|
54
|
+
%w[rt p s b t ot sim]
|
55
|
+
end
|
56
|
+
|
57
|
+
def allowed_seasons
|
58
|
+
["pre", "reg", "pst"]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
__END__
|
68
|
+
|
69
|
+
nfl = Sportradar::Api::Football.Nfl.new
|
70
|
+
sw = nfl.weekly_schedule;
|
71
|
+
ss = nfl.schedule;
|
72
|
+
|
73
|
+
ss.games.count
|
74
|
+
ss.weeks.count
|
75
|
+
ss.weeks.first.response['game'].count
|
76
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
module Football
|
4
|
+
class Nfl
|
5
|
+
class Conference < Data
|
6
|
+
attr_accessor :response, :id, :name, :alias
|
7
|
+
|
8
|
+
def initialize(data, **opts)
|
9
|
+
@response = data
|
10
|
+
@api = opts[:api]
|
11
|
+
|
12
|
+
@id = data["id"]
|
13
|
+
@divisions_hash = {}
|
14
|
+
|
15
|
+
update(data, **opts)
|
16
|
+
end
|
17
|
+
|
18
|
+
def update(data, **opts)
|
19
|
+
@name = data["name"] if data["name"]
|
20
|
+
@alias = data["alias"] if data["alias"]
|
21
|
+
create_data(@divisions_hash, data["divisions"], klass: Division, conference: self, api: @api)
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def divisions
|
27
|
+
@divisions_hash.values
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|