sportradar 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +563 -25
- data/lib/sportradar.rb +37 -0
- data/lib/sportradar/client/api_request.rb +8 -0
- data/lib/sportradar/client/client.rb +10 -4
- data/lib/sportradar/client/configuration.rb +7 -2
- data/lib/sportradar/feeds/league_hierarchy.rb +12 -0
- data/lib/sportradar/feeds/league_schedule.rb +18 -0
- data/lib/sportradar/mlb/league_hierarchy.rb +1 -7
- data/lib/sportradar/mlb/league_schedule.rb +7 -12
- data/lib/sportradar/mlb/models/scoring_play.rb +2 -2
- data/lib/sportradar/nfl/boxscore.rb +9 -0
- data/lib/sportradar/nfl/extended_boxscore.rb +9 -0
- data/lib/sportradar/nfl/game_depth_chart.rb +9 -0
- data/lib/sportradar/nfl/game_injuries.rb +9 -0
- data/lib/sportradar/nfl/game_request.rb +24 -0
- data/lib/sportradar/nfl/game_roster.rb +9 -0
- data/lib/sportradar/nfl/game_statistics.rb +9 -0
- data/lib/sportradar/nfl/game_summary.rb +9 -0
- data/lib/sportradar/nfl/league_hierarchy.rb +9 -0
- data/lib/sportradar/nfl/league_schedule.rb +33 -0
- data/lib/sportradar/nfl/parsers/boxscore_parser.rb +124 -0
- data/lib/sportradar/nfl/play_by_play.rb +9 -0
- data/lib/sportradar/nfl/play_summary.rb +27 -0
- data/lib/sportradar/nfl/rankings.rb +9 -0
- data/lib/sportradar/nfl/season_statistics.rb +28 -0
- data/lib/sportradar/nfl/standings.rb +9 -0
- data/lib/sportradar/nfl/team_depth_chart.rb +17 -0
- data/lib/sportradar/nfl/team_depth_charts.rb +17 -0
- data/lib/sportradar/nfl/team_roster.rb +17 -0
- data/lib/sportradar/nfl/team_rosters.rb +17 -0
- data/lib/sportradar/nfl/team_statistics.rb +18 -0
- data/lib/sportradar/nfl/teams_request.rb +39 -0
- data/lib/sportradar/nfl/weekly_boxscore.rb +9 -0
- data/lib/sportradar/nfl/weekly_extended_boxscores.rb +20 -0
- data/lib/sportradar/nfl/weekly_game_depth_charts.rb +20 -0
- data/lib/sportradar/nfl/weekly_game_statistics.rb +21 -0
- data/lib/sportradar/nfl/weekly_game_summary.rb +21 -0
- data/lib/sportradar/nfl/weekly_leaders.rb +9 -0
- data/lib/sportradar/nfl/weekly_play_by_play.rb +21 -0
- data/lib/sportradar/nfl/weekly_schedule.rb +26 -0
- data/lib/sportradar/version.rb +1 -1
- data/sample.env +7 -0
- data/sportradar.gemspec +1 -1
- metadata +36 -4
data/lib/sportradar.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
1
2
|
require 'active_support/core_ext/string'
|
2
3
|
require 'active_support/inflector'
|
3
4
|
|
@@ -5,6 +6,7 @@ require 'addressable/uri'
|
|
5
6
|
require 'addressable/template'
|
6
7
|
|
7
8
|
require 'dotenv'
|
9
|
+
require 'fileutils'
|
8
10
|
require 'net/https'
|
9
11
|
require 'oj'
|
10
12
|
|
@@ -15,6 +17,9 @@ require 'sportradar/client/daily_api_request'
|
|
15
17
|
require 'sportradar/client/client'
|
16
18
|
require 'sportradar/client/configuration'
|
17
19
|
|
20
|
+
require 'sportradar/feeds/league_schedule'
|
21
|
+
require 'sportradar/feeds/league_hierarchy'
|
22
|
+
|
18
23
|
require 'sportradar/mlb/models/at_bat'
|
19
24
|
require 'sportradar/mlb/models/pitch'
|
20
25
|
require 'sportradar/mlb/models/pitch_outcome'
|
@@ -43,6 +48,38 @@ require 'sportradar/mlb/team_profile'
|
|
43
48
|
require 'sportradar/mlb/team_rosters'
|
44
49
|
require 'sportradar/mlb/venues'
|
45
50
|
|
51
|
+
require 'sportradar/nfl/parsers/boxscore_parser'
|
52
|
+
|
53
|
+
require 'sportradar/nfl/league_hierarchy'
|
54
|
+
require 'sportradar/nfl/league_schedule'
|
55
|
+
require 'sportradar/nfl/weekly_schedule'
|
56
|
+
require 'sportradar/nfl/weekly_game_depth_charts'
|
57
|
+
require 'sportradar/nfl/weekly_game_statistics'
|
58
|
+
require 'sportradar/nfl/weekly_game_summary'
|
59
|
+
require 'sportradar/nfl/weekly_play_by_play'
|
60
|
+
require 'sportradar/nfl/game_request'
|
61
|
+
require 'sportradar/nfl/game_depth_chart'
|
62
|
+
require 'sportradar/nfl/game_injuries'
|
63
|
+
require 'sportradar/nfl/game_roster'
|
64
|
+
require 'sportradar/nfl/game_statistics'
|
65
|
+
require 'sportradar/nfl/game_summary'
|
66
|
+
require 'sportradar/nfl/play_by_play'
|
67
|
+
require 'sportradar/nfl/play_summary'
|
68
|
+
require 'sportradar/nfl/boxscore'
|
69
|
+
require 'sportradar/nfl/extended_boxscore'
|
70
|
+
require 'sportradar/nfl/weekly_boxscore'
|
71
|
+
require 'sportradar/nfl/weekly_extended_boxscores'
|
72
|
+
require 'sportradar/nfl/teams_request'
|
73
|
+
require 'sportradar/nfl/team_roster'
|
74
|
+
require 'sportradar/nfl/team_rosters'
|
75
|
+
require 'sportradar/nfl/team_depth_chart'
|
76
|
+
require 'sportradar/nfl/team_depth_charts'
|
77
|
+
require 'sportradar/nfl/team_statistics'
|
78
|
+
require 'sportradar/nfl/weekly_leaders'
|
79
|
+
require 'sportradar/nfl/rankings'
|
80
|
+
require 'sportradar/nfl/standings'
|
81
|
+
require 'sportradar/nfl/season_statistics'
|
82
|
+
|
46
83
|
Oj.default_options = {}
|
47
84
|
|
48
85
|
Dotenv.load
|
@@ -21,11 +21,11 @@ module Sportradar
|
|
21
21
|
when '403'
|
22
22
|
raise 'Forbidden'
|
23
23
|
else
|
24
|
-
raise
|
24
|
+
raise "#{res.code} Error in HTTP request for #{path}"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
rescue StandardError => e
|
28
|
-
puts "HTTP Request failed (#{e.message})"
|
28
|
+
puts "HTTP Request for #{path} failed (#{e.message})"
|
29
29
|
raise e
|
30
30
|
end
|
31
31
|
|
@@ -60,7 +60,9 @@ module Sportradar
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def filepath
|
63
|
-
"#{Sportradar.configuration.filepath.freeze}/#{sport}/#{league}/#{endpoint}"
|
63
|
+
"#{Sportradar.configuration.filepath.freeze}/#{sport}/#{league}/#{endpoint}".tap do |path|
|
64
|
+
FileUtils.mkpath(path)
|
65
|
+
end
|
64
66
|
end
|
65
67
|
|
66
68
|
def url
|
@@ -80,7 +82,7 @@ module Sportradar
|
|
80
82
|
|
81
83
|
def access_level
|
82
84
|
Sportradar.configuration.
|
83
|
-
|
85
|
+
access_levels[league].
|
84
86
|
freeze
|
85
87
|
end
|
86
88
|
|
@@ -94,6 +96,8 @@ module Sportradar
|
|
94
96
|
case league
|
95
97
|
when 'mlb'
|
96
98
|
'5'
|
99
|
+
when 'nfl'
|
100
|
+
'1'
|
97
101
|
else
|
98
102
|
'5'
|
99
103
|
end
|
@@ -107,6 +111,8 @@ module Sportradar
|
|
107
111
|
case league
|
108
112
|
when 'mlb'
|
109
113
|
'baseball'
|
114
|
+
when 'nfl'
|
115
|
+
'football'
|
110
116
|
else
|
111
117
|
'baseball'
|
112
118
|
end
|
@@ -31,8 +31,13 @@ module Sportradar
|
|
31
31
|
}
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
|
34
|
+
def access_levels
|
35
|
+
{
|
36
|
+
'mlb' => ENV['SPORTRADAR_ACCESS_LEVEL_MLB'],
|
37
|
+
'nba' => ENV['SPORTRADAR_ACCESS_LEVEL_NBA'],
|
38
|
+
'nfl' => ENV['SPORTRADAR_ACCESS_LEVEL_NFL'],
|
39
|
+
'nhl' => ENV['SPORTRADAR_ACCESS_LEVEL_NHL'],
|
40
|
+
}
|
36
41
|
end
|
37
42
|
|
38
43
|
def base_uri
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Feeds
|
3
|
+
class LeagueSchedule < Sportradar::ApiRequest
|
4
|
+
def initialize(year: nil, interval_type: nil)
|
5
|
+
@year = year || Date.today.strftime('%Y')
|
6
|
+
@interval_type = interval_type || 'reg'
|
7
|
+
end
|
8
|
+
|
9
|
+
def path
|
10
|
+
"games/#{year}/#{interval_type}/schedule.json"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
attr_reader :interval_type, :year
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,18 +1,13 @@
|
|
1
1
|
module Sportradar
|
2
2
|
module Mlb
|
3
|
-
class LeagueSchedule < Sportradar::
|
4
|
-
def
|
5
|
-
|
6
|
-
|
3
|
+
class LeagueSchedule < Sportradar::Feeds::LeagueSchedule
|
4
|
+
def self.games(json:)
|
5
|
+
[].tap do |games|
|
6
|
+
(json['league']['season']['games'] || []).each do |game_json|
|
7
|
+
games << game_json
|
8
|
+
end
|
9
|
+
end
|
7
10
|
end
|
8
|
-
|
9
|
-
def path
|
10
|
-
"games/#{year}/#{interval_type}/schedule.json"
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
attr_reader :interval_type, :year
|
16
11
|
end
|
17
12
|
end
|
18
13
|
end
|
@@ -24,7 +24,7 @@ module Sportradar
|
|
24
24
|
event['inning']
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
27
|
+
def ordinal_inning
|
28
28
|
ActiveSupport::Inflector.ordinalize(inning)
|
29
29
|
end
|
30
30
|
|
@@ -45,7 +45,7 @@ module Sportradar
|
|
45
45
|
|
46
46
|
def inning_label
|
47
47
|
if inning
|
48
|
-
"#{inning_half_label} #{
|
48
|
+
"#{inning_half_label} #{ordinal_inning}"
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Nfl
|
3
|
+
class GameRequest < Sportradar::Nfl::WeeklySchedule
|
4
|
+
def initialize(year: nil,
|
5
|
+
interval_type: nil,
|
6
|
+
week: 1,
|
7
|
+
away_team_abbreviation:,
|
8
|
+
home_team_abbreviation:)
|
9
|
+
super(year: year, interval_type: interval_type, week: week)
|
10
|
+
|
11
|
+
@away_team_abbreviation = away_team_abbreviation
|
12
|
+
@home_team_abbreviation = home_team_abbreviation
|
13
|
+
end
|
14
|
+
|
15
|
+
def game_path
|
16
|
+
"#{year}/#{interval_type}/#{week}/#{away_team_abbreviation}/#{home_team_abbreviation}"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :away_team_abbreviation, :home_team_abbreviation
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Nfl
|
3
|
+
class LeagueSchedule < Sportradar::Feeds::LeagueSchedule
|
4
|
+
def fetch
|
5
|
+
super.tap do |json|
|
6
|
+
season = json['season']
|
7
|
+
interval_type = json['type']
|
8
|
+
(json['weeks'] || []).each do |week_json|
|
9
|
+
(week_json['games'] || []).each do |game_json|
|
10
|
+
game_json['season'] = season
|
11
|
+
game_json['interval_type'] = interval_type
|
12
|
+
game_json['week'] = week_json['number']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.games(json:)
|
19
|
+
[].tap do |games|
|
20
|
+
(json['weeks'] || []).each do |week_json|
|
21
|
+
(week_json['games'] || []).each do |game_json|
|
22
|
+
games << game_json
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def path
|
29
|
+
"#{year}/#{interval_type}/schedule.json"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Nfl
|
3
|
+
module Parsers
|
4
|
+
class BoxscoreParser
|
5
|
+
def initialize(json: {})
|
6
|
+
@json = json['game'] || json
|
7
|
+
end
|
8
|
+
|
9
|
+
def game_id
|
10
|
+
json['id']
|
11
|
+
end
|
12
|
+
|
13
|
+
def quarter
|
14
|
+
json['quarter'].to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
def clock
|
18
|
+
json['clock']
|
19
|
+
end
|
20
|
+
|
21
|
+
def completed
|
22
|
+
json['completed'] && json['completed'].to_datetime
|
23
|
+
end
|
24
|
+
|
25
|
+
def clock_attributes
|
26
|
+
{
|
27
|
+
clock: clock,
|
28
|
+
clock_secs: clock_secs,
|
29
|
+
period: quarter,
|
30
|
+
ended_at: completed,
|
31
|
+
}.compact
|
32
|
+
end
|
33
|
+
|
34
|
+
def clock_secs
|
35
|
+
begin
|
36
|
+
if clock && clock.include?(':')
|
37
|
+
mins, secs = clock.split(':').map(&:to_i)
|
38
|
+
Time.parse("00:#{mins}:#{secs}").
|
39
|
+
seconds_since_midnight.to_i
|
40
|
+
end
|
41
|
+
rescue => e
|
42
|
+
puts e
|
43
|
+
return 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def home_team_json
|
48
|
+
json['home_team'] || {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def home_team_id
|
52
|
+
home_team_json['id']
|
53
|
+
end
|
54
|
+
|
55
|
+
def home_team_scoring_data
|
56
|
+
home_team_json['scoring'] || {}
|
57
|
+
end
|
58
|
+
|
59
|
+
def home_team_scoring
|
60
|
+
{
|
61
|
+
points: home_team_json['points'],
|
62
|
+
remaining_challenges: home_team_json['remaining_challenges'],
|
63
|
+
remaining_timeouts: home_team_json['remaining_timeouts'],
|
64
|
+
}.merge(home_team_scoring_quarters).
|
65
|
+
compact
|
66
|
+
end
|
67
|
+
|
68
|
+
def home_team_scoring_quarters
|
69
|
+
team_scoring_quarters(data: home_team_scoring_data)
|
70
|
+
end
|
71
|
+
|
72
|
+
def away_team_json
|
73
|
+
json['away_team'] || {}
|
74
|
+
end
|
75
|
+
|
76
|
+
def away_team_id
|
77
|
+
away_team_json['id']
|
78
|
+
end
|
79
|
+
|
80
|
+
def away_team_scoring_data
|
81
|
+
away_team_json['scoring'] || {}
|
82
|
+
end
|
83
|
+
|
84
|
+
def away_team_scoring
|
85
|
+
{
|
86
|
+
points: away_team_json['points'],
|
87
|
+
remaining_challenges: away_team_json['remaining_challenges'],
|
88
|
+
remaining_timeouts: away_team_json['remaining_timeouts'],
|
89
|
+
}.merge(away_team_scoring_quarters).
|
90
|
+
compact
|
91
|
+
end
|
92
|
+
|
93
|
+
def away_team_scoring_quarters
|
94
|
+
team_scoring_quarters(data: away_team_scoring_data)
|
95
|
+
end
|
96
|
+
|
97
|
+
def team_scoring_quarters(data:)
|
98
|
+
{}.tap do |scoring_quarters|
|
99
|
+
overtime_points = 0
|
100
|
+
data.map do |scoring_data|
|
101
|
+
if quarter = scoring_data['quarter'].to_i
|
102
|
+
if quarter > 0 && quarter <= 4
|
103
|
+
key = "points_quarter_#{quarter}".to_sym
|
104
|
+
scoring_quarters[key] =
|
105
|
+
scoring_data['points'].to_i
|
106
|
+
elsif quarter > 4
|
107
|
+
key = "points_overtime_#{quarter - 4}".to_sym
|
108
|
+
scoring_quarters[key] =
|
109
|
+
scoring_data['points'].to_i
|
110
|
+
overtime_points += scoring_data['points'].to_i
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
scoring_quarters[:points_overtime] = overtime_points
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
attr_reader :json
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|