footballdata-api 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -1
- data/Manifest.txt +3 -1
- data/Rakefile +3 -3
- data/bin/fbdat +56 -34
- data/config/leagues.csv +54 -0
- data/config/timezones.csv +27 -0
- data/lib/footballdata/convert.rb +263 -100
- data/lib/footballdata/download.rb +11 -11
- data/lib/footballdata/leagues.rb +20 -55
- data/lib/footballdata/mods.rb +2 -0
- data/lib/footballdata/prettyprint.rb +29 -47
- data/lib/footballdata/teams.rb +13 -14
- data/lib/footballdata/timezones.rb +97 -0
- data/lib/footballdata/version.rb +2 -2
- data/lib/footballdata.rb +3 -8
- metadata +6 -4
- data/lib/footballdata/generator.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3350fb47d596e6d5b2e4d73582b2615020d56db38cf86d9545a10b1760494c1
|
4
|
+
data.tar.gz: d7ba6c51f3e12beed59df7b851e8d533a838de67e73c5b1d025ab7a1256caa7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2943bcf6f2da49dfc1cab26da0933957d2bde2fb13749c7ce4d4896214484bac3edcea197e01ed9b2b63f92e2e74f560ac49189f63be7644522b7b24b7cbed73
|
7
|
+
data.tar.gz: 945cc2d0cb9346434c6f3875c33dd153867318b73e067c5574bc6e789f7b3b293d5c7f126c80221c676998eaa0e532647b7a25b960d082097209b6a1428f879e
|
data/CHANGELOG.md
CHANGED
data/Manifest.txt
CHANGED
@@ -3,13 +3,15 @@ Manifest.txt
|
|
3
3
|
README.md
|
4
4
|
Rakefile
|
5
5
|
bin/fbdat
|
6
|
+
config/leagues.csv
|
7
|
+
config/timezones.csv
|
6
8
|
lib/footballdata.rb
|
7
9
|
lib/footballdata/convert.rb
|
8
10
|
lib/footballdata/download.rb
|
9
|
-
lib/footballdata/generator.rb
|
10
11
|
lib/footballdata/leagues.rb
|
11
12
|
lib/footballdata/mods.rb
|
12
13
|
lib/footballdata/prettyprint.rb
|
13
14
|
lib/footballdata/stat.rb
|
14
15
|
lib/footballdata/teams.rb
|
16
|
+
lib/footballdata/timezones.rb
|
15
17
|
lib/footballdata/version.rb
|
data/Rakefile
CHANGED
@@ -19,15 +19,15 @@ Hoe.spec 'footballdata-api' do
|
|
19
19
|
|
20
20
|
self.extra_deps = [
|
21
21
|
['tzinfo'],
|
22
|
-
['season-formats'],
|
23
|
-
['webget'],
|
22
|
+
['season-formats'],
|
23
|
+
['webget'],
|
24
24
|
['cocos'], ## later pull in with sportsdb-writers
|
25
25
|
]
|
26
26
|
|
27
27
|
self.licenses = ['Public Domain']
|
28
28
|
|
29
29
|
self.spec_extras = {
|
30
|
-
required_ruby_version: '>=
|
30
|
+
required_ruby_version: '>= 3.1.0'
|
31
31
|
}
|
32
32
|
|
33
33
|
end
|
data/bin/fbdat
CHANGED
@@ -12,17 +12,20 @@ load_env ## use dotenv (.env)
|
|
12
12
|
Webcache.root = if File.exist?( '/sports/cache' )
|
13
13
|
puts " setting web cache to >/sports/cache<"
|
14
14
|
'/sports/cache'
|
15
|
-
else
|
15
|
+
else
|
16
16
|
'./cache'
|
17
17
|
end
|
18
18
|
|
19
|
-
## note - free tier (tier one) plan - 10 requests/minute
|
19
|
+
## note - free tier (tier one) plan - 10 requests/minute
|
20
20
|
## (one request every 6 seconds 6*10=60 secs)
|
21
21
|
## 10 API calls per minute max.
|
22
22
|
## note - default sleep (delay in secs) is 3 sec(s)
|
23
23
|
Webget.config.sleep = 10
|
24
24
|
|
25
25
|
|
26
|
+
Footballdata.config.convert.out_dir = '/sports/cache.api.fbdat' if File.exist?( '/sports/cache.api.fbdat' )
|
27
|
+
|
28
|
+
|
26
29
|
|
27
30
|
|
28
31
|
require 'optparse'
|
@@ -32,17 +35,28 @@ require 'optparse'
|
|
32
35
|
module Footballdata
|
33
36
|
def self.main( args=ARGV )
|
34
37
|
|
35
|
-
opts = {
|
38
|
+
opts = {
|
39
|
+
cached: false,
|
40
|
+
convert: true,
|
41
|
+
}
|
42
|
+
|
36
43
|
parser = OptionParser.new do |parser|
|
37
|
-
parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
|
44
|
+
parser.banner = "Usage: #{$PROGRAM_NAME} [options] [args]"
|
38
45
|
|
39
46
|
parser.on( "--cache", "--cached", "--offline",
|
40
|
-
"use cached data in #{Webcache.root}" ) do |cached|
|
47
|
+
"use cached data in #{Webcache.root} - default is (#{opts[:cached]})" ) do |cached|
|
41
48
|
opts[:cached] = cached
|
42
49
|
end
|
50
|
+
|
51
|
+
parser.on( "--no-convert",
|
52
|
+
"turn off conversion to .csv in #{Footballdata.config.convert.out_dir} - default is (#{!opts[:convert]})" ) do |convert|
|
53
|
+
opts[:convert] = !convert
|
54
|
+
end
|
43
55
|
end
|
44
56
|
parser.parse!( args )
|
45
57
|
|
58
|
+
|
59
|
+
|
46
60
|
puts "OPTS:"
|
47
61
|
p opts
|
48
62
|
puts "ARGV:"
|
@@ -51,23 +65,23 @@ p args
|
|
51
65
|
|
52
66
|
## try special args
|
53
67
|
|
54
|
-
if ['plan', 'plans',
|
55
|
-
'comp', 'comps'].include?(args[0])
|
68
|
+
if ['plan', 'plans',
|
69
|
+
'comp', 'comps'].include?(args[0])
|
56
70
|
|
57
71
|
if opts[:cached]
|
58
72
|
## do nothing
|
59
|
-
else
|
73
|
+
else
|
60
74
|
Metal.competitions( auth: true ) ## get free tier (TIER_ONE) with auth (token)
|
61
75
|
end
|
62
76
|
|
63
77
|
url = Metal.competitions_url
|
64
78
|
pp url
|
65
79
|
#=> "http://api.football-data.org/v4/competitions"
|
66
|
-
|
80
|
+
|
67
81
|
data = Webcache.read_json( url )
|
68
82
|
pp data
|
69
|
-
|
70
|
-
comps = data['competitions']
|
83
|
+
|
84
|
+
comps = data['competitions']
|
71
85
|
comps.each do |rec|
|
72
86
|
print "==> "
|
73
87
|
print "#{rec['area']['name']} (#{rec['area']['code']}) - "
|
@@ -75,12 +89,12 @@ if ['plan', 'plans',
|
|
75
89
|
print "#{rec['plan']} #{rec['type']}, "
|
76
90
|
print "#{rec['numberOfAvailableSeasons']} season(s)"
|
77
91
|
print "\n"
|
78
|
-
|
79
|
-
print " #{rec['currentSeason']['startDate']} - #{rec['currentSeason']['endDate']} "
|
92
|
+
|
93
|
+
print " #{rec['currentSeason']['startDate']} - #{rec['currentSeason']['endDate']} "
|
80
94
|
print "@ #{rec['currentSeason']['currentMatchday']}"
|
81
95
|
print "\n"
|
82
96
|
end
|
83
|
-
|
97
|
+
|
84
98
|
puts " #{comps.size} competition(s)"
|
85
99
|
exit 0
|
86
100
|
end
|
@@ -100,9 +114,9 @@ end
|
|
100
114
|
## todo - add more date offsets - t+2,t+3,t+4, etc.
|
101
115
|
|
102
116
|
date = if ['y', 'yesterday', 't-1', '-1'].include?( args[0] )
|
103
|
-
Date.today-1
|
117
|
+
Date.today-1
|
104
118
|
elsif ['t', 'tomorrow', 't+1', '1', '+1'].include?( args[0] )
|
105
|
-
Date.today+1
|
119
|
+
Date.today+1
|
106
120
|
elsif ['m', 'match', 'matches', 'today'].include?( args[0] || 'today' ) ## make default - why? why not?
|
107
121
|
Date.today
|
108
122
|
else
|
@@ -110,7 +124,7 @@ date = if ['y', 'yesterday', 't-1', '-1'].include?( args[0] )
|
|
110
124
|
end
|
111
125
|
|
112
126
|
if date
|
113
|
-
if opts[:cached]
|
127
|
+
if opts[:cached]
|
114
128
|
## do nothing
|
115
129
|
else
|
116
130
|
Metal.todays_matches( date )
|
@@ -124,7 +138,7 @@ if date
|
|
124
138
|
## only print competition header if different from last match
|
125
139
|
comp = fmt_competition( rec )
|
126
140
|
puts comp if comp != last_comp
|
127
|
-
|
141
|
+
|
128
142
|
puts fmt_match( rec )
|
129
143
|
|
130
144
|
last_comp = comp
|
@@ -145,40 +159,41 @@ end
|
|
145
159
|
## club cups intl
|
146
160
|
## CL 2023 - (uefa/european) champions league
|
147
161
|
## CLI 2204 - (south american) copa libertadores
|
148
|
-
## club leagues
|
162
|
+
## club leagues
|
149
163
|
## PL 2024 - england premiere league
|
150
164
|
|
165
|
+
##
|
166
|
+
## note - only use "generic" uniform league codes for now!!
|
151
167
|
|
152
|
-
league_code = args[0] || '
|
168
|
+
league_code = (args[0] || 'eng.1').downcase
|
153
169
|
|
170
|
+
## todo - find a better name
|
171
|
+
## use internal_league_code or such - why? why not?
|
154
172
|
### convenience helpers - lets you use eng.1, euro, etc.
|
155
173
|
## check if mapping for league_code
|
156
|
-
|
157
|
-
league_code = LEAGUES[ league_code.downcase ]
|
158
|
-
else
|
159
|
-
## assume "native" code
|
160
|
-
## always upcase e.g. pl => PL etc.
|
161
|
-
league_code = league_code.upcase
|
162
|
-
end
|
174
|
+
metal_league_code = find_league!( league_code )
|
163
175
|
|
164
176
|
|
165
|
-
season = Season( args[1] ||
|
166
|
-
(
|
177
|
+
season = Season( args[1] ||
|
178
|
+
(['euro',
|
179
|
+
'copa.l',
|
180
|
+
'br.1'].include?(league_code) ? '2024' : '2024/25'))
|
167
181
|
|
168
182
|
season_start_year = season.start_year ## use year - why? why not?
|
169
183
|
|
170
|
-
pp
|
184
|
+
pp [metal_league_code, season_start_year]
|
171
185
|
|
172
186
|
if opts[:cached]
|
173
187
|
## do nothing
|
174
188
|
else
|
175
189
|
## download dataset(s)
|
176
190
|
## try download
|
177
|
-
|
178
|
-
|
179
|
-
|
191
|
+
## note: include teams (for convert) for now too!!
|
192
|
+
Metal.teams( metal_league_code, season_start_year )
|
193
|
+
Metal.matches( metal_league_code, season_start_year )
|
194
|
+
end
|
180
195
|
|
181
|
-
url = Metal.competition_matches_url(
|
196
|
+
url = Metal.competition_matches_url( metal_league_code,
|
182
197
|
season_start_year )
|
183
198
|
pp url
|
184
199
|
#=> "http://api.football-data.org/v4/competitions/EC/matches?season=2024"
|
@@ -188,6 +203,13 @@ data = Webcache.read_json( url )
|
|
188
203
|
|
189
204
|
pp_matches( data )
|
190
205
|
|
206
|
+
|
207
|
+
if opts[:convert]
|
208
|
+
puts "==> converting to .csv"
|
209
|
+
convert( league: league_code, season: season )
|
210
|
+
end
|
211
|
+
|
212
|
+
|
191
213
|
end # def self.main
|
192
214
|
end # module Footballdata
|
193
215
|
|
data/config/leagues.csv
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
key, code
|
2
|
+
|
3
|
+
eng.1, PL # incl. team(s) from wales
|
4
|
+
eng.2, ELC
|
5
|
+
# PL - Premier League, England 27 seasons | 2019-08-09 - 2020-07-25 / matchday 31
|
6
|
+
# ELC - Championship, England 3 seasons | 2019-08-02 - 2020-07-22 / matchday 38
|
7
|
+
#
|
8
|
+
# 2019 => 2019/20
|
9
|
+
# 2018 => 2018/19
|
10
|
+
# 2017 => xxx 2017-18 - requires subscription !!!
|
11
|
+
|
12
|
+
es.1, PD
|
13
|
+
# PD - Primera Division, Spain 27 seasons | 2019-08-16 - 2020-07-19 / matchday 31
|
14
|
+
|
15
|
+
pt.1, PPL
|
16
|
+
# PPL - Primeira Liga, Portugal 9 seasons | 2019-08-10 - 2020-07-26 / matchday 28
|
17
|
+
|
18
|
+
de.1, BL1
|
19
|
+
# BL1 - Bundesliga, Germany 24 seasons | 2019-08-16 - 2020-06-27 / matchday 34
|
20
|
+
|
21
|
+
nl.1, DED
|
22
|
+
# DED - Eredivisie, Netherlands 10 seasons | 2019-08-09 - 2020-03-08 / matchday 34
|
23
|
+
|
24
|
+
fr.1, FL1 # incl. team(s) monaco
|
25
|
+
# FL1 - Ligue 1, France
|
26
|
+
# 9 seasons | 2019-08-09 - 2020-05-31 / matchday 38
|
27
|
+
#
|
28
|
+
# 2019 => 2019/20
|
29
|
+
# 2018 => 2018/19
|
30
|
+
# 2017 => xxx 2017-18 - requires subscription !!!
|
31
|
+
|
32
|
+
it.1, SA
|
33
|
+
# SA - Serie A, Italy 15 seasons | 2019-08-24 - 2020-08-02 / matchday 27
|
34
|
+
|
35
|
+
br.1, BSA
|
36
|
+
# BSA - Série A, Brazil
|
37
|
+
# 4 seasons | 2020-05-03 - 2020-12-06 / matchday 10
|
38
|
+
#
|
39
|
+
# 2020 => 2020
|
40
|
+
# 2019 => 2019
|
41
|
+
# 2018 => 2018
|
42
|
+
# 2017 => xxx 2017 - requires subscription !!!
|
43
|
+
|
44
|
+
uefa.cl, CL ## note: cl is country code for chile!! - use champs - why? why not?
|
45
|
+
## was europe.cl / cl
|
46
|
+
## todo/check: use champs and NOT cl - why? why not?
|
47
|
+
|
48
|
+
copa.l, CLI
|
49
|
+
## Copa Libertadores
|
50
|
+
|
51
|
+
############
|
52
|
+
## national teams
|
53
|
+
euro, EC
|
54
|
+
world, WC
|
@@ -0,0 +1,27 @@
|
|
1
|
+
key, zone
|
2
|
+
eng, Europe/London
|
3
|
+
es, Europe/Madrid
|
4
|
+
de, Europe/Berlin
|
5
|
+
fr, Europe/Paris
|
6
|
+
it, Europe/Rome
|
7
|
+
|
8
|
+
nl, Europe/Amsterdam
|
9
|
+
pt, Europe/Lisbon
|
10
|
+
|
11
|
+
## for champs default for not to cet (central european time) - why? why not?
|
12
|
+
uefa.cl, Europe/Paris
|
13
|
+
euro, Europe/Paris
|
14
|
+
|
15
|
+
## todo/fix - pt.1
|
16
|
+
## one team in madeira!!! check for different timezone??
|
17
|
+
## CD Nacional da Madeira
|
18
|
+
|
19
|
+
br, America/Sao_Paulo
|
20
|
+
## todo/fix - brazil has 4 timezones
|
21
|
+
## really only two in use for clubs
|
22
|
+
## west and east (amazonas et al)
|
23
|
+
## for now use west for all - why? why not?
|
24
|
+
copa.l, America/Sao_Paulo
|
25
|
+
|
26
|
+
|
27
|
+
## world+2022, add quatar here
|