sportradar-api 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env.sample +0 -2
- data/Gemfile.lock +1 -1
- data/README.md +6 -0
- data/lib/sportradar/api.rb +3 -1
- data/lib/sportradar/api/error.rb +2 -0
- data/lib/sportradar/api/images.rb +118 -0
- data/lib/sportradar/api/live_images.rb +60 -0
- data/lib/sportradar/api/nfl.rb +17 -16
- data/lib/sportradar/api/request.rb +19 -3
- data/lib/sportradar/api/soccer.rb +12 -12
- data/lib/sportradar/api/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d345b49b575483e102bdd67848aa7ed27303b171
|
4
|
+
data.tar.gz: d3f77c8f2ffa19e0c79250d5c8a95b4d15d8f6b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbc84253254da9add4d9af9b6df1b43f7c33057d06fc2a4ead5efee3f46c33b318c14c9eaac91de4917b3cba2fe31c3dce2c1f3479249159b1e0a996ca9d41e5
|
7
|
+
data.tar.gz: 0defe4bef73aa06f60a5de722f91b604be5d7e375c0e690407e1348ccff01a41eb5db847b8ec0ede725def6b3cf4bc5f489084d8783ebbe31b368c48444dfe20
|
data/.env.sample
CHANGED
@@ -26,8 +26,6 @@ SPORTRADAR_IMAGES_MLS: your-images_mls-api-key
|
|
26
26
|
SPORTRADAR_LIVE_IMAGES_NFL: your-live_images_nfl-api-key
|
27
27
|
SPORTRADAR_LIVE_IMAGES_NBA: your-live_images_nba-api-key
|
28
28
|
SPORTRADAR_LIVE_IMAGES_MLS: your-live_images_mls-api-key
|
29
|
-
SPORTRADAR_CONTENT_NBA_V2: your-content_nba_v2-api-key
|
30
|
-
SPORTRADAR_CONTENT_NFL_V2: your-content_nfl_v2-api-key
|
31
29
|
SPORTRADAR_CONTENT_NBA: your-content_nba-api-key
|
32
30
|
SPORTRADAR_CONTENT_NFL: your-content_nfl-api-key
|
33
31
|
SPORTRADAR_ODDS: your-odds-api-key
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/sportradar-api.svg)](https://badge.fury.io/rb/sportradar-api)
|
2
|
+
[![Build Status](https://travis-ci.org/beneggett/sportradar-api.svg?branch=master)](https://travis-ci.org/beneggett/sportradar-api)
|
3
|
+
[![Code Climate](https://codeclimate.com/github/beneggett/sportradar-api/badges/gpa.svg)](https://codeclimate.com/github/beneggett/sportradar-api)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/github/beneggett/sportradar-api/badge.svg?branch=master)](https://coveralls.io/github/beneggett/sportradar-api?branch=master)
|
5
|
+
|
6
|
+
|
1
7
|
# Sportradar API
|
2
8
|
|
3
9
|
The SportRadar API extensively covers league & sports data. This gem wraps it up, marshals the data into Ruby Objects we know and love.
|
data/lib/sportradar/api.rb
CHANGED
@@ -10,6 +10,8 @@ require "sportradar/api/request"
|
|
10
10
|
|
11
11
|
require "sportradar/api/soccer"
|
12
12
|
require "sportradar/api/nfl"
|
13
|
+
require "sportradar/api/images"
|
14
|
+
require "sportradar/api/live_images"
|
13
15
|
|
14
16
|
module Sportradar
|
15
17
|
module Api
|
@@ -48,7 +50,7 @@ module Sportradar
|
|
48
50
|
end
|
49
51
|
|
50
52
|
def self.api_key(api)
|
51
|
-
ENV.fetch("SPORTRADAR_#{api.to_s.upcase}", "api_key missing for #{api}")
|
53
|
+
ENV.fetch("SPORTRADAR_#{api.to_s.upcase.gsub('-', '_')}", "api_key missing for #{api}")
|
52
54
|
end
|
53
55
|
|
54
56
|
def self.version(api)
|
data/lib/sportradar/api/error.rb
CHANGED
@@ -5,6 +5,8 @@ module Sportradar
|
|
5
5
|
class NoApiKey < AuthenticationError; end
|
6
6
|
class InvalidResponseFormat < TypeError; end
|
7
7
|
class InvalidLeague < StandardError; end
|
8
|
+
class InvalidSeason < StandardError; end
|
9
|
+
class InvalidSport < StandardError; end
|
8
10
|
class InvalidAccessLevel < StandardError; end
|
9
11
|
class InvalidSeason < StandardError; end
|
10
12
|
class Timeout < Timeout::Error ; end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class Images < Request
|
4
|
+
attr_accessor :sport, :league, :access_level
|
5
|
+
def initialize( sport, league = nil, access_level = 't')
|
6
|
+
raise Sportradar::Api::Error::InvalidSport unless allowed_sports.include? sport
|
7
|
+
@sport = sport
|
8
|
+
raise Sportradar::Api::Error::InvalidLeague unless soccer_leagues.include?(league) || league.nil?
|
9
|
+
@league = league
|
10
|
+
|
11
|
+
raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
12
|
+
@access_level = access_level
|
13
|
+
end
|
14
|
+
|
15
|
+
def player_manifests(year = Date.today.year)
|
16
|
+
if league
|
17
|
+
get request_url("#{league}/#{image_type}/players/#{year}/manifest")
|
18
|
+
else
|
19
|
+
get request_url("players/#{image_type}/manifests/all_assets")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
alias_method :all_players, :player_manifests
|
23
|
+
# Coach Manifests
|
24
|
+
|
25
|
+
def coach_manifests
|
26
|
+
raise Sportradar::Api::Error::InvalidLeague unless league.nil?
|
27
|
+
get request_url("coaches/#{image_type}/manifests/all_assets")
|
28
|
+
end
|
29
|
+
alias_method :all_coaches, :coach_manifests
|
30
|
+
|
31
|
+
def venue_manifests
|
32
|
+
raise Sportradar::Api::Error::InvalidLeague unless league.nil?
|
33
|
+
get request_url("venues/manifests/all_assets")
|
34
|
+
end
|
35
|
+
alias_method :all_venues, :venue_manifests
|
36
|
+
|
37
|
+
# The Player Images, Coach Images, Venue Images APIs aren't really meant to be used directly, the manifests return an href path of an image we can pass it into the image_url method to get the entire image url
|
38
|
+
def image_url(href)
|
39
|
+
href.slice!(0) # remove initial '/'
|
40
|
+
set_base request_url(href) + api_key_query_string
|
41
|
+
end
|
42
|
+
alias_method :player_images, :image_url
|
43
|
+
alias_method :coach_images, :image_url
|
44
|
+
alias_method :venue_images, :image_url
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def request_url(path)
|
49
|
+
"/#{sport}-images-#{access_level}#{version}/#{provider}/#{path}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def api_key
|
53
|
+
if league
|
54
|
+
Sportradar::Api.api_key_params("images_#{league}")
|
55
|
+
else
|
56
|
+
Sportradar::Api.api_key_params("images_#{sport}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def api_key_query_string
|
61
|
+
"?#{api_key.keys.first}=#{api_key.values.first}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def provider
|
65
|
+
if uses_v2_api?
|
66
|
+
'usat'
|
67
|
+
elsif uses_v3_api?
|
68
|
+
'reuters'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def version
|
73
|
+
if uses_v2_api?
|
74
|
+
Sportradar::Api.version('images')
|
75
|
+
elsif uses_v3_api?
|
76
|
+
3
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def image_type
|
81
|
+
'headshots'
|
82
|
+
end
|
83
|
+
|
84
|
+
def uses_v2_api?
|
85
|
+
v2_api_sports.include?(sport)
|
86
|
+
end
|
87
|
+
|
88
|
+
def uses_v3_api?
|
89
|
+
v3_api_sports.include?(sport)
|
90
|
+
end
|
91
|
+
|
92
|
+
def allowed_access_levels
|
93
|
+
['p', 't']
|
94
|
+
end
|
95
|
+
|
96
|
+
def allowed_sports
|
97
|
+
v2_api_sports + v3_api_sports
|
98
|
+
end
|
99
|
+
|
100
|
+
def v2_api_sports
|
101
|
+
['golf', 'mlb', 'nascar', 'nba', 'nfl', 'nhl', 'ncaafb', 'ncaamb', 'mls']
|
102
|
+
end
|
103
|
+
|
104
|
+
def v3_api_sports
|
105
|
+
['soccer', 'cricket', 'f1', 'rugby', 'tennis']
|
106
|
+
end
|
107
|
+
|
108
|
+
def soccer_leagues
|
109
|
+
['bundesliga', 'epl', 'serie-a', 'la-liga', 'ligue-1']
|
110
|
+
end
|
111
|
+
|
112
|
+
def additional_content_sports
|
113
|
+
['mlb', 'nba', 'nfl', 'nhl']
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Sportradar
|
2
|
+
module Api
|
3
|
+
class LiveImages < Request
|
4
|
+
attr_accessor :sport, :league, :access_level
|
5
|
+
|
6
|
+
def initialize( sport, league = nil, access_level = 't')
|
7
|
+
raise Sportradar::Api::Error::InvalidSport unless allowed_sports.include? sport
|
8
|
+
@sport = sport
|
9
|
+
raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
10
|
+
@access_level = access_level
|
11
|
+
end
|
12
|
+
|
13
|
+
def daily_manifest(date = Date.today )
|
14
|
+
get request_url("#{image_type }/#{date.to_s}/manifests/all_assets")
|
15
|
+
end
|
16
|
+
alias_method :all_images, :daily_manifest
|
17
|
+
|
18
|
+
# The Event images APIs aren't really meant to be used directly, the manifests return an href path of an image we can pass it into the image_url method to get the entire image url
|
19
|
+
def image_url(href)
|
20
|
+
href.slice!(0) # remove initial '/'
|
21
|
+
set_base request_url(href) + api_key_query_string
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def request_url(path)
|
27
|
+
"/#{sport}-liveimages-#{access_level}#{version}/#{provider}/#{path}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def api_key
|
31
|
+
Sportradar::Api.api_key_params("live_images_#{sport}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def api_key_query_string
|
35
|
+
"?#{api_key.keys.first}=#{api_key.values.first}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def provider
|
39
|
+
'usat'
|
40
|
+
end
|
41
|
+
|
42
|
+
def version
|
43
|
+
Sportradar::Api.version('live_images')
|
44
|
+
end
|
45
|
+
|
46
|
+
def image_type
|
47
|
+
'news'
|
48
|
+
end
|
49
|
+
|
50
|
+
def allowed_access_levels
|
51
|
+
['p', 't']
|
52
|
+
end
|
53
|
+
|
54
|
+
def allowed_sports
|
55
|
+
['golf', 'mlb', 'nascar', 'nba', 'nfl', 'nhl', 'ncaafb', 'ncaamb', 'mls']
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/sportradar/api/nfl.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Sportradar
|
2
2
|
module Api
|
3
|
-
class Nfl
|
3
|
+
class Nfl < Request
|
4
4
|
attr_accessor :league, :access_level
|
5
|
+
|
5
6
|
def initialize( access_level = 'ot')
|
6
7
|
@league = 'nfl'
|
7
8
|
raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
@@ -9,65 +10,65 @@ module Sportradar
|
|
9
10
|
end
|
10
11
|
|
11
12
|
def league_hierarchy
|
12
|
-
|
13
|
+
get request_url("league/hierarchy")
|
13
14
|
end
|
14
15
|
|
15
16
|
def schedule(year = Date.today.year, season = 'reg')
|
16
|
-
raise Sportradar::Api::Error::
|
17
|
-
|
17
|
+
raise Sportradar::Api::Error::InvalidSeason unless allowed_seasons.include? season
|
18
|
+
get request_url("games/#{ year }/#{ season }/schedule")
|
18
19
|
end
|
19
20
|
|
20
21
|
def weekly_schedule(year = Date.today.year, season = 'reg', week = 1)
|
21
|
-
|
22
|
+
get request_url("games/#{ week_path(year, season, week) }/schedule")
|
22
23
|
end
|
23
24
|
|
24
25
|
def standings(year = Date.today.year)
|
25
|
-
|
26
|
+
get request_url("seasontd/#{ year }/standings")
|
26
27
|
end
|
27
28
|
|
28
29
|
def weekly_depth_charts(year = Date.today.year, season = 'reg', week = 1)
|
29
|
-
|
30
|
+
get request_url("seasontd/#{ week_path(year, season, week) }/depth_charts")
|
30
31
|
end
|
31
32
|
|
32
33
|
def weekly_injuries(year = Date.today.year, season = 'reg', week = 1)
|
33
|
-
|
34
|
+
get request_url("seasontd/#{ week_path(year, season, week) }/injuries")
|
34
35
|
end
|
35
36
|
|
36
37
|
def daily_change_log(date = Date.today)
|
37
|
-
|
38
|
+
get request_url("league/#{date_path(date)}/changes")
|
38
39
|
end
|
39
40
|
|
40
41
|
# past_game_id = "0141a0a5-13e5-4b28-b19f-0c3923aaef6e"
|
41
42
|
# future_game_id = "28290722-4ceb-4a4c-a4e5-1f9bec7283b3"
|
42
43
|
def game_boxscore(game_id)
|
43
|
-
|
44
|
+
get request_url("games/#{ game_id }/boxscore")
|
44
45
|
end
|
45
46
|
|
46
47
|
def game_roster(game_id)
|
47
|
-
|
48
|
+
get request_url("games/#{ game_id }/roster")
|
48
49
|
end
|
49
50
|
|
50
51
|
def game_statistics(game_id)
|
51
|
-
|
52
|
+
get request_url("games/#{ game_id }/statistics")
|
52
53
|
end
|
53
54
|
|
54
55
|
def play_by_play(game_id)
|
55
|
-
|
56
|
+
get request_url("games/#{ game_id }/pbp")
|
56
57
|
end
|
57
58
|
|
58
59
|
# player_id = "ede260be-5ae6-4a06-887b-e4a130932705"
|
59
60
|
def player_profile(player_id)
|
60
|
-
|
61
|
+
get request_url("players/#{ player_id }/profile")
|
61
62
|
end
|
62
63
|
|
63
64
|
# team_id = "97354895-8c77-4fd4-a860-32e62ea7382a"
|
64
65
|
def seasonal_statistics(team_id, year = Date.today.year, season = 'reg')
|
65
66
|
raise Sportradar::Api::Error::InvalidLeague unless allowed_seasons.include? season
|
66
|
-
|
67
|
+
get request_url("seasontd/#{ year }/#{ season }/teams/#{ team_id }/statistics")
|
67
68
|
end
|
68
69
|
|
69
70
|
def team_profile(team_id)
|
70
|
-
|
71
|
+
get request_url("teams/#{ team_id }/profile")
|
71
72
|
end
|
72
73
|
|
73
74
|
private
|
@@ -7,7 +7,7 @@ module Sportradar
|
|
7
7
|
attr_reader :url, :headers, :timeout, :api_key
|
8
8
|
|
9
9
|
def base_setup(path, options={})
|
10
|
-
@url = set_base(path)
|
10
|
+
@url = set_base(path) + format
|
11
11
|
@headers = set_headers
|
12
12
|
@api_key = options[:api_key]
|
13
13
|
@timeout = options.delete(:api_timeout) || Sportradar::Api.config.api_timeout
|
@@ -15,7 +15,8 @@ module Sportradar
|
|
15
15
|
|
16
16
|
def get(path, options={})
|
17
17
|
base_setup(path, options)
|
18
|
-
|
18
|
+
puts url
|
19
|
+
results = self.class.get(url, headers: headers, query: options.merge(api_key), timeout: timeout)
|
19
20
|
rescue Net::ReadTimeout, Net::OpenTimeout
|
20
21
|
raise Sportradar::Api::Error::Timeout
|
21
22
|
rescue EOFError
|
@@ -28,13 +29,28 @@ module Sportradar
|
|
28
29
|
protocol = !!Sportradar::Api.config.use_ssl ? "https://" : "http://"
|
29
30
|
url = "#{protocol}api.sportradar.us"
|
30
31
|
url += path
|
31
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
def date_path(date = Date.today)
|
35
|
+
"#{date.year}/#{date.month}/#{date.day}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def week_path(year, season, week)
|
39
|
+
"#{ year }/#{ season }/#{ week }"
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def format
|
44
|
+
".#{Sportradar::Api.config.format}"
|
32
45
|
end
|
33
46
|
|
34
47
|
def set_headers
|
35
48
|
{'Content-Type' => "application/#{Sportradar::Api.config.format}", 'Accept' => "application/#{Sportradar::Api.config.format}"}
|
36
49
|
end
|
37
50
|
|
51
|
+
def api_key
|
52
|
+
raise Sportradar::Api::Error::NoApiKey
|
53
|
+
end
|
38
54
|
end
|
39
55
|
end
|
40
56
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sportradar
|
2
2
|
module Api
|
3
|
-
class Soccer
|
3
|
+
class Soccer < Request
|
4
4
|
attr_accessor :league, :access_level
|
5
5
|
def initialize(league = 'na', access_level = 't')
|
6
6
|
raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
|
@@ -10,51 +10,51 @@ module Sportradar
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def schedule
|
13
|
-
|
13
|
+
get request_url("matches/schedule")
|
14
14
|
end
|
15
15
|
|
16
16
|
def daily_schedule(date = Date.today)
|
17
|
-
|
17
|
+
get request_url("matches/#{date_path(date)}/schedule")
|
18
18
|
end
|
19
19
|
|
20
20
|
def daily_summary(date = Date.today)
|
21
|
-
|
21
|
+
get request_url("matches/#{date_path(date)}/summary")
|
22
22
|
end
|
23
23
|
|
24
24
|
def daily_boxscore(date = Date.today)
|
25
|
-
|
25
|
+
get request_url("matches/#{date_path(date)}/boxscore")
|
26
26
|
end
|
27
27
|
|
28
28
|
# match_id = "357607e9-87cd-4848-b53e-0485d9c1a3bc"
|
29
29
|
def match_summary(match_id)
|
30
|
-
|
30
|
+
get request_url("matches/#{match_id}/summary")
|
31
31
|
end
|
32
32
|
|
33
33
|
# match_id = "357607e9-87cd-4848-b53e-0485d9c1a3bc"
|
34
34
|
def match_boxscore(match_id)
|
35
|
-
|
35
|
+
get request_url("matches/#{match_id}/boxscore")
|
36
36
|
end
|
37
37
|
|
38
38
|
def team_hierarchy
|
39
|
-
|
39
|
+
get request_url("teams/hierarchy")
|
40
40
|
end
|
41
41
|
|
42
42
|
# team_id = "b78b9f61-0697-4347-a1b6-b7685a130eb1"
|
43
43
|
def team_profile(team_id)
|
44
|
-
|
44
|
+
get request_url("teams/#{team_id}/profile")
|
45
45
|
end
|
46
46
|
|
47
47
|
def team_standings
|
48
|
-
|
48
|
+
get request_url("teams/standing")
|
49
49
|
end
|
50
50
|
|
51
51
|
# player_id = "2aeacd39-3f9c-42af-957e-9df8573973c4"
|
52
52
|
def player_profile(player_id)
|
53
|
-
|
53
|
+
get request_url("players/#{player_id}/profile")
|
54
54
|
end
|
55
55
|
|
56
56
|
def player_rankings
|
57
|
-
|
57
|
+
get request_url("players/leader")
|
58
58
|
end
|
59
59
|
|
60
60
|
private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sportradar-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Eggett
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -213,6 +213,8 @@ files:
|
|
213
213
|
- lib/sportradar/api.rb
|
214
214
|
- lib/sportradar/api/config.rb
|
215
215
|
- lib/sportradar/api/error.rb
|
216
|
+
- lib/sportradar/api/images.rb
|
217
|
+
- lib/sportradar/api/live_images.rb
|
216
218
|
- lib/sportradar/api/nfl.rb
|
217
219
|
- lib/sportradar/api/request.rb
|
218
220
|
- lib/sportradar/api/soccer.rb
|