feat: replace Kaggle CSV with Wikipedia scraper for historical match data
Add scripts/scrape-wikipedia.ts that fetches all 22 World Cups (1930–2022) from English Wikipedia via MediaWiki API, handles group sub-pages, AET/penalty detection, and goal parsing, writing openfootball-format JSON to app/data/openfootball/. Rewrite scripts/seed.ts to read these local JSON files instead of the Kaggle CSV, producing 965 matches and 2716 goals with per-group assignments for all historical tournaments (enabling group standings on tournament pages). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"France",
|
||||
"Mexico",
|
||||
"Argentina",
|
||||
"Chile"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"Yugoslavia",
|
||||
"Brazil",
|
||||
"Bolivia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Romania",
|
||||
"Peru",
|
||||
"Uruguay"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"United States",
|
||||
"Belgium",
|
||||
"Paraguay"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,605 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-13",
|
||||
"time": "15:00",
|
||||
"team1": "France",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "L. Laurent",
|
||||
"minute": 19
|
||||
},
|
||||
{
|
||||
"name": "Langiller",
|
||||
"minute": 40
|
||||
},
|
||||
{
|
||||
"name": "Maschinot",
|
||||
"minute": 43
|
||||
},
|
||||
{
|
||||
"name": "Maschinot",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Carreño",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Pocitos, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-15",
|
||||
"time": "16:00",
|
||||
"team1": "Argentina",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Monti",
|
||||
"minute": 81
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-16",
|
||||
"time": "14:45",
|
||||
"team1": "Chile",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Vidal",
|
||||
"minute": 3
|
||||
},
|
||||
{
|
||||
"name": "Vidal",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "M. Rosas",
|
||||
"minute": 52,
|
||||
"owngoal": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-19",
|
||||
"time": "12:50",
|
||||
"team1": "Chile",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Subiabre",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-19",
|
||||
"time": "15:00",
|
||||
"team1": "Argentina",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
3
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 80
|
||||
},
|
||||
{
|
||||
"name": "Zumelzú",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Zumelzú",
|
||||
"minute": 55
|
||||
},
|
||||
{
|
||||
"name": "Varallo",
|
||||
"minute": 53
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "M. Rosas",
|
||||
"minute": 42,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "M. Rosas",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "Gayón",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1930-07-22",
|
||||
"time": "14:45",
|
||||
"team1": "Argentina",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 13
|
||||
},
|
||||
{
|
||||
"name": "M. Evaristo",
|
||||
"minute": 51
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Subiabre",
|
||||
"minute": 15
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1930-07-14",
|
||||
"time": "12:45",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Tirnanić",
|
||||
"minute": 21
|
||||
},
|
||||
{
|
||||
"name": "Bek",
|
||||
"minute": 30
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Preguinho",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1930-07-17",
|
||||
"time": "12:45",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Bolivia",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Bek",
|
||||
"minute": 60
|
||||
},
|
||||
{
|
||||
"name": "Bek",
|
||||
"minute": 67
|
||||
},
|
||||
{
|
||||
"name": "Marjanović",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "Vujadinović",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1930-07-20",
|
||||
"time": "13:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Bolivia",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Moderato",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Moderato",
|
||||
"minute": 73
|
||||
},
|
||||
{
|
||||
"name": "Preguinho",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Preguinho",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1930-07-14",
|
||||
"time": "14:50",
|
||||
"team1": "Romania",
|
||||
"team2": "Peru",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Deșu",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Stanciu",
|
||||
"minute": 79
|
||||
},
|
||||
{
|
||||
"name": "Kovács",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "De Souza",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Pocitos, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1930-07-18",
|
||||
"time": "14:30",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Peru",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Castro",
|
||||
"minute": 65
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1930-07-21",
|
||||
"time": "14:50",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Dorado",
|
||||
"minute": 7
|
||||
},
|
||||
{
|
||||
"name": "Scarone",
|
||||
"minute": 26
|
||||
},
|
||||
{
|
||||
"name": "Anselmo",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Cea",
|
||||
"minute": 35
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1930-07-13",
|
||||
"time": "15:00",
|
||||
"team1": "United States",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "McGhee",
|
||||
"minute": 23
|
||||
},
|
||||
{
|
||||
"name": "Florie",
|
||||
"minute": 45
|
||||
},
|
||||
{
|
||||
"name": "Patenaude",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1930-07-17",
|
||||
"time": "14:45",
|
||||
"team1": "United States",
|
||||
"team2": "Paraguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Patenaude",
|
||||
"minute": 10
|
||||
},
|
||||
{
|
||||
"name": "Patenaude",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Patenaude",
|
||||
"minute": 50
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Parque Central, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1930-07-20",
|
||||
"time": "15:00",
|
||||
"team1": "Paraguay",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Vargas Peña",
|
||||
"minute": 40
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1930-07-26",
|
||||
"time": "14:45",
|
||||
"team1": "Argentina",
|
||||
"team2": "United States",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Monti",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Scopelli",
|
||||
"minute": 56
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 69
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 87
|
||||
},
|
||||
{
|
||||
"name": "Peucelle",
|
||||
"minute": 80
|
||||
},
|
||||
{
|
||||
"name": "Peucelle",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Brown",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1930-07-27",
|
||||
"time": "14:45",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Yugoslavia",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Cea",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Cea",
|
||||
"minute": 67
|
||||
},
|
||||
{
|
||||
"name": "Cea",
|
||||
"minute": 72
|
||||
},
|
||||
{
|
||||
"name": "Anselmo",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Anselmo",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Iriarte",
|
||||
"minute": 61
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Vujadinović",
|
||||
"minute": 4
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1930-07-30",
|
||||
"time": "12:45",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Argentina",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Dorado",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Cea",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Iriarte",
|
||||
"minute": 68
|
||||
},
|
||||
{
|
||||
"name": "Castro",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Peucelle",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Stábile",
|
||||
"minute": 37
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Centenario, Montevideo"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estadio Pocitos",
|
||||
"city": "Montevideo"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Parque Central",
|
||||
"city": "Montevideo"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Centenario",
|
||||
"city": "Montevideo"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,601 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Spain",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Iraragorri",
|
||||
"minute": 18,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Iraragorri",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Lángara",
|
||||
"minute": 29
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 55
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Luigi Ferraris, Genoa"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Egypt",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Teleki",
|
||||
"minute": 11
|
||||
},
|
||||
{
|
||||
"name": "Toldi",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Toldi",
|
||||
"minute": 61
|
||||
},
|
||||
{
|
||||
"name": "Vincze",
|
||||
"minute": 53
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Fawzi",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "Fawzi",
|
||||
"minute": 39
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Giorgio Ascarelli, Naples"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Netherlands",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Kielholz",
|
||||
"minute": 7
|
||||
},
|
||||
{
|
||||
"name": "Kielholz",
|
||||
"minute": 43
|
||||
},
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 66
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Smit",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Vente",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"ground": "Stadio San Siro, Milan"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Italy",
|
||||
"team2": "United States",
|
||||
"score": {
|
||||
"ft": [
|
||||
7,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Schiavio",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Schiavio",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Schiavio",
|
||||
"minute": 64
|
||||
},
|
||||
{
|
||||
"name": "Orsi",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Orsi",
|
||||
"minute": 69
|
||||
},
|
||||
{
|
||||
"name": "Ferrari",
|
||||
"minute": 63
|
||||
},
|
||||
{
|
||||
"name": "Meazza",
|
||||
"minute": 90
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Donelli",
|
||||
"minute": 57
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Nazionale PNF, Rome"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Puč",
|
||||
"minute": 50
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dobay",
|
||||
"minute": 11
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Littorio, Trieste"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Argentina",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Jonasson",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "Jonasson",
|
||||
"minute": 67
|
||||
},
|
||||
{
|
||||
"name": "Kroon",
|
||||
"minute": 79
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Belis",
|
||||
"minute": 4
|
||||
},
|
||||
{
|
||||
"name": "Galateo",
|
||||
"minute": 48
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Littoriale, Bologna"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Austria",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Sindelar",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Schall",
|
||||
"minute": 93
|
||||
},
|
||||
{
|
||||
"name": "Bican",
|
||||
"minute": 109
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nicolas",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Verriest",
|
||||
"minute": 116,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Benito Mussolini, Turin"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1934-05-27",
|
||||
"time": "16:00",
|
||||
"team1": "Germany",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Kobierski",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Siffling",
|
||||
"minute": 49
|
||||
},
|
||||
{
|
||||
"name": "Conen",
|
||||
"minute": 66
|
||||
},
|
||||
{
|
||||
"name": "Conen",
|
||||
"minute": 70
|
||||
},
|
||||
{
|
||||
"name": "Conen",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Voorhoof",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Voorhoof",
|
||||
"minute": 43
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Giovanni Berta, Florence"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1934-05-31",
|
||||
"time": "16:30",
|
||||
"team1": "Austria",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Horvath",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Zischek",
|
||||
"minute": 51
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Sárosi",
|
||||
"minute": 60,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Littoriale, Bologna"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1934-05-31",
|
||||
"time": "16:30",
|
||||
"team1": "Italy",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ferrari",
|
||||
"minute": 44
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Regueiro",
|
||||
"minute": 30
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Giovanni Berta, Florence"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1934-05-31",
|
||||
"time": "16:30",
|
||||
"team1": "Germany",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hohmann",
|
||||
"minute": 60
|
||||
},
|
||||
{
|
||||
"name": "Hohmann",
|
||||
"minute": 63
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dunker",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"ground": "Stadio San Siro, Milan"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1934-05-31",
|
||||
"time": "16:30",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Svoboda",
|
||||
"minute": 24
|
||||
},
|
||||
{
|
||||
"name": "Sobotka",
|
||||
"minute": 49
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Kielholz",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Jäggi",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Benito Mussolini, Turin"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1934-06-01",
|
||||
"time": "16:30",
|
||||
"team1": "Italy",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Meazza",
|
||||
"minute": 11
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Giovanni Berta, Florence"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1934-06-03",
|
||||
"time": "16:30",
|
||||
"team1": "Italy",
|
||||
"team2": "Austria",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Guaita",
|
||||
"minute": 19
|
||||
}
|
||||
],
|
||||
"ground": "Stadio San Siro, Milan"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1934-06-03",
|
||||
"time": "16:30",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 21
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 69
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Noack",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Nazionale PNF, Rome"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1934-06-07",
|
||||
"time": "18:00",
|
||||
"team1": "Germany",
|
||||
"team2": "Austria",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Lehner",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Lehner",
|
||||
"minute": 42
|
||||
},
|
||||
{
|
||||
"name": "Conen",
|
||||
"minute": 27
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Horvath",
|
||||
"minute": 28
|
||||
},
|
||||
{
|
||||
"name": "Sesta",
|
||||
"minute": 54
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Giorgio Ascarelli, Naples"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1934-06-10",
|
||||
"time": "15:30",
|
||||
"team1": "Italy",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Orsi",
|
||||
"minute": 81
|
||||
},
|
||||
{
|
||||
"name": "Schiavio",
|
||||
"minute": 95
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Puč",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"ground": "Stadio Nazionale PNF, Rome"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Stadio Luigi Ferraris",
|
||||
"city": "Genoa"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Giorgio Ascarelli",
|
||||
"city": "Naples"
|
||||
},
|
||||
{
|
||||
"name": "Stadio San Siro",
|
||||
"city": "Milan"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Nazionale PNF",
|
||||
"city": "Rome"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Littorio",
|
||||
"city": "Trieste"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Littoriale",
|
||||
"city": "Bologna"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Benito Mussolini",
|
||||
"city": "Turin"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Giovanni Berta",
|
||||
"city": "Florence"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,692 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-04",
|
||||
"time": "17:00",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 43
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Gauchel",
|
||||
"minute": 29
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Dutch East Indies",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Kohut",
|
||||
"minute": 13
|
||||
},
|
||||
{
|
||||
"name": "Toldi",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 30
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 76
|
||||
}
|
||||
],
|
||||
"ground": "Vélodrome Municipal, Reims"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"team1": "Sweden",
|
||||
"team2": "Austria",
|
||||
"ground": "Stade Gerland, Lyon"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Cuba",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
3
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 103
|
||||
},
|
||||
{
|
||||
"name": "Magriñá",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Bindea",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "Barátky",
|
||||
"minute": 88
|
||||
},
|
||||
{
|
||||
"name": "Dobay",
|
||||
"minute": 105
|
||||
}
|
||||
],
|
||||
"ground": "Stade du T.O.E.C., Toulouse"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "France",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Veinante",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Nicolas",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Nicolas",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Isemborghs",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Colombes"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Norway",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ferraris",
|
||||
"minute": 2
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 94
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Brustad",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"ground": "Stade Vélodrome, Marseille"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Poland",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"et": [
|
||||
6,
|
||||
5
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 93
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 104
|
||||
},
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Scherfke",
|
||||
"minute": 23,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 53
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 59
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Wilimowski",
|
||||
"minute": 118
|
||||
}
|
||||
],
|
||||
"ground": "Stade de la Meinau, Strasbourg"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-05",
|
||||
"time": "17:00",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Netherlands",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Košťálek",
|
||||
"minute": 96
|
||||
},
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 111
|
||||
},
|
||||
{
|
||||
"name": "Zeman",
|
||||
"minute": 118
|
||||
}
|
||||
],
|
||||
"ground": "Stade municipal, Le Havre"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-09",
|
||||
"time": "18:00",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Walaschek",
|
||||
"minute": 42
|
||||
},
|
||||
{
|
||||
"name": "Bickel",
|
||||
"minute": 64
|
||||
},
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 75
|
||||
},
|
||||
{
|
||||
"name": "Abegglen",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Hahnemann",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Lörtscher",
|
||||
"minute": 22,
|
||||
"owngoal": true
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Round of 16",
|
||||
"date": "1938-06-09",
|
||||
"time": "18:00",
|
||||
"team1": "Cuba",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Socorro",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Fernández",
|
||||
"minute": 57
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dobay",
|
||||
"minute": 35
|
||||
}
|
||||
],
|
||||
"ground": "Stade du T.O.E.C., Toulouse"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 40
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Stade Victor Boucquey, Lille"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Cuba",
|
||||
"score": {
|
||||
"ft": [
|
||||
8,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 81
|
||||
},
|
||||
{
|
||||
"name": "H. Andersson",
|
||||
"minute": 89
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 22
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Wetterström",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Keller",
|
||||
"minute": 80
|
||||
},
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 84
|
||||
}
|
||||
],
|
||||
"ground": "Stade du Fort Carré, Antibes"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 72
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Heisserer",
|
||||
"minute": 10
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Colombes"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-12",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 30
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nejedlý",
|
||||
"minute": 65,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1938-06-14",
|
||||
"time": "18:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Roberto",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Kopecký",
|
||||
"minute": 25
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1938-06-16",
|
||||
"time": "18:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Jacobsson",
|
||||
"minute": 19,
|
||||
"owngoal": true
|
||||
},
|
||||
{
|
||||
"name": "Titkos",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Zsengellér",
|
||||
"minute": 85
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 65
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 1
|
||||
}
|
||||
],
|
||||
"ground": "Parc des Princes, Paris"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1938-06-16",
|
||||
"time": "18:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Meazza",
|
||||
"minute": 60,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"ground": "Stade Vélodrome, Marseille"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1938-06-19",
|
||||
"time": "17:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Romeu",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 63
|
||||
},
|
||||
{
|
||||
"name": "Leônidas",
|
||||
"minute": 74
|
||||
},
|
||||
{
|
||||
"name": "Perácio",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Jonasson",
|
||||
"minute": 28
|
||||
},
|
||||
{
|
||||
"name": "Nyberg",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Parc Lescure, Bordeaux"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1938-06-19",
|
||||
"time": "17:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 6
|
||||
},
|
||||
{
|
||||
"name": "Colaussi",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Piola",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Titkos",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "G. Sárosi",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"ground": "Stade Olympique de Colombes, Paris"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Parc des Princes",
|
||||
"city": "Paris"
|
||||
},
|
||||
{
|
||||
"name": "Vélodrome Municipal",
|
||||
"city": "Reims"
|
||||
},
|
||||
{
|
||||
"name": "Stade Gerland",
|
||||
"city": "Lyon"
|
||||
},
|
||||
{
|
||||
"name": "Stade du T.O.E.C.",
|
||||
"city": "Toulouse"
|
||||
},
|
||||
{
|
||||
"name": "Stade Olympique de Colombes",
|
||||
"city": "Colombes"
|
||||
},
|
||||
{
|
||||
"name": "Stade Vélodrome",
|
||||
"city": "Marseille"
|
||||
},
|
||||
{
|
||||
"name": "Stade de la Meinau",
|
||||
"city": "Strasbourg"
|
||||
},
|
||||
{
|
||||
"name": "Stade municipal",
|
||||
"city": "Le Havre"
|
||||
},
|
||||
{
|
||||
"name": "Stade Victor Boucquey",
|
||||
"city": "Lille"
|
||||
},
|
||||
{
|
||||
"name": "Stade du Fort Carré",
|
||||
"city": "Antibes"
|
||||
},
|
||||
{
|
||||
"name": "Parc Lescure",
|
||||
"city": "Bordeaux"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Mexico",
|
||||
"Yugoslavia",
|
||||
"Switzerland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"England",
|
||||
"Chile",
|
||||
"Spain",
|
||||
"United States"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Sweden",
|
||||
"Italy",
|
||||
"Paraguay"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Bolivia"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,753 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-06-24",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 30
|
||||
},
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 79
|
||||
},
|
||||
{
|
||||
"name": "Jair",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "Baltazar",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-06-25",
|
||||
"time": "15:00",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Mitić",
|
||||
"minute": 59
|
||||
},
|
||||
{
|
||||
"name": "Tomašević",
|
||||
"minute": 70
|
||||
},
|
||||
{
|
||||
"name": "Ognjanov",
|
||||
"minute": 84
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Independência, Belo Horizonte"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-06-28",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Alfredo",
|
||||
"minute": 3
|
||||
},
|
||||
{
|
||||
"name": "Baltazar",
|
||||
"minute": 32
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Fatton",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Fatton",
|
||||
"minute": 88
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-06-28",
|
||||
"time": "15:00",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Bobek",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Ž. Čajkovski",
|
||||
"minute": 23
|
||||
},
|
||||
{
|
||||
"name": "Ž. Čajkovski",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Tomašević",
|
||||
"minute": 81
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Ortiz",
|
||||
"minute": 89,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estádio dos Eucaliptos, Porto Alegre"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-07-01",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Yugoslavia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 4
|
||||
},
|
||||
{
|
||||
"name": "Zizinho",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1950-07-02",
|
||||
"time": "15:40",
|
||||
"team1": "Switzerland",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Bader",
|
||||
"minute": 10
|
||||
},
|
||||
{
|
||||
"name": "Antenen",
|
||||
"minute": 44
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Casarín",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Estádio dos Eucaliptos, Porto Alegre"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-06-25",
|
||||
"time": "15:00",
|
||||
"team1": "England",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Mortensen",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Mannion",
|
||||
"minute": 51
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-06-25",
|
||||
"time": "15:00",
|
||||
"team1": "Spain",
|
||||
"team2": "United States",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Igoa",
|
||||
"minute": 81
|
||||
},
|
||||
{
|
||||
"name": "Basora",
|
||||
"minute": 83
|
||||
},
|
||||
{
|
||||
"name": "Zarra",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Pariani",
|
||||
"minute": 17
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Durival de Britto, Curitiba"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-06-29",
|
||||
"time": "15:00",
|
||||
"team1": "Spain",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Basora",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Zarra",
|
||||
"minute": 30
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-06-29",
|
||||
"time": "15:00",
|
||||
"team1": "United States",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Gaetjens",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Independência, Belo Horizonte"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-07-02",
|
||||
"time": "15:00",
|
||||
"team1": "Spain",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Zarra",
|
||||
"minute": 48
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1950-07-02",
|
||||
"time": "15:00",
|
||||
"team1": "Chile",
|
||||
"team2": "United States",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Robledo",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Cremaschi",
|
||||
"minute": 32
|
||||
},
|
||||
{
|
||||
"name": "Cremaschi",
|
||||
"minute": 60
|
||||
},
|
||||
{
|
||||
"name": "Prieto",
|
||||
"minute": 54
|
||||
},
|
||||
{
|
||||
"name": "Riera",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Wallace",
|
||||
"minute": 47
|
||||
},
|
||||
{
|
||||
"name": "Maca",
|
||||
"minute": 48,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Ilha do Retiro, Recife"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1950-06-25",
|
||||
"time": "15:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Jeppson",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Jeppson",
|
||||
"minute": 68
|
||||
},
|
||||
{
|
||||
"name": "Andersson",
|
||||
"minute": 33
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Carapellese",
|
||||
"minute": 7
|
||||
},
|
||||
{
|
||||
"name": "Muccinelli",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1950-06-29",
|
||||
"time": "15:30",
|
||||
"team1": "Sweden",
|
||||
"team2": "Paraguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Sundqvist",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Palmér",
|
||||
"minute": 26
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "López",
|
||||
"minute": 35
|
||||
},
|
||||
{
|
||||
"name": "López Fretes",
|
||||
"minute": 74
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Durival Britto, Curitiba"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1950-07-02",
|
||||
"time": "15:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Paraguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Carapellese",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Pandolfini",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1950-07-02",
|
||||
"time": "15:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Bolivia",
|
||||
"score": {
|
||||
"ft": [
|
||||
8,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Míguez",
|
||||
"minute": 14
|
||||
},
|
||||
{
|
||||
"name": "Míguez",
|
||||
"minute": 40
|
||||
},
|
||||
{
|
||||
"name": "Míguez",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Vidal",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Schiaffino",
|
||||
"minute": 23
|
||||
},
|
||||
{
|
||||
"name": "Schiaffino",
|
||||
"minute": 54
|
||||
},
|
||||
{
|
||||
"name": "Pérez",
|
||||
"minute": 83
|
||||
},
|
||||
{
|
||||
"name": "Ghiggia",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"ground": "Estádio Independência, Belo Horizonte"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-09",
|
||||
"time": "15:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ghiggia",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Varela",
|
||||
"minute": 73
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Basora",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Basora",
|
||||
"minute": 39
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-09",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
7,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 36
|
||||
},
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 52
|
||||
},
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 58
|
||||
},
|
||||
{
|
||||
"name": "Chico",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Chico",
|
||||
"minute": 88
|
||||
},
|
||||
{
|
||||
"name": "Maneca",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Andersson",
|
||||
"minute": 67,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-13",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Ademir",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Jair",
|
||||
"minute": 21
|
||||
},
|
||||
{
|
||||
"name": "Chico",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Chico",
|
||||
"minute": 55
|
||||
},
|
||||
{
|
||||
"name": "Zizinho",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Igoa",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-13",
|
||||
"time": "15:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ghiggia",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Míguez",
|
||||
"minute": 77
|
||||
},
|
||||
{
|
||||
"name": "Míguez",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Palmér",
|
||||
"minute": 5
|
||||
},
|
||||
{
|
||||
"name": "Sundqvist",
|
||||
"minute": 40
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-16",
|
||||
"time": "15:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Sundqvist",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Mellberg",
|
||||
"minute": 33
|
||||
},
|
||||
{
|
||||
"name": "Palmér",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Zarra",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Pacaembu, São Paulo"
|
||||
},
|
||||
{
|
||||
"round": "Final round",
|
||||
"date": "1950-07-16",
|
||||
"time": "15:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Schiaffino",
|
||||
"minute": 66
|
||||
},
|
||||
{
|
||||
"name": "Ghiggia",
|
||||
"minute": 79
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Friaça",
|
||||
"minute": 47
|
||||
}
|
||||
],
|
||||
"ground": "Estádio do Maracanã, Rio de Janeiro"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estádio do Maracanã",
|
||||
"city": "Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Independência",
|
||||
"city": "Belo Horizonte"
|
||||
},
|
||||
{
|
||||
"name": "Estádio do Pacaembu",
|
||||
"city": "São Paulo"
|
||||
},
|
||||
{
|
||||
"name": "Estádio dos Eucaliptos",
|
||||
"city": "Porto Alegre"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Durival de Britto",
|
||||
"city": "Curitiba"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Ilha do Retiro",
|
||||
"city": "Recife"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Durival Britto",
|
||||
"city": "Curitiba"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Mexico",
|
||||
"Yugoslavia",
|
||||
"France"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"Turkey",
|
||||
"Hungary",
|
||||
"South Korea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Czechoslovakia",
|
||||
"Austria",
|
||||
"Scotland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Switzerland",
|
||||
"Italy",
|
||||
"England",
|
||||
"Belgium"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Charmilles Stadium",
|
||||
"city": "Geneva"
|
||||
},
|
||||
{
|
||||
"name": "Stade Olympique de la Pontaise",
|
||||
"city": "Lausanne"
|
||||
},
|
||||
{
|
||||
"name": "Wankdorf Stadium",
|
||||
"city": "Bern"
|
||||
},
|
||||
{
|
||||
"name": "Hardturm Stadium",
|
||||
"city": "Zürich"
|
||||
},
|
||||
{
|
||||
"name": "St. Jakob Stadium",
|
||||
"city": "Basel"
|
||||
},
|
||||
{
|
||||
"name": "Cornaredo Stadium",
|
||||
"city": "Lugano"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"West Germany",
|
||||
"Northern Ireland",
|
||||
"Czechoslovakia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"France",
|
||||
"Paraguay",
|
||||
"Yugoslavia",
|
||||
"Scotland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Sweden",
|
||||
"Mexico",
|
||||
"Hungary",
|
||||
"Wales"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Austria",
|
||||
"Soviet Union",
|
||||
"England"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Malmö Stadion",
|
||||
"city": "Malmö"
|
||||
},
|
||||
{
|
||||
"name": "Örjans Vall",
|
||||
"city": "Halmstad"
|
||||
},
|
||||
{
|
||||
"name": "Olympiastadion",
|
||||
"city": "Helsingborg"
|
||||
},
|
||||
{
|
||||
"name": "Idrottsparken",
|
||||
"city": "Norrköping"
|
||||
},
|
||||
{
|
||||
"name": "Arosvallen",
|
||||
"city": "Västerås"
|
||||
},
|
||||
{
|
||||
"name": "Eyravallen",
|
||||
"city": "Örebro"
|
||||
},
|
||||
{
|
||||
"name": "Tunavallen",
|
||||
"city": "Eskilstuna"
|
||||
},
|
||||
{
|
||||
"name": "Råsunda Stadium",
|
||||
"city": "Solna"
|
||||
},
|
||||
{
|
||||
"name": "Jernvallen",
|
||||
"city": "Sandviken"
|
||||
},
|
||||
{
|
||||
"name": "Rimnersvallen",
|
||||
"city": "Uddevalla"
|
||||
},
|
||||
{
|
||||
"name": "Ullevi",
|
||||
"city": "Gothenburg"
|
||||
},
|
||||
{
|
||||
"name": "Ryavallen",
|
||||
"city": "Borås"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Colombia",
|
||||
"Soviet Union",
|
||||
"Yugoslavia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"Chile",
|
||||
"Switzerland",
|
||||
"West Germany",
|
||||
"Italy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Mexico",
|
||||
"Czechoslovakia",
|
||||
"Spain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Bulgaria",
|
||||
"Hungary",
|
||||
"England"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,928 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1962-06-10",
|
||||
"time": "14:30",
|
||||
"team1": "Chile",
|
||||
"team2": "Soviet Union",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "L. Sánchez",
|
||||
"minute": 11
|
||||
},
|
||||
{
|
||||
"name": "Rojas",
|
||||
"minute": 29
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Chislenko",
|
||||
"minute": 26
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1962-06-10",
|
||||
"time": "14:30",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Scherer",
|
||||
"minute": 13
|
||||
}
|
||||
],
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1962-06-10",
|
||||
"time": "14:30",
|
||||
"team1": "Brazil",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Garrincha",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Garrincha",
|
||||
"minute": 59
|
||||
},
|
||||
{
|
||||
"name": "Vavá",
|
||||
"minute": 53
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Hitchens",
|
||||
"minute": 38
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1962-06-10",
|
||||
"time": "14:30",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "West Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Radaković",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1962-06-13",
|
||||
"time": "14:30",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Yugoslavia",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Kadraba",
|
||||
"minute": 48
|
||||
},
|
||||
{
|
||||
"name": "Scherer",
|
||||
"minute": 80
|
||||
},
|
||||
{
|
||||
"name": "Scherer",
|
||||
"minute": 84,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Jerković",
|
||||
"minute": 69
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1962-06-13",
|
||||
"time": "14:30",
|
||||
"team1": "Brazil",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Garrincha",
|
||||
"minute": 9
|
||||
},
|
||||
{
|
||||
"name": "Garrincha",
|
||||
"minute": 32
|
||||
},
|
||||
{
|
||||
"name": "Vavá",
|
||||
"minute": 47
|
||||
},
|
||||
{
|
||||
"name": "Vavá",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Toro",
|
||||
"minute": 42
|
||||
},
|
||||
{
|
||||
"name": "L. Sánchez",
|
||||
"minute": 61,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1962-06-16",
|
||||
"time": "14:30",
|
||||
"team1": "Chile",
|
||||
"team2": "Yugoslavia",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Rojas",
|
||||
"minute": 90
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1962-06-17",
|
||||
"time": "14:30",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Amarildo",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Zito",
|
||||
"minute": 69
|
||||
},
|
||||
{
|
||||
"name": "Vavá",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Masopust",
|
||||
"minute": 15
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-05-30",
|
||||
"time": "15:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Colombia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Cubilla",
|
||||
"minute": 56
|
||||
},
|
||||
{
|
||||
"name": "Sasía",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Zuluaga",
|
||||
"minute": 19,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-05-31",
|
||||
"time": "15:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Yugoslavia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ivanov",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Ponedelnik",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-06-02",
|
||||
"time": "15:00",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Skoblar",
|
||||
"minute": 25,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Galić",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Jerković",
|
||||
"minute": 49
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Cabrera",
|
||||
"minute": 19
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-06-03",
|
||||
"time": "15:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Colombia",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
4
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ivanov",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Ivanov",
|
||||
"minute": 11
|
||||
},
|
||||
{
|
||||
"name": "Chislenko",
|
||||
"minute": 10
|
||||
},
|
||||
{
|
||||
"name": "Ponedelnik",
|
||||
"minute": 56
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Aceros",
|
||||
"minute": 21
|
||||
},
|
||||
{
|
||||
"name": "Coll",
|
||||
"minute": 68
|
||||
},
|
||||
{
|
||||
"name": "Rada",
|
||||
"minute": 72
|
||||
},
|
||||
{
|
||||
"name": "Klinger",
|
||||
"minute": 86
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-06-06",
|
||||
"time": "15:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Mamykin",
|
||||
"minute": 38
|
||||
},
|
||||
{
|
||||
"name": "Ivanov",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Sasía",
|
||||
"minute": 54
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1962-06-07",
|
||||
"time": "15:00",
|
||||
"team1": "Yugoslavia",
|
||||
"team2": "Colombia",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Galić",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Galić",
|
||||
"minute": 61
|
||||
},
|
||||
{
|
||||
"name": "Jerković",
|
||||
"minute": 25
|
||||
},
|
||||
{
|
||||
"name": "Jerković",
|
||||
"minute": 87
|
||||
},
|
||||
{
|
||||
"name": "Melić",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Carlos Dittborn, Arica"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-05-30",
|
||||
"time": "15:00",
|
||||
"team1": "Chile",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "L. Sánchez",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "L. Sánchez",
|
||||
"minute": 55
|
||||
},
|
||||
{
|
||||
"name": "Ramírez",
|
||||
"minute": 51
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Wüthrich",
|
||||
"minute": 6
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-05-31",
|
||||
"time": "15:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-06-02",
|
||||
"time": "15:00",
|
||||
"team1": "Chile",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Ramírez",
|
||||
"minute": 73
|
||||
},
|
||||
{
|
||||
"name": "Toro",
|
||||
"minute": 87
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-06-03",
|
||||
"time": "15:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Brülls",
|
||||
"minute": 45
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 59
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Schneiter",
|
||||
"minute": 73
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-06-06",
|
||||
"time": "15:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Szymaniak",
|
||||
"minute": 21,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 82
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1962-06-07",
|
||||
"time": "15:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Mora",
|
||||
"minute": 2
|
||||
},
|
||||
{
|
||||
"name": "Bulgarelli",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "Bulgarelli",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nacional, Santiago"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-05-30",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Zagallo",
|
||||
"minute": 56
|
||||
},
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 73
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-05-31",
|
||||
"time": "15:00",
|
||||
"team1": "Czechoslovakia",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Štibrányi",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-06-02",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-06-03",
|
||||
"time": "15:00",
|
||||
"team1": "Spain",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Peiró",
|
||||
"minute": 90
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-06-06",
|
||||
"time": "15:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Amarildo",
|
||||
"minute": 72
|
||||
},
|
||||
{
|
||||
"name": "Amarildo",
|
||||
"minute": 86
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Adelardo",
|
||||
"minute": 35
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1962-06-07",
|
||||
"time": "15:00",
|
||||
"team1": "Mexico",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Díaz",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Del Águila",
|
||||
"minute": 29
|
||||
},
|
||||
{
|
||||
"name": "Hernández",
|
||||
"minute": 90,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Mašek",
|
||||
"minute": 1
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Sausalito, Viña del Mar"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-05-30",
|
||||
"time": "15:00",
|
||||
"team1": "Argentina",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Facundo",
|
||||
"minute": 4
|
||||
}
|
||||
],
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-05-31",
|
||||
"time": "15:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Tichy",
|
||||
"minute": 17
|
||||
},
|
||||
{
|
||||
"name": "Albert",
|
||||
"minute": 71
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Flowers",
|
||||
"minute": 60,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-06-02",
|
||||
"time": "15:00",
|
||||
"team1": "England",
|
||||
"team2": "Argentina",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Flowers",
|
||||
"minute": 17,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Charlton",
|
||||
"minute": 42
|
||||
},
|
||||
{
|
||||
"name": "Greaves",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Sanfilippo",
|
||||
"minute": 81
|
||||
}
|
||||
],
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-06-03",
|
||||
"time": "15:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
6,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Albert",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Albert",
|
||||
"minute": 6
|
||||
},
|
||||
{
|
||||
"name": "Albert",
|
||||
"minute": 53
|
||||
},
|
||||
{
|
||||
"name": "Tichy",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Tichy",
|
||||
"minute": 70
|
||||
},
|
||||
{
|
||||
"name": "Solymosi",
|
||||
"minute": 12
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Sokolov",
|
||||
"minute": 64
|
||||
}
|
||||
],
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-06-06",
|
||||
"time": "15:00",
|
||||
"team1": "Hungary",
|
||||
"team2": "Argentina",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1962-06-07",
|
||||
"time": "15:00",
|
||||
"team1": "England",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio El Teniente, Rancagua"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estadio Carlos Dittborn",
|
||||
"city": "Arica"
|
||||
},
|
||||
{
|
||||
"name": "Estadio El Teniente",
|
||||
"city": "Rancagua"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Sausalito",
|
||||
"city": "Viña del Mar"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Nacional",
|
||||
"city": "Santiago"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"England",
|
||||
"Uruguay",
|
||||
"France",
|
||||
"Mexico"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"Switzerland",
|
||||
"Argentina",
|
||||
"Spain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Bulgaria",
|
||||
"Portugal",
|
||||
"Hungary"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Soviet Union",
|
||||
"North Korea",
|
||||
"Italy",
|
||||
"Chile"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,939 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1966-07-23",
|
||||
"time": "15:00",
|
||||
"team1": "England",
|
||||
"team2": "Argentina",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hurst",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1966-07-23",
|
||||
"time": "15:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 11
|
||||
},
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 83
|
||||
},
|
||||
{
|
||||
"name": "Beckenbauer",
|
||||
"minute": 70
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Hillsborough Stadium, Sheffield"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1966-07-23",
|
||||
"time": "15:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Chislenko",
|
||||
"minute": 5
|
||||
},
|
||||
{
|
||||
"name": "Porkuyan",
|
||||
"minute": 46
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Bene",
|
||||
"minute": 57
|
||||
}
|
||||
],
|
||||
"ground": "Roker Park, Sunderland"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1966-07-23",
|
||||
"time": "15:00",
|
||||
"team1": "Portugal",
|
||||
"team2": "North Korea",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
3
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 27
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 43,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 56
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 59,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "José Augusto",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Pak Seung-zin",
|
||||
"minute": 1
|
||||
},
|
||||
{
|
||||
"name": "Li Dong-woon",
|
||||
"minute": 22
|
||||
},
|
||||
{
|
||||
"name": "Yang Seung-kook",
|
||||
"minute": 25
|
||||
}
|
||||
],
|
||||
"ground": "Goodison Park, Liverpool"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1966-07-25",
|
||||
"time": "19:30",
|
||||
"team1": "West Germany",
|
||||
"team2": "Soviet Union",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 43
|
||||
},
|
||||
{
|
||||
"name": "Beckenbauer",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Porkuyan",
|
||||
"minute": 88
|
||||
}
|
||||
],
|
||||
"ground": "Goodison Park, Liverpool"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1966-07-26",
|
||||
"time": "19:30",
|
||||
"team1": "England",
|
||||
"team2": "Portugal",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "B. Charlton",
|
||||
"minute": 30
|
||||
},
|
||||
{
|
||||
"name": "B. Charlton",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 82,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1966-07-28",
|
||||
"time": "19:30",
|
||||
"team1": "Portugal",
|
||||
"team2": "Soviet Union",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 12,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Torres",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Malofeyev",
|
||||
"minute": 43
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1966-07-30",
|
||||
"time": "15:00",
|
||||
"team1": "England",
|
||||
"team2": "West Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"et": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hurst",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Hurst",
|
||||
"minute": 101
|
||||
},
|
||||
{
|
||||
"name": "Hurst",
|
||||
"minute": 120
|
||||
},
|
||||
{
|
||||
"name": "Peters",
|
||||
"minute": 78
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Weber",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-11",
|
||||
"time": "19:30",
|
||||
"team1": "England",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-13",
|
||||
"time": "19:30",
|
||||
"team1": "France",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hausser",
|
||||
"minute": 62
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Borja",
|
||||
"minute": 48
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-15",
|
||||
"time": "19:30",
|
||||
"team1": "Uruguay",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Rocha",
|
||||
"minute": 26
|
||||
},
|
||||
{
|
||||
"name": "Cortés",
|
||||
"minute": 31
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "De Bourgoing",
|
||||
"minute": 15,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "White City Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-16",
|
||||
"time": "19:30",
|
||||
"team1": "England",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "B. Charlton",
|
||||
"minute": 37
|
||||
},
|
||||
{
|
||||
"name": "Hunt",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-19",
|
||||
"time": "16:30",
|
||||
"team1": "Mexico",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1966-07-20",
|
||||
"time": "19:30",
|
||||
"team1": "England",
|
||||
"team2": "France",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hunt",
|
||||
"minute": 38
|
||||
},
|
||||
{
|
||||
"name": "Hunt",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"ground": "Wembley Stadium, London"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-12",
|
||||
"time": "19:30",
|
||||
"team1": "West Germany",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Held",
|
||||
"minute": 16
|
||||
},
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 21
|
||||
},
|
||||
{
|
||||
"name": "Haller",
|
||||
"minute": 77,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Beckenbauer",
|
||||
"minute": 40
|
||||
},
|
||||
{
|
||||
"name": "Beckenbauer",
|
||||
"minute": 52
|
||||
}
|
||||
],
|
||||
"ground": "Hillsborough Stadium, Sheffield"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-13",
|
||||
"time": "19:30",
|
||||
"team1": "Argentina",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Artime",
|
||||
"minute": 66
|
||||
},
|
||||
{
|
||||
"name": "Artime",
|
||||
"minute": 79
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Roma",
|
||||
"minute": 72,
|
||||
"owngoal": true
|
||||
}
|
||||
],
|
||||
"ground": "Villa Park, Birmingham"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-15",
|
||||
"time": "19:30",
|
||||
"team1": "Spain",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Sanchís",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Amancio",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Quentin",
|
||||
"minute": 31
|
||||
}
|
||||
],
|
||||
"ground": "Hillsborough Stadium, Sheffield"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-16",
|
||||
"time": "15:00",
|
||||
"team1": "Argentina",
|
||||
"team2": "West Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Villa Park, Birmingham"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-19",
|
||||
"time": "19:30",
|
||||
"team1": "Argentina",
|
||||
"team2": "Switzerland",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Artime",
|
||||
"minute": 52
|
||||
},
|
||||
{
|
||||
"name": "Onega",
|
||||
"minute": 79
|
||||
}
|
||||
],
|
||||
"ground": "Hillsborough Stadium, Sheffield"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1966-07-20",
|
||||
"time": "19:30",
|
||||
"team1": "West Germany",
|
||||
"team2": "Spain",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Emmerich",
|
||||
"minute": 39
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 84
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Fusté",
|
||||
"minute": 23
|
||||
}
|
||||
],
|
||||
"ground": "Villa Park, Birmingham"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-12",
|
||||
"time": "19:30",
|
||||
"team1": "Brazil",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Garrincha",
|
||||
"minute": 63
|
||||
}
|
||||
],
|
||||
"ground": "Goodison Park, Liverpool"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-13",
|
||||
"time": "19:30",
|
||||
"team1": "Portugal",
|
||||
"team2": "Hungary",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "José Augusto",
|
||||
"minute": 2
|
||||
},
|
||||
{
|
||||
"name": "José Augusto",
|
||||
"minute": 67
|
||||
},
|
||||
{
|
||||
"name": "Torres",
|
||||
"minute": 90
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Bene",
|
||||
"minute": 60
|
||||
}
|
||||
],
|
||||
"ground": "Old Trafford, Manchester"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-15",
|
||||
"time": "19:30",
|
||||
"team1": "Hungary",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Bene",
|
||||
"minute": 2
|
||||
},
|
||||
{
|
||||
"name": "Farkas",
|
||||
"minute": 64
|
||||
},
|
||||
{
|
||||
"name": "Mészöly",
|
||||
"minute": 73,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Tostão",
|
||||
"minute": 14
|
||||
}
|
||||
],
|
||||
"ground": "Goodison Park, Liverpool"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-16",
|
||||
"time": "15:00",
|
||||
"team1": "Portugal",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Vutsov",
|
||||
"minute": 7,
|
||||
"owngoal": true
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 38
|
||||
},
|
||||
{
|
||||
"name": "Torres",
|
||||
"minute": 81
|
||||
}
|
||||
],
|
||||
"ground": "Old Trafford, Manchester"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-19",
|
||||
"time": "19:30",
|
||||
"team1": "Portugal",
|
||||
"team2": "Brazil",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Simões",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 27
|
||||
},
|
||||
{
|
||||
"name": "Eusébio",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Rildo",
|
||||
"minute": 73
|
||||
}
|
||||
],
|
||||
"ground": "Goodison Park, Liverpool"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1966-07-20",
|
||||
"time": "19:30",
|
||||
"team1": "Hungary",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Davidov",
|
||||
"minute": 43,
|
||||
"owngoal": true
|
||||
},
|
||||
{
|
||||
"name": "Mészöly",
|
||||
"minute": 45
|
||||
},
|
||||
{
|
||||
"name": "Bene",
|
||||
"minute": 54
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Asparuhov",
|
||||
"minute": 15
|
||||
}
|
||||
],
|
||||
"ground": "Old Trafford, Manchester"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-12",
|
||||
"time": "19:30",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "North Korea",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Malofeyev",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Malofeyev",
|
||||
"minute": 88
|
||||
},
|
||||
{
|
||||
"name": "Banishevskiy",
|
||||
"minute": 33
|
||||
}
|
||||
],
|
||||
"ground": "Ayresome Park, Middlesbrough"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-13",
|
||||
"time": "19:30",
|
||||
"team1": "Italy",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Mazzola",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Barison",
|
||||
"minute": 88
|
||||
}
|
||||
],
|
||||
"ground": "Roker Park, Sunderland"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-15",
|
||||
"time": "19:30",
|
||||
"team1": "Chile",
|
||||
"team2": "North Korea",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Marcos",
|
||||
"minute": 26,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Pak Seung-zin",
|
||||
"minute": 88
|
||||
}
|
||||
],
|
||||
"ground": "Ayresome Park, Middlesbrough"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-16",
|
||||
"time": "15:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Chislenko",
|
||||
"minute": 57
|
||||
}
|
||||
],
|
||||
"ground": "Roker Park, Sunderland"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-19",
|
||||
"time": "19:30",
|
||||
"team1": "North Korea",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Pak Doo-ik",
|
||||
"minute": 42
|
||||
}
|
||||
],
|
||||
"ground": "Ayresome Park, Middlesbrough"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1966-07-20",
|
||||
"time": "19:30",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Chile",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Porkuyan",
|
||||
"minute": 28
|
||||
},
|
||||
{
|
||||
"name": "Porkuyan",
|
||||
"minute": 85
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Marcos",
|
||||
"minute": 32
|
||||
}
|
||||
],
|
||||
"ground": "Roker Park, Sunderland"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Wembley Stadium",
|
||||
"city": "London"
|
||||
},
|
||||
{
|
||||
"name": "Hillsborough Stadium",
|
||||
"city": "Sheffield"
|
||||
},
|
||||
{
|
||||
"name": "Roker Park",
|
||||
"city": "Sunderland"
|
||||
},
|
||||
{
|
||||
"name": "Goodison Park",
|
||||
"city": "Liverpool"
|
||||
},
|
||||
{
|
||||
"name": "White City Stadium",
|
||||
"city": "London"
|
||||
},
|
||||
{
|
||||
"name": "Villa Park",
|
||||
"city": "Birmingham"
|
||||
},
|
||||
{
|
||||
"name": "Old Trafford",
|
||||
"city": "Manchester"
|
||||
},
|
||||
{
|
||||
"name": "Ayresome Park",
|
||||
"city": "Middlesbrough"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Mexico",
|
||||
"Soviet Union",
|
||||
"Belgium",
|
||||
"El Salvador"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Israel",
|
||||
"Italy",
|
||||
"Sweden"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"England",
|
||||
"Romania",
|
||||
"Brazil",
|
||||
"Czechoslovakia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Peru",
|
||||
"Bulgaria",
|
||||
"West Germany",
|
||||
"Morocco"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,965 @@
|
||||
{
|
||||
"matches": [
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1970-06-14",
|
||||
"time": "12:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"et": [
|
||||
0,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Espárrago",
|
||||
"minute": 117
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1970-06-14",
|
||||
"time": "12:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Mexico",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Guzmán",
|
||||
"minute": 25,
|
||||
"owngoal": true
|
||||
},
|
||||
{
|
||||
"name": "Riva",
|
||||
"minute": 63
|
||||
},
|
||||
{
|
||||
"name": "Riva",
|
||||
"minute": 76
|
||||
},
|
||||
{
|
||||
"name": "Rivera",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "González",
|
||||
"minute": 13
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Luis Dosal, Toluca"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1970-06-14",
|
||||
"time": "12:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Peru",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Rivellino",
|
||||
"minute": 11
|
||||
},
|
||||
{
|
||||
"name": "Tostão",
|
||||
"minute": 15
|
||||
},
|
||||
{
|
||||
"name": "Tostão",
|
||||
"minute": 52
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 75
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Gallardo",
|
||||
"minute": 28
|
||||
},
|
||||
{
|
||||
"name": "Cubillas",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Quarter-finals",
|
||||
"date": "1970-06-14",
|
||||
"time": "12:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"et": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Beckenbauer",
|
||||
"minute": 68
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 82
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 108
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Mullery",
|
||||
"minute": 31
|
||||
},
|
||||
{
|
||||
"name": "Peters",
|
||||
"minute": 49
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1970-06-17",
|
||||
"time": "16:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Clodoaldo",
|
||||
"minute": 44
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 76
|
||||
},
|
||||
{
|
||||
"name": "Rivellino",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Cubilla",
|
||||
"minute": 19
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara[a]"
|
||||
},
|
||||
{
|
||||
"round": "Semi-finals",
|
||||
"date": "1970-06-17",
|
||||
"time": "16:00",
|
||||
"team1": "Italy",
|
||||
"team2": "West Germany",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"et": [
|
||||
4,
|
||||
3
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Boninsegna",
|
||||
"minute": 8
|
||||
},
|
||||
{
|
||||
"name": "Burgnich",
|
||||
"minute": 98
|
||||
},
|
||||
{
|
||||
"name": "Riva",
|
||||
"minute": 104
|
||||
},
|
||||
{
|
||||
"name": "Rivera",
|
||||
"minute": 111
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Schnellinger",
|
||||
"minute": 90,
|
||||
"offset": 2
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 94
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 110
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Third-place match",
|
||||
"date": "1970-06-20",
|
||||
"time": "16:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Overath",
|
||||
"minute": 26
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Final",
|
||||
"date": "1970-06-21",
|
||||
"time": "12:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 18
|
||||
},
|
||||
{
|
||||
"name": "Gérson",
|
||||
"minute": 66
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 71
|
||||
},
|
||||
{
|
||||
"name": "Carlos Alberto",
|
||||
"minute": 86
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Boninsegna",
|
||||
"minute": 37
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-05-31",
|
||||
"time": "12:00",
|
||||
"team1": "Mexico",
|
||||
"team2": "Soviet Union",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-06-03",
|
||||
"time": "16:00",
|
||||
"team1": "Belgium",
|
||||
"team2": "El Salvador",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Van Moer",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Van Moer",
|
||||
"minute": 54
|
||||
},
|
||||
{
|
||||
"name": "Lambert",
|
||||
"minute": 79,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-06-06",
|
||||
"time": "16:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Byshovets",
|
||||
"minute": 14
|
||||
},
|
||||
{
|
||||
"name": "Byshovets",
|
||||
"minute": 63
|
||||
},
|
||||
{
|
||||
"name": "Asatiani",
|
||||
"minute": 57
|
||||
},
|
||||
{
|
||||
"name": "Khmelnytskyi",
|
||||
"minute": 76
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Lambert",
|
||||
"minute": 86
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-06-07",
|
||||
"time": "12:00",
|
||||
"team1": "Mexico",
|
||||
"team2": "El Salvador",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Valdivia",
|
||||
"minute": 45
|
||||
},
|
||||
{
|
||||
"name": "Valdivia",
|
||||
"minute": 46
|
||||
},
|
||||
{
|
||||
"name": "Fragoso",
|
||||
"minute": 58
|
||||
},
|
||||
{
|
||||
"name": "Basaguren",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-06-10",
|
||||
"time": "16:00",
|
||||
"team1": "Soviet Union",
|
||||
"team2": "El Salvador",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Byshovets",
|
||||
"minute": 51
|
||||
},
|
||||
{
|
||||
"name": "Byshovets",
|
||||
"minute": 74
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 1",
|
||||
"date": "1970-06-11",
|
||||
"time": "16:00",
|
||||
"team1": "Mexico",
|
||||
"team2": "Belgium",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Peña",
|
||||
"minute": 14,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Azteca, Mexico City"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-02",
|
||||
"time": "16:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Israel",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Maneiro",
|
||||
"minute": 23
|
||||
},
|
||||
{
|
||||
"name": "Mujica",
|
||||
"minute": 50
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Cuauhtémoc, Puebla"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-03",
|
||||
"time": "16:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Sweden",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Domenghini",
|
||||
"minute": 10
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Luis Dosal, Toluca"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-06",
|
||||
"time": "16:00",
|
||||
"team1": "Uruguay",
|
||||
"team2": "Italy",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio Cuauhtémoc, Puebla"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-07",
|
||||
"time": "12:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Israel",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Turesson",
|
||||
"minute": 53
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Spiegler",
|
||||
"minute": 56
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Luis Dosal, Toluca"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-10",
|
||||
"time": "16:00",
|
||||
"team1": "Sweden",
|
||||
"team2": "Uruguay",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Grahn",
|
||||
"minute": 90
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Cuauhtémoc, Puebla"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 2",
|
||||
"date": "1970-06-11",
|
||||
"time": "16:00",
|
||||
"team1": "Italy",
|
||||
"team2": "Israel",
|
||||
"score": {
|
||||
"ft": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"ground": "Estadio Luis Dosal, Toluca"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-02",
|
||||
"time": "16:00",
|
||||
"team1": "England",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Hurst",
|
||||
"minute": 65
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-03",
|
||||
"time": "16:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
4,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Rivellino",
|
||||
"minute": 24
|
||||
},
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 59
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 61
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 83
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Petráš",
|
||||
"minute": 11
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-06",
|
||||
"time": "16:00",
|
||||
"team1": "Romania",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Neagu",
|
||||
"minute": 52
|
||||
},
|
||||
{
|
||||
"name": "Dumitrache",
|
||||
"minute": 75,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Petráš",
|
||||
"minute": 5
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-07",
|
||||
"time": "12:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "England",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 59
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-10",
|
||||
"time": "16:00",
|
||||
"team1": "Brazil",
|
||||
"team2": "Romania",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 19
|
||||
},
|
||||
{
|
||||
"name": "Pelé",
|
||||
"minute": 67
|
||||
},
|
||||
{
|
||||
"name": "Jairzinho",
|
||||
"minute": 22
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dumitrache",
|
||||
"minute": 34
|
||||
},
|
||||
{
|
||||
"name": "Dembrovschi",
|
||||
"minute": 84
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 3",
|
||||
"date": "1970-06-11",
|
||||
"time": "16:00",
|
||||
"team1": "England",
|
||||
"team2": "Czechoslovakia",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Clarke",
|
||||
"minute": 50,
|
||||
"penalty": true
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Jalisco, Guadalajara"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-02",
|
||||
"time": "16:00",
|
||||
"team1": "Peru",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Gallardo",
|
||||
"minute": 50
|
||||
},
|
||||
{
|
||||
"name": "Chumpitaz",
|
||||
"minute": 55
|
||||
},
|
||||
{
|
||||
"name": "Cubillas",
|
||||
"minute": 73
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Dermendzhiev",
|
||||
"minute": 13
|
||||
},
|
||||
{
|
||||
"name": "Bonev",
|
||||
"minute": 49
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-03",
|
||||
"time": "16:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Morocco",
|
||||
"score": {
|
||||
"ft": [
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 56
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 80
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Jarir",
|
||||
"minute": 21
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-06",
|
||||
"time": "16:00",
|
||||
"team1": "Peru",
|
||||
"team2": "Morocco",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
0
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Cubillas",
|
||||
"minute": 65
|
||||
},
|
||||
{
|
||||
"name": "Cubillas",
|
||||
"minute": 75
|
||||
},
|
||||
{
|
||||
"name": "Challe",
|
||||
"minute": 67
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-07",
|
||||
"time": "12:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Bulgaria",
|
||||
"score": {
|
||||
"ft": [
|
||||
5,
|
||||
2
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Libuda",
|
||||
"minute": 20
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 27
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 52,
|
||||
"penalty": true
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 88
|
||||
},
|
||||
{
|
||||
"name": "Seeler",
|
||||
"minute": 70
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Nikodimov",
|
||||
"minute": 12
|
||||
},
|
||||
{
|
||||
"name": "Kolev",
|
||||
"minute": 89
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-10",
|
||||
"time": "16:00",
|
||||
"team1": "West Germany",
|
||||
"team2": "Peru",
|
||||
"score": {
|
||||
"ft": [
|
||||
3,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 19
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 26
|
||||
},
|
||||
{
|
||||
"name": "Müller",
|
||||
"minute": 39
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Cubillas",
|
||||
"minute": 44
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
},
|
||||
{
|
||||
"round": "Group stage",
|
||||
"group": "Group 4",
|
||||
"date": "1970-06-11",
|
||||
"time": "16:00",
|
||||
"team1": "Bulgaria",
|
||||
"team2": "Morocco",
|
||||
"score": {
|
||||
"ft": [
|
||||
1,
|
||||
1
|
||||
]
|
||||
},
|
||||
"goals1": [
|
||||
{
|
||||
"name": "Zhechev",
|
||||
"minute": 40
|
||||
}
|
||||
],
|
||||
"goals2": [
|
||||
{
|
||||
"name": "Ghazouani",
|
||||
"minute": 61
|
||||
}
|
||||
],
|
||||
"ground": "Estadio Nou Camp, León"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estadio Azteca",
|
||||
"city": "Mexico City"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Luis Dosal",
|
||||
"city": "Toluca"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Jalisco",
|
||||
"city": "Guadalajara"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Nou Camp",
|
||||
"city": "León"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Cuauhtémoc",
|
||||
"city": "Puebla"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"Chile",
|
||||
"East Germany",
|
||||
"Australia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Yugoslavia",
|
||||
"Zaire",
|
||||
"Scotland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Netherlands",
|
||||
"Sweden",
|
||||
"Bulgaria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Haiti",
|
||||
"Poland",
|
||||
"Argentina"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Netherlands",
|
||||
"Argentina",
|
||||
"Brazil",
|
||||
"East Germany"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Yugoslavia",
|
||||
"West Germany",
|
||||
"Sweden",
|
||||
"Poland"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Olympiastadion",
|
||||
"city": "Munich"
|
||||
},
|
||||
{
|
||||
"name": "Volksparkstadion",
|
||||
"city": "Hamburg"
|
||||
},
|
||||
{
|
||||
"name": "Waldstadion",
|
||||
"city": "Frankfurt"
|
||||
},
|
||||
{
|
||||
"name": "Westfalenstadion",
|
||||
"city": "Dortmund"
|
||||
},
|
||||
{
|
||||
"name": "Parkstadion",
|
||||
"city": "Gelsenkirchen"
|
||||
},
|
||||
{
|
||||
"name": "Niedersachsenstadion",
|
||||
"city": "Hanover"
|
||||
},
|
||||
{
|
||||
"name": "Rheinstadion",
|
||||
"city": "Düsseldorf"
|
||||
},
|
||||
{
|
||||
"name": "Neckarstadion",
|
||||
"city": "Stuttgart"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"France",
|
||||
"Argentina",
|
||||
"Hungary"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"Poland",
|
||||
"Tunisia",
|
||||
"Mexico"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Austria",
|
||||
"Spain",
|
||||
"Brazil",
|
||||
"Sweden"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"Peru",
|
||||
"Scotland",
|
||||
"Netherlands",
|
||||
"Iran"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Austria",
|
||||
"Netherlands",
|
||||
"Italy",
|
||||
"West Germany"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Peru",
|
||||
"Argentina",
|
||||
"Poland"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "River Plate Stadium",
|
||||
"city": "Buenos Aires"
|
||||
},
|
||||
{
|
||||
"name": "Estadio José María Minella",
|
||||
"city": "Mar del Plata"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Monumental",
|
||||
"city": "Buenos Aires"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Gigante de Arroyito",
|
||||
"city": "Rosario"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Chateau Carreras",
|
||||
"city": "Córdoba"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Olímpico Chateau Carreras",
|
||||
"city": "Córdoba"
|
||||
},
|
||||
{
|
||||
"name": "Estadio José Amalfitani",
|
||||
"city": "Buenos Aires"
|
||||
},
|
||||
{
|
||||
"name": "Estadio José Maria Minella",
|
||||
"city": "Mar del Plata"
|
||||
},
|
||||
{
|
||||
"name": "Chateau Carreras",
|
||||
"city": "Córdoba"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Ciudad de Mendoza",
|
||||
"city": "Mendoza"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Malvinas Argentinas",
|
||||
"city": "Mendoza"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group 1",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Poland",
|
||||
"Peru",
|
||||
"Cameroon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 2",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"Algeria",
|
||||
"Chile",
|
||||
"Austria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 3",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Belgium",
|
||||
"Hungary",
|
||||
"El Salvador"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 4",
|
||||
"teams": [
|
||||
"England",
|
||||
"France",
|
||||
"Czechoslovakia",
|
||||
"Kuwait"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 5",
|
||||
"teams": [
|
||||
"Spain",
|
||||
"Honduras",
|
||||
"Yugoslavia",
|
||||
"Northern Ireland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group 6",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Soviet Union",
|
||||
"Scotland",
|
||||
"New Zealand"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Poland",
|
||||
"Belgium",
|
||||
"Soviet Union"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"West Germany",
|
||||
"England",
|
||||
"Spain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Argentina",
|
||||
"Brazil"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Austria",
|
||||
"France",
|
||||
"Northern Ireland"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Camp Nou",
|
||||
"city": "Barcelona"
|
||||
},
|
||||
{
|
||||
"name": "Ramón Sánchez Pizjuán Stadium",
|
||||
"city": "Seville"
|
||||
},
|
||||
{
|
||||
"name": "Estadio José Rico Pérez",
|
||||
"city": "Alicante"
|
||||
},
|
||||
{
|
||||
"name": "Santiago Bernabéu",
|
||||
"city": "Madrid"
|
||||
},
|
||||
{
|
||||
"name": "Balaídos",
|
||||
"city": "Vigo"
|
||||
},
|
||||
{
|
||||
"name": "Estadio de Riazor",
|
||||
"city": "A Coruña"
|
||||
},
|
||||
{
|
||||
"name": "El Molinón",
|
||||
"city": "Gijón"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Carlos Tartiere",
|
||||
"city": "Oviedo"
|
||||
},
|
||||
{
|
||||
"name": "Nuevo Estadio",
|
||||
"city": "Elche"
|
||||
},
|
||||
{
|
||||
"name": "San Mamés",
|
||||
"city": "Bilbao"
|
||||
},
|
||||
{
|
||||
"name": "Estadio José Zorrilla",
|
||||
"city": "Valladolid"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Luis Casanova",
|
||||
"city": "Valencia"
|
||||
},
|
||||
{
|
||||
"name": "La Romareda",
|
||||
"city": "Zaragoza"
|
||||
},
|
||||
{
|
||||
"name": "Ramón Sánchez Pizjuán",
|
||||
"city": "Seville"
|
||||
},
|
||||
{
|
||||
"name": "La Rosaleda Stadium",
|
||||
"city": "Málaga"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Benito Villamarín",
|
||||
"city": "Seville"
|
||||
},
|
||||
{
|
||||
"name": "Sarrià Stadium",
|
||||
"city": "Barcelona"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Sarriá",
|
||||
"city": "Barcelona"
|
||||
},
|
||||
{
|
||||
"name": "Vicente Calderón",
|
||||
"city": "Madrid"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Bulgaria",
|
||||
"Italy",
|
||||
"Argentina",
|
||||
"South Korea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Belgium",
|
||||
"Mexico",
|
||||
"Paraguay",
|
||||
"Iraq"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Canada",
|
||||
"France",
|
||||
"Soviet Union",
|
||||
"Hungary"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Spain",
|
||||
"Brazil",
|
||||
"Algeria",
|
||||
"Northern Ireland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"West Germany",
|
||||
"Scotland",
|
||||
"Denmark"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Morocco",
|
||||
"Poland",
|
||||
"Portugal",
|
||||
"England"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estadio Azteca",
|
||||
"city": "Mexico City"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Nou Camp",
|
||||
"city": "León"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Jalisco",
|
||||
"city": "Guadalajara"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Cuauhtémoc",
|
||||
"city": "Puebla"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Olímpico Universitario",
|
||||
"city": "Mexico City"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Universitario",
|
||||
"city": "San Nicolás de los Garza"
|
||||
},
|
||||
{
|
||||
"name": "Estadio La Corregidora",
|
||||
"city": "Querétaro"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Toluca 70–86",
|
||||
"city": "Toluca"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Sergio León Chavez",
|
||||
"city": "Irapuato"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Tres de Marzo",
|
||||
"city": "Zapopan"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Tecnológico",
|
||||
"city": "Monterrey"
|
||||
},
|
||||
{
|
||||
"name": "Estadio Neza 86",
|
||||
"city": "Nezahualcóyotl"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Austria",
|
||||
"United States",
|
||||
"Czechoslovakia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Cameroon",
|
||||
"Soviet Union",
|
||||
"Romania"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Sweden",
|
||||
"Costa Rica",
|
||||
"Scotland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"United Arab Emirates",
|
||||
"Colombia",
|
||||
"West Germany",
|
||||
"Yugoslavia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Belgium",
|
||||
"South Korea",
|
||||
"Uruguay",
|
||||
"Spain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"England",
|
||||
"Republic of Ireland",
|
||||
"Netherlands",
|
||||
"Egypt"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Stadio San Paolo",
|
||||
"city": "Naples"
|
||||
},
|
||||
{
|
||||
"name": "Stadio San Nicola",
|
||||
"city": "Bari"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Delle Alpi",
|
||||
"city": "Turin"
|
||||
},
|
||||
{
|
||||
"name": "San Siro",
|
||||
"city": "Milan"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Luigi Ferraris",
|
||||
"city": "Genoa"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Olimpico",
|
||||
"city": "Rome"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Marc'Antonio Bentegodi",
|
||||
"city": "Verona"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Renato Dall'Ara",
|
||||
"city": "Bologna"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Comunale",
|
||||
"city": "Florence"
|
||||
},
|
||||
{
|
||||
"name": "Stadio delle Alpi",
|
||||
"city": "Turin"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Friuli",
|
||||
"city": "Udine"
|
||||
},
|
||||
{
|
||||
"name": "Stadio Sant'Elia",
|
||||
"city": "Cagliari"
|
||||
},
|
||||
{
|
||||
"name": "Stadio La Favorita",
|
||||
"city": "Palermo"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"United States",
|
||||
"Switzerland",
|
||||
"Colombia",
|
||||
"Romania"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Cameroon",
|
||||
"Sweden",
|
||||
"Brazil",
|
||||
"Russia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Germany",
|
||||
"Bolivia",
|
||||
"Spain",
|
||||
"South Korea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Greece",
|
||||
"Nigeria",
|
||||
"Bulgaria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Republic of Ireland",
|
||||
"Norway",
|
||||
"Mexico"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Belgium",
|
||||
"Morocco",
|
||||
"Netherlands",
|
||||
"Saudi Arabia"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Soldier Field",
|
||||
"city": "Chicago"
|
||||
},
|
||||
{
|
||||
"name": "RFK Stadium",
|
||||
"city": "Washington, D.C."
|
||||
},
|
||||
{
|
||||
"name": "Cotton Bowl",
|
||||
"city": "Dallas"
|
||||
},
|
||||
{
|
||||
"name": "Rose Bowl",
|
||||
"city": "Pasadena"
|
||||
},
|
||||
{
|
||||
"name": "Citrus Bowl",
|
||||
"city": "Orlando"
|
||||
},
|
||||
{
|
||||
"name": "Stanford Stadium",
|
||||
"city": "Stanford"
|
||||
},
|
||||
{
|
||||
"name": "Foxboro Stadium",
|
||||
"city": "Foxborough"
|
||||
},
|
||||
{
|
||||
"name": "Giants Stadium",
|
||||
"city": "East Rutherford"
|
||||
},
|
||||
{
|
||||
"name": "Pontiac Silverdome",
|
||||
"city": "Pontiac"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Scotland",
|
||||
"Morocco",
|
||||
"Norway"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Chile",
|
||||
"Cameroon",
|
||||
"Austria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Saudi Arabia",
|
||||
"Denmark",
|
||||
"France",
|
||||
"South Africa"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Paraguay",
|
||||
"Bulgaria",
|
||||
"Spain",
|
||||
"Nigeria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"South Korea",
|
||||
"Mexico",
|
||||
"Netherlands",
|
||||
"Belgium"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"FR Yugoslavia",
|
||||
"Iran",
|
||||
"Germany",
|
||||
"United States"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"England",
|
||||
"Tunisia",
|
||||
"Romania",
|
||||
"Colombia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Japan",
|
||||
"Jamaica",
|
||||
"Croatia"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Stade Vélodrome",
|
||||
"city": "Marseille"
|
||||
},
|
||||
{
|
||||
"name": "Parc des Princes",
|
||||
"city": "Paris"
|
||||
},
|
||||
{
|
||||
"name": "Stade Félix-Bollaert",
|
||||
"city": "Lens"
|
||||
},
|
||||
{
|
||||
"name": "Stade de France",
|
||||
"city": "Saint-Denis"
|
||||
},
|
||||
{
|
||||
"name": "Stade de la Mosson",
|
||||
"city": "Montpellier"
|
||||
},
|
||||
{
|
||||
"name": "Stade de Toulouse",
|
||||
"city": "Toulouse"
|
||||
},
|
||||
{
|
||||
"name": "Parc Lescure",
|
||||
"city": "Bordeaux"
|
||||
},
|
||||
{
|
||||
"name": "Stade Geoffroy-Guichard",
|
||||
"city": "Saint-Étienne"
|
||||
},
|
||||
{
|
||||
"name": "Stade de la Beaujoire",
|
||||
"city": "Nantes"
|
||||
},
|
||||
{
|
||||
"name": "Stade de Gerland",
|
||||
"city": "Lyon"
|
||||
},
|
||||
{
|
||||
"name": "Stade Gerland",
|
||||
"city": "Lyon"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"France",
|
||||
"Senegal",
|
||||
"Uruguay",
|
||||
"Denmark"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Paraguay",
|
||||
"South Africa",
|
||||
"Spain",
|
||||
"Slovenia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Turkey",
|
||||
"China",
|
||||
"Costa Rica"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"South Korea",
|
||||
"Poland",
|
||||
"United States",
|
||||
"Portugal"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Republic of Ireland",
|
||||
"Cameroon",
|
||||
"Germany",
|
||||
"Saudi Arabia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Nigeria",
|
||||
"England",
|
||||
"Sweden"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"Croatia",
|
||||
"Mexico",
|
||||
"Italy",
|
||||
"Ecuador"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Japan",
|
||||
"Belgium",
|
||||
"Russia",
|
||||
"Tunisia"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Jeju World Cup Stadium",
|
||||
"city": "Seogwipo"
|
||||
},
|
||||
{
|
||||
"name": "Big Swan Stadium",
|
||||
"city": "Niigata"
|
||||
},
|
||||
{
|
||||
"name": "Big Eye Stadium",
|
||||
"city": "Ōita"
|
||||
},
|
||||
{
|
||||
"name": "Suwon World Cup Stadium",
|
||||
"city": "Suwon"
|
||||
},
|
||||
{
|
||||
"name": "Jeonju World Cup Stadium",
|
||||
"city": "Jeonju"
|
||||
},
|
||||
{
|
||||
"name": "Kobe Wing Stadium",
|
||||
"city": "Kobe"
|
||||
},
|
||||
{
|
||||
"name": "Miyagi Stadium",
|
||||
"city": "Rifu"
|
||||
},
|
||||
{
|
||||
"name": "Daejeon World Cup Stadium",
|
||||
"city": "Daejeon"
|
||||
},
|
||||
{
|
||||
"name": "Stadium Ecopa",
|
||||
"city": "Fukuroi"
|
||||
},
|
||||
{
|
||||
"name": "Munsu Cup Stadium",
|
||||
"city": "Ulsan"
|
||||
},
|
||||
{
|
||||
"name": "Gwangju World Cup Stadium",
|
||||
"city": "Gwangju"
|
||||
},
|
||||
{
|
||||
"name": "Nagai Stadium",
|
||||
"city": "Osaka"
|
||||
},
|
||||
{
|
||||
"name": "Seoul World Cup Stadium",
|
||||
"city": "Seoul"
|
||||
},
|
||||
{
|
||||
"name": "Saitama Stadium",
|
||||
"city": "Saitama"
|
||||
},
|
||||
{
|
||||
"name": "Daegu World Cup Stadium",
|
||||
"city": "Daegu"
|
||||
},
|
||||
{
|
||||
"name": "International Stadium",
|
||||
"city": "Yokohama"
|
||||
},
|
||||
{
|
||||
"name": "Busan Asiad Main Stadium",
|
||||
"city": "Busan"
|
||||
},
|
||||
{
|
||||
"name": "Incheon World Cup Stadium",
|
||||
"city": "Incheon"
|
||||
},
|
||||
{
|
||||
"name": "Munsu Football Stadium",
|
||||
"city": "Ulsan"
|
||||
},
|
||||
{
|
||||
"name": "Niigata Stadium",
|
||||
"city": "Niigata"
|
||||
},
|
||||
{
|
||||
"name": "Sapporo Dome",
|
||||
"city": "Sapporo"
|
||||
},
|
||||
{
|
||||
"name": "Kashima Soccer Stadium",
|
||||
"city": "Ibaraki"
|
||||
},
|
||||
{
|
||||
"name": "Ecopa Stadium",
|
||||
"city": "Shizuoka"
|
||||
},
|
||||
{
|
||||
"name": "International Stadium Yokohama",
|
||||
"city": "Yokohama"
|
||||
},
|
||||
{
|
||||
"name": "Wing Stadium",
|
||||
"city": "Kobe"
|
||||
},
|
||||
{
|
||||
"name": "Niigata Big Swan Stadium",
|
||||
"city": "Niigata"
|
||||
},
|
||||
{
|
||||
"name": "Ōita Big Eye Stadium",
|
||||
"city": "Ōita"
|
||||
},
|
||||
{
|
||||
"name": "Shizuoka Ecopa Stadium",
|
||||
"city": "Fukuroi, Shizuoka"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Germany",
|
||||
"Costa Rica",
|
||||
"Poland",
|
||||
"Ecuador"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"England",
|
||||
"Paraguay",
|
||||
"Trinidad and Tobago",
|
||||
"Sweden"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Ivory Coast",
|
||||
"Serbia and Montenegro",
|
||||
"Netherlands"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Mexico",
|
||||
"Iran",
|
||||
"Angola",
|
||||
"Portugal"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"United States",
|
||||
"Czech Republic",
|
||||
"Italy",
|
||||
"Ghana"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Australia",
|
||||
"Japan",
|
||||
"Brazil",
|
||||
"Croatia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"South Korea",
|
||||
"Togo",
|
||||
"France",
|
||||
"Switzerland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Spain",
|
||||
"Ukraine",
|
||||
"Tunisia",
|
||||
"Saudi Arabia"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Allianz Arena",
|
||||
"city": "Munich"
|
||||
},
|
||||
{
|
||||
"name": "Zentralstadion",
|
||||
"city": "Leipzig"
|
||||
},
|
||||
{
|
||||
"name": "Gottlieb-Daimler-Stadion",
|
||||
"city": "Stuttgart"
|
||||
},
|
||||
{
|
||||
"name": "Frankenstadion",
|
||||
"city": "Nuremberg"
|
||||
},
|
||||
{
|
||||
"name": "Fritz-Walter-Stadion",
|
||||
"city": "Kaiserslautern"
|
||||
},
|
||||
{
|
||||
"name": "RheinEnergieStadion",
|
||||
"city": "Cologne"
|
||||
},
|
||||
{
|
||||
"name": "Westfalenstadion",
|
||||
"city": "Dortmund"
|
||||
},
|
||||
{
|
||||
"name": "Niedersachsenstadion",
|
||||
"city": "Hanover"
|
||||
},
|
||||
{
|
||||
"name": "Olympiastadion",
|
||||
"city": "Berlin"
|
||||
},
|
||||
{
|
||||
"name": "Volksparkstadion",
|
||||
"city": "Hamburg"
|
||||
},
|
||||
{
|
||||
"name": "Arena AufSchalke",
|
||||
"city": "Gelsenkirchen"
|
||||
},
|
||||
{
|
||||
"name": "Waldstadion",
|
||||
"city": "Frankfurt"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"South Africa",
|
||||
"Mexico",
|
||||
"Uruguay",
|
||||
"France"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"South Korea",
|
||||
"Greece",
|
||||
"Argentina",
|
||||
"Nigeria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"England",
|
||||
"United States",
|
||||
"Algeria",
|
||||
"Slovenia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Serbia",
|
||||
"Ghana",
|
||||
"Germany",
|
||||
"Australia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Netherlands",
|
||||
"Denmark",
|
||||
"Japan",
|
||||
"Cameroon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Italy",
|
||||
"Paraguay",
|
||||
"New Zealand",
|
||||
"Slovakia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"Ivory Coast",
|
||||
"Portugal",
|
||||
"Brazil",
|
||||
"North Korea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Honduras",
|
||||
"Chile",
|
||||
"Spain",
|
||||
"Switzerland"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Nelson Mandela Bay Stadium",
|
||||
"city": "Port Elizabeth"
|
||||
},
|
||||
{
|
||||
"name": "Royal Bafokeng Stadium",
|
||||
"city": "Rustenburg"
|
||||
},
|
||||
{
|
||||
"name": "Free State Stadium",
|
||||
"city": "Bloemfontein"
|
||||
},
|
||||
{
|
||||
"name": "Soccer City",
|
||||
"city": "Johannesburg"
|
||||
},
|
||||
{
|
||||
"name": "Moses Mabhida Stadium",
|
||||
"city": "Durban"
|
||||
},
|
||||
{
|
||||
"name": "Ellis Park Stadium",
|
||||
"city": "Johannesburg"
|
||||
},
|
||||
{
|
||||
"name": "Loftus Versfeld Stadium",
|
||||
"city": "Pretoria"
|
||||
},
|
||||
{
|
||||
"name": "Cape Town Stadium",
|
||||
"city": "Cape Town"
|
||||
},
|
||||
{
|
||||
"name": "Peter Mokaba Stadium",
|
||||
"city": "Polokwane"
|
||||
},
|
||||
{
|
||||
"name": "Mbombela Stadium",
|
||||
"city": "Nelspruit"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Brazil",
|
||||
"Croatia",
|
||||
"Mexico",
|
||||
"Cameroon"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Spain",
|
||||
"Netherlands",
|
||||
"Chile",
|
||||
"Australia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Colombia",
|
||||
"Greece",
|
||||
"Ivory Coast",
|
||||
"Japan"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"Costa Rica",
|
||||
"England",
|
||||
"Italy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Switzerland",
|
||||
"Ecuador",
|
||||
"France",
|
||||
"Honduras"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Bosnia and Herzegovina",
|
||||
"Iran",
|
||||
"Nigeria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"Germany",
|
||||
"Portugal",
|
||||
"Ghana",
|
||||
"United States"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Belgium",
|
||||
"Algeria",
|
||||
"Russia",
|
||||
"South Korea"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Estádio Mineirão",
|
||||
"city": "Belo Horizonte"
|
||||
},
|
||||
{
|
||||
"name": "Estádio do Maracanã",
|
||||
"city": "Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Castelão",
|
||||
"city": "Fortaleza"
|
||||
},
|
||||
{
|
||||
"name": "Itaipava Arena Pernambuco",
|
||||
"city": "Recife"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Nacional Mané Garrincha",
|
||||
"city": "Brasília"
|
||||
},
|
||||
{
|
||||
"name": "Estádio Beira-Rio",
|
||||
"city": "Porto Alegre"
|
||||
},
|
||||
{
|
||||
"name": "Arena Corinthians",
|
||||
"city": "São Paulo"
|
||||
},
|
||||
{
|
||||
"name": "Itaipava Arena Fonte Nova",
|
||||
"city": "Salvador"
|
||||
},
|
||||
{
|
||||
"name": "Maracanã Stadium",
|
||||
"city": "Rio de Janeiro"
|
||||
},
|
||||
{
|
||||
"name": "Arena de São Paulo",
|
||||
"city": "São Paulo"
|
||||
},
|
||||
{
|
||||
"name": "Arena das Dunas",
|
||||
"city": "Natal"
|
||||
},
|
||||
{
|
||||
"name": "Arena da Amazônia",
|
||||
"city": "Manaus"
|
||||
},
|
||||
{
|
||||
"name": "Arena Pantanal",
|
||||
"city": "Cuiabá"
|
||||
},
|
||||
{
|
||||
"name": "Arena da Baixada",
|
||||
"city": "Curitiba"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Russia",
|
||||
"Saudi Arabia",
|
||||
"Egypt",
|
||||
"Uruguay"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"Morocco",
|
||||
"Iran",
|
||||
"Portugal",
|
||||
"Spain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"France",
|
||||
"Australia",
|
||||
"Peru",
|
||||
"Denmark"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Iceland",
|
||||
"Croatia",
|
||||
"Nigeria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Costa Rica",
|
||||
"Serbia",
|
||||
"Brazil",
|
||||
"Switzerland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Germany",
|
||||
"Mexico",
|
||||
"Sweden",
|
||||
"South Korea"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"Belgium",
|
||||
"Panama",
|
||||
"Tunisia",
|
||||
"England"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Colombia",
|
||||
"Japan",
|
||||
"Poland",
|
||||
"Senegal"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Kazan Arena",
|
||||
"city": "Kazan"
|
||||
},
|
||||
{
|
||||
"name": "Fisht Olympic Stadium",
|
||||
"city": "Sochi"
|
||||
},
|
||||
{
|
||||
"name": "Luzhniki Stadium",
|
||||
"city": "Moscow"
|
||||
},
|
||||
{
|
||||
"name": "Nizhny Novgorod Stadium",
|
||||
"city": "Nizhny Novgorod"
|
||||
},
|
||||
{
|
||||
"name": "Cosmos Arena",
|
||||
"city": "Samara"
|
||||
},
|
||||
{
|
||||
"name": "Rostov Arena",
|
||||
"city": "Rostov-on-Don"
|
||||
},
|
||||
{
|
||||
"name": "Krestovsky Stadium",
|
||||
"city": "Saint Petersburg"
|
||||
},
|
||||
{
|
||||
"name": "Otkritie Arena",
|
||||
"city": "Moscow"
|
||||
},
|
||||
{
|
||||
"name": "Central Stadium",
|
||||
"city": "Yekaterinburg"
|
||||
},
|
||||
{
|
||||
"name": "Volgograd Arena",
|
||||
"city": "Volgograd"
|
||||
},
|
||||
{
|
||||
"name": "Mordovia Arena",
|
||||
"city": "Saransk"
|
||||
},
|
||||
{
|
||||
"name": "Kaliningrad Stadium",
|
||||
"city": "Kaliningrad"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "Group A",
|
||||
"teams": [
|
||||
"Qatar",
|
||||
"Ecuador",
|
||||
"Senegal",
|
||||
"Netherlands"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group B",
|
||||
"teams": [
|
||||
"England",
|
||||
"Iran",
|
||||
"United States",
|
||||
"Wales"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group C",
|
||||
"teams": [
|
||||
"Argentina",
|
||||
"Saudi Arabia",
|
||||
"Mexico",
|
||||
"Poland"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group D",
|
||||
"teams": [
|
||||
"Denmark",
|
||||
"Tunisia",
|
||||
"France",
|
||||
"Australia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group E",
|
||||
"teams": [
|
||||
"Germany",
|
||||
"Japan",
|
||||
"Spain",
|
||||
"Costa Rica"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group F",
|
||||
"teams": [
|
||||
"Morocco",
|
||||
"Croatia",
|
||||
"Belgium",
|
||||
"Canada"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group G",
|
||||
"teams": [
|
||||
"Switzerland",
|
||||
"Cameroon",
|
||||
"Brazil",
|
||||
"Serbia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Group H",
|
||||
"teams": [
|
||||
"Uruguay",
|
||||
"South Korea",
|
||||
"Portugal",
|
||||
"Ghana"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"stadiums": [
|
||||
{
|
||||
"name": "Khalifa International Stadium",
|
||||
"city": "Al Rayyan"
|
||||
},
|
||||
{
|
||||
"name": "Ahmad bin Ali Stadium",
|
||||
"city": "Al Rayyan"
|
||||
},
|
||||
{
|
||||
"name": "Al Thumama Stadium",
|
||||
"city": "Doha"
|
||||
},
|
||||
{
|
||||
"name": "Al Bayt Stadium",
|
||||
"city": "Al Khor"
|
||||
},
|
||||
{
|
||||
"name": "Al Janoub Stadium",
|
||||
"city": "Al Wakrah"
|
||||
},
|
||||
{
|
||||
"name": "Stadium 974",
|
||||
"city": "Doha"
|
||||
},
|
||||
{
|
||||
"name": "Education City Stadium",
|
||||
"city": "Al Rayyan"
|
||||
},
|
||||
{
|
||||
"name": "Lusail Stadium",
|
||||
"city": "Lusail"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
"lint": "eslint",
|
||||
"seed": "tsx scripts/seed.ts",
|
||||
"sync": "tsx scripts/sync.ts",
|
||||
"scrape": "tsx scripts/scrape-wikipedia.ts",
|
||||
"db:generate": "drizzle-kit generate",
|
||||
"db:push": "drizzle-kit push"
|
||||
},
|
||||
@@ -17,6 +18,7 @@
|
||||
"@apollo/client": "^4.2.3",
|
||||
"@graphql-tools/schema": "^10.0.33",
|
||||
"@heroicons/react": "^2.2.0",
|
||||
"cheerio": "^1.2.0",
|
||||
"drizzle-orm": "^0.45.2",
|
||||
"flag-icons": "^7.5.0",
|
||||
"graphql": "^16.14.2",
|
||||
|
||||
Generated
+185
@@ -17,6 +17,9 @@ importers:
|
||||
'@heroicons/react':
|
||||
specifier: ^2.2.0
|
||||
version: 2.2.0(react@19.2.4)
|
||||
cheerio:
|
||||
specifier: ^1.2.0
|
||||
version: 1.2.0
|
||||
drizzle-orm:
|
||||
specifier: ^0.45.2
|
||||
version: 0.45.2(postgres@3.4.9)
|
||||
@@ -1402,6 +1405,9 @@ packages:
|
||||
engines: {node: '>=6.0.0'}
|
||||
hasBin: true
|
||||
|
||||
boolbase@1.0.0:
|
||||
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
||||
|
||||
brace-expansion@1.1.15:
|
||||
resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==}
|
||||
|
||||
@@ -1444,6 +1450,13 @@ packages:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
cheerio-select@2.1.0:
|
||||
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
|
||||
|
||||
cheerio@1.2.0:
|
||||
resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==}
|
||||
engines: {node: '>=20.18.1'}
|
||||
|
||||
client-only@0.0.1:
|
||||
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
|
||||
|
||||
@@ -1468,6 +1481,13 @@ packages:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
css-select@5.2.2:
|
||||
resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
|
||||
|
||||
css-what@6.2.2:
|
||||
resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
csstype@3.2.3:
|
||||
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
||||
|
||||
@@ -1522,6 +1542,19 @@ packages:
|
||||
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
dom-serializer@2.0.0:
|
||||
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
|
||||
|
||||
domelementtype@2.3.0:
|
||||
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
|
||||
|
||||
domhandler@5.0.3:
|
||||
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
|
||||
engines: {node: '>= 4'}
|
||||
|
||||
domutils@3.2.2:
|
||||
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
|
||||
|
||||
drizzle-kit@0.31.10:
|
||||
resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==}
|
||||
hasBin: true
|
||||
@@ -1628,10 +1661,25 @@ packages:
|
||||
emoji-regex@9.2.2:
|
||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||
|
||||
encoding-sniffer@0.2.1:
|
||||
resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==}
|
||||
|
||||
enhanced-resolve@5.21.6:
|
||||
resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
|
||||
entities@4.5.0:
|
||||
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
|
||||
engines: {node: '>=0.12'}
|
||||
|
||||
entities@6.0.1:
|
||||
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
|
||||
engines: {node: '>=0.12'}
|
||||
|
||||
entities@7.0.1:
|
||||
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
|
||||
engines: {node: '>=0.12'}
|
||||
|
||||
es-abstract@1.24.2:
|
||||
resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@@ -1972,6 +2020,13 @@ packages:
|
||||
hermes-parser@0.25.1:
|
||||
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
|
||||
|
||||
htmlparser2@10.1.0:
|
||||
resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
|
||||
|
||||
iconv-lite@0.6.3:
|
||||
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
ignore@5.3.2:
|
||||
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
||||
engines: {node: '>= 4'}
|
||||
@@ -2318,6 +2373,9 @@ packages:
|
||||
resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
nth-check@2.1.1:
|
||||
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
|
||||
|
||||
object-assign@4.1.1:
|
||||
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -2373,6 +2431,15 @@ packages:
|
||||
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
parse5-htmlparser2-tree-adapter@7.1.0:
|
||||
resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
|
||||
|
||||
parse5-parser-stream@7.1.2:
|
||||
resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
|
||||
|
||||
parse5@7.3.0:
|
||||
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
|
||||
|
||||
path-exists@4.0.0:
|
||||
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -2479,6 +2546,9 @@ packages:
|
||||
resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
safer-buffer@2.1.2:
|
||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||
|
||||
scheduler@0.27.0:
|
||||
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
|
||||
|
||||
@@ -2672,6 +2742,10 @@ packages:
|
||||
undici-types@6.21.0:
|
||||
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
||||
|
||||
undici@7.27.2:
|
||||
resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==}
|
||||
engines: {node: '>=20.18.1'}
|
||||
|
||||
unrs-resolver@1.12.2:
|
||||
resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==}
|
||||
|
||||
@@ -2687,6 +2761,15 @@ packages:
|
||||
urlpattern-polyfill@10.1.0:
|
||||
resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==}
|
||||
|
||||
whatwg-encoding@3.1.1:
|
||||
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
|
||||
engines: {node: '>=18'}
|
||||
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
|
||||
|
||||
whatwg-mimetype@4.0.0:
|
||||
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
which-boxed-primitive@1.1.1:
|
||||
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@@ -3829,6 +3912,8 @@ snapshots:
|
||||
|
||||
baseline-browser-mapping@2.10.37: {}
|
||||
|
||||
boolbase@1.0.0: {}
|
||||
|
||||
brace-expansion@1.1.15:
|
||||
dependencies:
|
||||
balanced-match: 1.0.2
|
||||
@@ -3878,6 +3963,29 @@ snapshots:
|
||||
ansi-styles: 4.3.0
|
||||
supports-color: 7.2.0
|
||||
|
||||
cheerio-select@2.1.0:
|
||||
dependencies:
|
||||
boolbase: 1.0.0
|
||||
css-select: 5.2.2
|
||||
css-what: 6.2.2
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 5.0.3
|
||||
domutils: 3.2.2
|
||||
|
||||
cheerio@1.2.0:
|
||||
dependencies:
|
||||
cheerio-select: 2.1.0
|
||||
dom-serializer: 2.0.0
|
||||
domhandler: 5.0.3
|
||||
domutils: 3.2.2
|
||||
encoding-sniffer: 0.2.1
|
||||
htmlparser2: 10.1.0
|
||||
parse5: 7.3.0
|
||||
parse5-htmlparser2-tree-adapter: 7.1.0
|
||||
parse5-parser-stream: 7.1.2
|
||||
undici: 7.27.2
|
||||
whatwg-mimetype: 4.0.0
|
||||
|
||||
client-only@0.0.1: {}
|
||||
|
||||
color-convert@2.0.1:
|
||||
@@ -3900,6 +4008,16 @@ snapshots:
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
css-select@5.2.2:
|
||||
dependencies:
|
||||
boolbase: 1.0.0
|
||||
css-what: 6.2.2
|
||||
domhandler: 5.0.3
|
||||
domutils: 3.2.2
|
||||
nth-check: 2.1.1
|
||||
|
||||
css-what@6.2.2: {}
|
||||
|
||||
csstype@3.2.3: {}
|
||||
|
||||
damerau-levenshtein@1.0.8: {}
|
||||
@@ -3950,6 +4068,24 @@ snapshots:
|
||||
dependencies:
|
||||
esutils: 2.0.3
|
||||
|
||||
dom-serializer@2.0.0:
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 5.0.3
|
||||
entities: 4.5.0
|
||||
|
||||
domelementtype@2.3.0: {}
|
||||
|
||||
domhandler@5.0.3:
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
|
||||
domutils@3.2.2:
|
||||
dependencies:
|
||||
dom-serializer: 2.0.0
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 5.0.3
|
||||
|
||||
drizzle-kit@0.31.10:
|
||||
dependencies:
|
||||
'@drizzle-team/brocli': 0.10.2
|
||||
@@ -3971,11 +4107,22 @@ snapshots:
|
||||
|
||||
emoji-regex@9.2.2: {}
|
||||
|
||||
encoding-sniffer@0.2.1:
|
||||
dependencies:
|
||||
iconv-lite: 0.6.3
|
||||
whatwg-encoding: 3.1.1
|
||||
|
||||
enhanced-resolve@5.21.6:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
tapable: 2.3.3
|
||||
|
||||
entities@4.5.0: {}
|
||||
|
||||
entities@6.0.1: {}
|
||||
|
||||
entities@7.0.1: {}
|
||||
|
||||
es-abstract@1.24.2:
|
||||
dependencies:
|
||||
array-buffer-byte-length: 1.0.2
|
||||
@@ -4540,6 +4687,17 @@ snapshots:
|
||||
dependencies:
|
||||
hermes-estree: 0.25.1
|
||||
|
||||
htmlparser2@10.1.0:
|
||||
dependencies:
|
||||
domelementtype: 2.3.0
|
||||
domhandler: 5.0.3
|
||||
domutils: 3.2.2
|
||||
entities: 7.0.1
|
||||
|
||||
iconv-lite@0.6.3:
|
||||
dependencies:
|
||||
safer-buffer: 2.1.2
|
||||
|
||||
ignore@5.3.2: {}
|
||||
|
||||
ignore@7.0.5: {}
|
||||
@@ -4859,6 +5017,10 @@ snapshots:
|
||||
|
||||
node-releases@2.0.47: {}
|
||||
|
||||
nth-check@2.1.1:
|
||||
dependencies:
|
||||
boolbase: 1.0.0
|
||||
|
||||
object-assign@4.1.1: {}
|
||||
|
||||
object-inspect@1.13.4: {}
|
||||
@@ -4935,6 +5097,19 @@ snapshots:
|
||||
dependencies:
|
||||
callsites: 3.1.0
|
||||
|
||||
parse5-htmlparser2-tree-adapter@7.1.0:
|
||||
dependencies:
|
||||
domhandler: 5.0.3
|
||||
parse5: 7.3.0
|
||||
|
||||
parse5-parser-stream@7.1.2:
|
||||
dependencies:
|
||||
parse5: 7.3.0
|
||||
|
||||
parse5@7.3.0:
|
||||
dependencies:
|
||||
entities: 6.0.1
|
||||
|
||||
path-exists@4.0.0: {}
|
||||
|
||||
path-key@3.1.1: {}
|
||||
@@ -5046,6 +5221,8 @@ snapshots:
|
||||
es-errors: 1.3.0
|
||||
is-regex: 1.2.1
|
||||
|
||||
safer-buffer@2.1.2: {}
|
||||
|
||||
scheduler@0.27.0: {}
|
||||
|
||||
semver@6.3.1: {}
|
||||
@@ -5315,6 +5492,8 @@ snapshots:
|
||||
|
||||
undici-types@6.21.0: {}
|
||||
|
||||
undici@7.27.2: {}
|
||||
|
||||
unrs-resolver@1.12.2:
|
||||
dependencies:
|
||||
napi-postinstall: 0.3.4
|
||||
@@ -5354,6 +5533,12 @@ snapshots:
|
||||
|
||||
urlpattern-polyfill@10.1.0: {}
|
||||
|
||||
whatwg-encoding@3.1.1:
|
||||
dependencies:
|
||||
iconv-lite: 0.6.3
|
||||
|
||||
whatwg-mimetype@4.0.0: {}
|
||||
|
||||
which-boxed-primitive@1.1.1:
|
||||
dependencies:
|
||||
is-bigint: 1.1.0
|
||||
|
||||
@@ -0,0 +1,549 @@
|
||||
import { load } from 'cheerio'
|
||||
import type { CheerioAPI } from 'cheerio'
|
||||
import type { Cheerio } from 'cheerio'
|
||||
import type { Element } from 'domhandler'
|
||||
import { mkdirSync, writeFileSync } from 'fs'
|
||||
import path from 'path'
|
||||
import { fileURLToPath } from 'url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const DATA_DIR = path.join(__dirname, '../app/data/openfootball')
|
||||
|
||||
const YEARS = [
|
||||
1930,1934,1938,1950,1954,1958,1962,1966,1970,1974,
|
||||
1978,1982,1986,1990,1994,1998,2002,2006,2010,2014,2018,2022,
|
||||
]
|
||||
|
||||
const delay = (ms: number) => new Promise(r => setTimeout(r, ms))
|
||||
|
||||
// ── Types ──────────────────────────────────────────────────────────────────
|
||||
|
||||
type Goal = {
|
||||
name: string
|
||||
minute?: number
|
||||
offset?: number
|
||||
penalty?: boolean
|
||||
owngoal?: boolean
|
||||
}
|
||||
|
||||
type ScoreObj = {
|
||||
ft?: [number, number]
|
||||
et?: [number, number]
|
||||
p?: [number, number]
|
||||
}
|
||||
|
||||
type Match = {
|
||||
round: string
|
||||
group?: string
|
||||
date?: string
|
||||
time?: string
|
||||
team1: string
|
||||
team2: string
|
||||
score?: ScoreObj
|
||||
goals1?: Goal[]
|
||||
goals2?: Goal[]
|
||||
ground?: string
|
||||
}
|
||||
|
||||
type Stadium = { name: string; city: string }
|
||||
type Player = { name: string; number?: number; pos?: string; date_of_birth?: string }
|
||||
type Squad = { name: string; players: Player[] }
|
||||
type Group = { name: string; teams: string[] }
|
||||
|
||||
// ── Fetch ──────────────────────────────────────────────────────────────────
|
||||
|
||||
async function fetchWikiHtml(page: string, retries = 5): Promise<string | null> {
|
||||
const url = `https://en.wikipedia.org/w/api.php?action=parse&page=${encodeURIComponent(page)}&format=json&prop=text&disabletoc=1`
|
||||
for (let attempt = 0; attempt < retries; attempt++) {
|
||||
try {
|
||||
if (attempt > 0) await delay(3000 * attempt)
|
||||
const res = await fetch(url, { headers: { 'User-Agent': 'WorldCupScraper/1.0 (github.com/worldcup)' } })
|
||||
if (!res.ok) continue
|
||||
const data = await res.json() as { parse?: { text?: { '*': string } } }
|
||||
const html = data?.parse?.text?.['*']
|
||||
if (html) return html
|
||||
} catch {
|
||||
// retry
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// ── Score parsing ──────────────────────────────────────────────────────────
|
||||
|
||||
function parseScoreText(text: string): [number, number] | null {
|
||||
const m = text.match(/(\d+)\s*[–\-]\s*(\d+)/)
|
||||
if (!m) return null
|
||||
return [parseInt(m[1]), parseInt(m[2])]
|
||||
}
|
||||
|
||||
// ── Team name extraction ───────────────────────────────────────────────────
|
||||
|
||||
function extractTeam($: CheerioAPI, $cell: Cheerio<Element>): string {
|
||||
let name = ''
|
||||
$cell.find('a').each((_, a) => {
|
||||
const $a = $(a)
|
||||
if (!$a.find('img').length && $a.text().trim()) {
|
||||
name = $a.text().trim()
|
||||
return false
|
||||
}
|
||||
})
|
||||
return name
|
||||
}
|
||||
|
||||
// ── Goal parsing ───────────────────────────────────────────────────────────
|
||||
|
||||
function parseGoals($: CheerioAPI, $td: Cheerio<Element>): Goal[] {
|
||||
const goals: Goal[] = []
|
||||
|
||||
$td.find('li').each((_, li) => {
|
||||
const $li = $(li)
|
||||
|
||||
// Player name: first <a> NOT inside .fb-goal
|
||||
let playerName = ''
|
||||
$li.find('a').each((_, a) => {
|
||||
if (!$(a).closest('.fb-goal').length) {
|
||||
const t = $(a).text().trim()
|
||||
if (t) { playerName = t; return false }
|
||||
}
|
||||
})
|
||||
if (!playerName) return
|
||||
|
||||
const $fbGoal = $li.find('.fb-goal')
|
||||
if (!$fbGoal.length) return
|
||||
|
||||
// Each direct child <span> inside .fb-goal (excluding image wrapper)
|
||||
$fbGoal.children('span').each((_, span) => {
|
||||
const $span = $(span)
|
||||
if ($span.attr('typeof')) return // image wrapper
|
||||
|
||||
const text = $span.text()
|
||||
const minMatch = text.match(/(\d+)(?:\+(\d+))?['′]/)
|
||||
if (!minMatch) return
|
||||
|
||||
const minute = parseInt(minMatch[1])
|
||||
const offset = minMatch[2] ? parseInt(minMatch[2]) : 0
|
||||
const isPen = text.includes('pen.')
|
||||
const isOG = text.includes('o.g.')
|
||||
|
||||
const goal: Goal = { name: playerName }
|
||||
if (!isNaN(minute)) goal.minute = minute
|
||||
if (offset) goal.offset = offset
|
||||
if (isPen) goal.penalty = true
|
||||
if (isOG) goal.owngoal = true
|
||||
goals.push(goal)
|
||||
})
|
||||
})
|
||||
|
||||
return goals
|
||||
}
|
||||
|
||||
// ── Ground extraction ──────────────────────────────────────────────────────
|
||||
|
||||
function extractGround($: CheerioAPI, $box: Cheerio<Element>): string {
|
||||
const $loc = $box.find('[itemprop="name address"]').first()
|
||||
if ($loc.length) return $loc.text().trim()
|
||||
return $box.find('.fright').first().text().split('\n')[0].trim()
|
||||
}
|
||||
|
||||
function parseGroundParts(ground: string): { name: string; city: string } {
|
||||
const commaIdx = ground.indexOf(',')
|
||||
if (commaIdx !== -1) {
|
||||
return {
|
||||
name: ground.slice(0, commaIdx).trim(),
|
||||
city: ground.slice(commaIdx + 1).trim(),
|
||||
}
|
||||
}
|
||||
return { name: ground, city: '' }
|
||||
}
|
||||
|
||||
// ── Footballbox parsing ────────────────────────────────────────────────────
|
||||
|
||||
function parseBox(
|
||||
$: CheerioAPI,
|
||||
$box: Cheerio<Element>,
|
||||
round: string,
|
||||
group: string | null,
|
||||
): Match | null {
|
||||
const team1 = extractTeam($, $box.find('.fhome'))
|
||||
const team2 = extractTeam($, $box.find('.faway'))
|
||||
if (!team1 || !team2) return null
|
||||
|
||||
const dateStr = $box.find('.bday, .dtstart').first().text().trim() || undefined
|
||||
|
||||
const timeText = $box.find('.ftime').first().text().trim()
|
||||
const timeMatch = timeText.match(/(\d{2}:\d{2})/)
|
||||
const timeStr = timeMatch?.[1]
|
||||
|
||||
const scoreText = $box.find('.fscore').first().text().trim()
|
||||
const hasAET = scoreText.toLowerCase().includes('a.e.t.')
|
||||
const scoreArr = parseScoreText(scoreText)
|
||||
|
||||
// Use first fgoals row only (exclude penalty shootout row)
|
||||
const $regularRow = $box.find('tr.fgoals').first()
|
||||
const goals1 = parseGoals($, $regularRow.find('.fhgoal'))
|
||||
const goals2 = parseGoals($, $regularRow.find('.fagoal'))
|
||||
|
||||
// Penalty shootout score: row after "Penalties" header tr
|
||||
let penScore: [number, number] | undefined
|
||||
$box.find('tr').each((_, tr) => {
|
||||
const $tr = $(tr)
|
||||
if ($tr.find('th[colspan]').text().toLowerCase().includes('penalt')) {
|
||||
const penText = $tr.next('tr').find('th').not('.fhome,.faway').first().text().trim()
|
||||
const ps = parseScoreText(penText)
|
||||
if (ps) penScore = ps
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
||||
let score: ScoreObj | undefined
|
||||
if (scoreArr) {
|
||||
if (hasAET) {
|
||||
// scoreArr is ET total; compute FT from goals in ≤90 min
|
||||
const ftGoals = (gs: Goal[], includeOG = false) =>
|
||||
gs.filter(g => {
|
||||
const w90 = g.minute === undefined || g.minute <= 90
|
||||
return includeOG ? g.owngoal === true && w90 : !g.owngoal && w90
|
||||
}).length
|
||||
const ftHome = ftGoals(goals1) + ftGoals(goals2, true)
|
||||
const ftAway = ftGoals(goals2) + ftGoals(goals1, true)
|
||||
score = { ft: [ftHome, ftAway], et: scoreArr }
|
||||
} else {
|
||||
score = { ft: scoreArr }
|
||||
}
|
||||
if (penScore) score.p = penScore
|
||||
}
|
||||
|
||||
const ground = extractGround($, $box) || undefined
|
||||
|
||||
return {
|
||||
round,
|
||||
...(group ? { group } : {}),
|
||||
...(dateStr ? { date: dateStr } : {}),
|
||||
...(timeStr ? { time: timeStr } : {}),
|
||||
team1,
|
||||
team2,
|
||||
...(score ? { score } : {}),
|
||||
...(goals1.length ? { goals1 } : {}),
|
||||
...(goals2.length ? { goals2 } : {}),
|
||||
...(ground ? { ground } : {}),
|
||||
}
|
||||
}
|
||||
|
||||
// ── Collect matches from a pre-loaded page ─────────────────────────────────
|
||||
|
||||
function collectBoxes(
|
||||
$: CheerioAPI,
|
||||
round: string,
|
||||
group: string | null,
|
||||
): Match[] {
|
||||
const matches: Match[] = []
|
||||
$('.footballbox').each((_, el) => {
|
||||
const m = parseBox($, $(el), round, group)
|
||||
if (m) matches.push(m)
|
||||
})
|
||||
return matches
|
||||
}
|
||||
|
||||
// ── Section heading state machine ──────────────────────────────────────────
|
||||
|
||||
type State = {
|
||||
active: boolean
|
||||
round: string
|
||||
group: string | null
|
||||
}
|
||||
|
||||
function processHeading(text: string, level: number, state: State): void {
|
||||
const t = text.toLowerCase().trim()
|
||||
|
||||
if (level === 2) {
|
||||
if (/group stage/i.test(t) && !/second/i.test(t)) {
|
||||
state.active = true; state.round = 'Group stage'; state.group = null
|
||||
} else if (/first group stage/i.test(t)) {
|
||||
state.active = true; state.round = 'Group stage'; state.group = null
|
||||
} else if (/second group stage/i.test(t)) {
|
||||
state.active = true; state.round = 'Second group stage'; state.group = null
|
||||
} else if (t === 'final round') {
|
||||
state.active = true; state.round = 'Final round'; state.group = null
|
||||
} else if (/final tournament/i.test(t)) {
|
||||
state.active = true; state.round = ''; state.group = null
|
||||
} else if (/knock.?out stage/i.test(t)) {
|
||||
state.active = true; state.round = ''; state.group = null
|
||||
} else if (/round of 16/i.test(t)) {
|
||||
state.active = true; state.round = 'Round of 16'; state.group = null
|
||||
} else if (/quarter.final/i.test(t)) {
|
||||
state.active = true; state.round = 'Quarter-finals'; state.group = null
|
||||
} else if (/semi.final/i.test(t)) {
|
||||
state.active = true; state.round = 'Semi-finals'; state.group = null
|
||||
} else if (/third.place|match for third|play.off for third/i.test(t)) {
|
||||
state.active = true; state.round = 'Third-place match'; state.group = null
|
||||
} else if (t === 'final') {
|
||||
state.active = true; state.round = 'Final'; state.group = null
|
||||
} else {
|
||||
state.active = false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (!state.active) return
|
||||
|
||||
if (level === 3 || level === 4) {
|
||||
if (/^group [a-h1-9]+$/i.test(t)) {
|
||||
state.group = text.trim()
|
||||
} else if (/round of 32/i.test(t)) {
|
||||
state.round = 'Round of 32'; state.group = null
|
||||
} else if (/round of 16/i.test(t)) {
|
||||
state.round = 'Round of 16'; state.group = null
|
||||
} else if (/quarter.final/i.test(t)) {
|
||||
state.round = 'Quarter-finals'; state.group = null
|
||||
} else if (/semi.final/i.test(t)) {
|
||||
state.round = 'Semi-finals'; state.group = null
|
||||
} else if (/third.place|match for third|play.off for third/i.test(t)) {
|
||||
state.round = 'Third-place match'; state.group = null
|
||||
} else if (t === 'final') {
|
||||
state.round = 'Final'; state.group = null
|
||||
}
|
||||
// bracket, draw, seeding, replay → keep current state
|
||||
}
|
||||
}
|
||||
|
||||
// ── Main year scraper ──────────────────────────────────────────────────────
|
||||
|
||||
type YearResult = {
|
||||
matches: Match[]
|
||||
stadiums: Map<string, Stadium>
|
||||
groups: Map<string, Set<string>>
|
||||
}
|
||||
|
||||
async function scrapeYear(year: number, mainHtml: string): Promise<YearResult> {
|
||||
const $ = load(mainHtml)
|
||||
const matches: Match[] = []
|
||||
const stadiums = new Map<string, Stadium>()
|
||||
const groups = new Map<string, Set<string>>()
|
||||
|
||||
const state: State = { active: false, round: '', group: null }
|
||||
|
||||
// Maps group name → sub-page to fetch (if main page has no matches for that group)
|
||||
const groupSubpages = new Map<string, string>()
|
||||
// Groups that got at least one match from the main page
|
||||
const groupsOnMainPage = new Set<string>()
|
||||
|
||||
function recordMatch(m: Match) {
|
||||
matches.push(m)
|
||||
if (m.group) groupsOnMainPage.add(m.group)
|
||||
if (m.ground) {
|
||||
const { name, city } = parseGroundParts(m.ground)
|
||||
if (name && !stadiums.has(name)) stadiums.set(name, { name, city })
|
||||
}
|
||||
if (m.group) {
|
||||
if (!groups.has(m.group)) groups.set(m.group, new Set())
|
||||
groups.get(m.group)!.add(m.team1)
|
||||
groups.get(m.group)!.add(m.team2)
|
||||
}
|
||||
}
|
||||
|
||||
// Walk elements in document order: headings, hatnotes, footballboxes
|
||||
$('.mw-parser-output').find('div.mw-heading, .footballbox, .hatnote').each((_, el) => {
|
||||
const $el = $(el)
|
||||
|
||||
if ($el.hasClass('mw-heading')) {
|
||||
const $h = $el.find('h2, h3, h4').first()
|
||||
const level = parseInt($h.prop('tagName')?.slice(1) ?? '9')
|
||||
const text = $h.text().replace(/\[edit\]/g, '').trim()
|
||||
processHeading(text, level, state)
|
||||
|
||||
} else if ($el.hasClass('hatnote') && $el.text().includes('Main article')) {
|
||||
// Record sub-page link for current group context (for fallback if no main-page matches)
|
||||
if (state.active && state.group) {
|
||||
const link = $el.find('a[href^="/wiki/"]').first().attr('href')
|
||||
if (link) {
|
||||
const page = link.replace('/wiki/', '').split('#')[0]
|
||||
if (/World_Cup_Group/i.test(page) && !groupSubpages.has(state.group)) {
|
||||
groupSubpages.set(state.group, page)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if ($el.hasClass('footballbox')) {
|
||||
if (!state.active) return
|
||||
const round = state.round || state.group || 'Unknown'
|
||||
const m = parseBox($, $el, round, state.group)
|
||||
if (m) recordMatch(m)
|
||||
}
|
||||
})
|
||||
|
||||
// Fetch group sub-pages for any group that got 0 matches from main page
|
||||
for (const [group, page] of groupSubpages) {
|
||||
if (groupsOnMainPage.has(group)) continue
|
||||
|
||||
await delay(1200)
|
||||
const subHtml = await fetchWikiHtml(page)
|
||||
if (!subHtml) { process.stdout.write(`(failed: ${page}) `); continue }
|
||||
|
||||
// Determine the round for this group from the state machine result
|
||||
// (we'll reconstruct from the main-page walk state — use the round that was active when this group was seen)
|
||||
// Since we can't easily recover state here, we re-walk to find the round for this group
|
||||
let round = 'Group stage'
|
||||
let foundGroup = false
|
||||
const stateTemp: State = { active: false, round: '', group: null }
|
||||
$('.mw-parser-output').find('div.mw-heading').each((_, el) => {
|
||||
const $h = $(el).find('h2, h3, h4').first()
|
||||
const level = parseInt($h.prop('tagName')?.slice(1) ?? '9')
|
||||
const text = $h.text().replace(/\[edit\]/g, '').trim()
|
||||
processHeading(text, level, stateTemp)
|
||||
if (stateTemp.group === group) {
|
||||
round = stateTemp.round || 'Group stage'
|
||||
foundGroup = true
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
||||
const $sub = load(subHtml)
|
||||
const subMatches = collectBoxes($sub, round || 'Group stage', group)
|
||||
for (const m of subMatches) {
|
||||
recordMatch(m)
|
||||
}
|
||||
process.stdout.write(`[+${page.slice(-8)}] `)
|
||||
}
|
||||
|
||||
return { matches, stadiums, groups }
|
||||
}
|
||||
|
||||
// ── Squad page scraper ─────────────────────────────────────────────────────
|
||||
|
||||
function scrapeSquads(html: string): Squad[] {
|
||||
const $ = load(html)
|
||||
const squads: Squad[] = []
|
||||
let currentTeam: Squad | null = null
|
||||
|
||||
$('.mw-parser-output').find('div.mw-heading, tr.nat-fs-player').each((_, el) => {
|
||||
const $el = $(el)
|
||||
|
||||
if ($el.hasClass('mw-heading')) {
|
||||
const $h = $el.find('h3, h4').first()
|
||||
if (!$h.length) return
|
||||
const level = parseInt($h.prop('tagName')?.slice(1) ?? '9')
|
||||
if (level !== 3) return
|
||||
const name = $h.text().replace(/\[edit\]/g, '').trim()
|
||||
if (/^group /i.test(name)) return // skip group headers
|
||||
currentTeam = { name, players: [] }
|
||||
squads.push(currentTeam)
|
||||
return
|
||||
}
|
||||
|
||||
if (!currentTeam) return
|
||||
|
||||
let number: number | undefined
|
||||
let pos: string | undefined
|
||||
let playerName = ''
|
||||
let dob: string | undefined
|
||||
|
||||
$el.find('td, th[scope="row"]').each((i, td) => {
|
||||
const $td = $(td)
|
||||
const text = $td.text().trim()
|
||||
|
||||
if ($td.is('th[scope="row"]')) {
|
||||
playerName = $td.find('a').first().text().trim() || text
|
||||
} else if (i === 0 && !playerName) {
|
||||
const n = parseInt(text)
|
||||
if (!isNaN(n)) number = n
|
||||
} else if (i === 1 && !playerName && !pos) {
|
||||
const posLink = $td.find('a').first().text().trim()
|
||||
if (['GK', 'DF', 'MF', 'FW'].includes(posLink)) pos = posLink
|
||||
}
|
||||
|
||||
const $bday = $td.find('.bday')
|
||||
if ($bday.length) dob = $bday.text().trim()
|
||||
})
|
||||
|
||||
if (!playerName) return
|
||||
|
||||
const player: Player = { name: playerName }
|
||||
if (number !== undefined) player.number = number
|
||||
if (pos) player.pos = pos
|
||||
if (dob) player.date_of_birth = dob
|
||||
currentTeam.players.push(player)
|
||||
})
|
||||
|
||||
return squads
|
||||
}
|
||||
|
||||
// ── Output ─────────────────────────────────────────────────────────────────
|
||||
|
||||
function writeOutput(
|
||||
year: number,
|
||||
matches: Match[],
|
||||
stadiums: Map<string, Stadium>,
|
||||
groups: Map<string, Set<string>>,
|
||||
squads: Squad[],
|
||||
): void {
|
||||
const dir = path.join(DATA_DIR, String(year))
|
||||
mkdirSync(dir, { recursive: true })
|
||||
|
||||
writeFileSync(
|
||||
path.join(dir, 'worldcup.json'),
|
||||
JSON.stringify({ matches }, null, 2),
|
||||
'utf-8',
|
||||
)
|
||||
|
||||
if (stadiums.size > 0) {
|
||||
writeFileSync(
|
||||
path.join(dir, 'worldcup.stadiums.json'),
|
||||
JSON.stringify({ stadiums: Array.from(stadiums.values()) }, null, 2),
|
||||
'utf-8',
|
||||
)
|
||||
}
|
||||
|
||||
const groupList: Group[] = []
|
||||
groups.forEach((teams, name) => {
|
||||
groupList.push({ name, teams: Array.from(teams) })
|
||||
})
|
||||
if (groupList.length > 0) {
|
||||
writeFileSync(
|
||||
path.join(dir, 'worldcup.groups.json'),
|
||||
JSON.stringify({ groups: groupList }, null, 2),
|
||||
'utf-8',
|
||||
)
|
||||
}
|
||||
|
||||
if (squads.length > 0) {
|
||||
writeFileSync(
|
||||
path.join(dir, 'worldcup.squads.json'),
|
||||
JSON.stringify(squads, null, 2),
|
||||
'utf-8',
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// ── Entry point ────────────────────────────────────────────────────────────
|
||||
|
||||
async function main() {
|
||||
const onlyYear = process.argv[2] ? parseInt(process.argv[2]) : null
|
||||
const yearsToScrape = onlyYear ? [onlyYear] : YEARS
|
||||
|
||||
console.log(`Scraping ${yearsToScrape.length} World Cup(s) from Wikipedia...`)
|
||||
|
||||
for (const year of yearsToScrape) {
|
||||
process.stdout.write(` ${year}... `)
|
||||
|
||||
const mainHtml = await fetchWikiHtml(`${year}_FIFA_World_Cup`)
|
||||
if (!mainHtml) { console.log('FAILED'); continue }
|
||||
|
||||
const { matches, stadiums, groups } = await scrapeYear(year, mainHtml)
|
||||
|
||||
await delay(600)
|
||||
|
||||
const squadHtml = await fetchWikiHtml(`${year}_FIFA_World_Cup_squads`)
|
||||
const squads = squadHtml ? scrapeSquads(squadHtml) : []
|
||||
|
||||
writeOutput(year, matches, stadiums, groups, squads)
|
||||
|
||||
console.log(`${matches.length} matches, ${stadiums.size} stadiums, ${groups.size} groups, ${squads.length} teams`)
|
||||
|
||||
await delay(600)
|
||||
}
|
||||
|
||||
console.log('\nDone! Files written to app/data/openfootball/{year}/')
|
||||
}
|
||||
|
||||
main().catch(e => { console.error(e); process.exit(1) })
|
||||
+193
-127
@@ -1,16 +1,23 @@
|
||||
import postgres from 'postgres'
|
||||
import { drizzle } from 'drizzle-orm/postgres-js'
|
||||
import { sql } from 'drizzle-orm'
|
||||
import { readFileSync } from 'fs'
|
||||
import { readFileSync, existsSync } from 'fs'
|
||||
import path from 'path'
|
||||
import { fileURLToPath } from 'url'
|
||||
import { getIso } from '../lib/iso-codes'
|
||||
|
||||
const DATABASE_URL = process.env.DATABASE_URL ?? 'postgres://wc:wc@localhost:5432/worldcup'
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const DATA_DIR = path.join(__dirname, '../app/data/kaggle')
|
||||
const DATA_DIR = path.join(__dirname, '../app/data')
|
||||
const KAGGLE_DIR = path.join(DATA_DIR, 'kaggle')
|
||||
const WC_DIR = path.join(DATA_DIR, 'openfootball')
|
||||
|
||||
// Third/fourth place not present in Kaggle world_cup.csv
|
||||
const YEARS = [
|
||||
1930,1934,1938,1950,1954,1958,1962,1966,1970,1974,
|
||||
1978,1982,1986,1990,1994,1998,2002,2006,2010,2014,2018,2022,
|
||||
]
|
||||
|
||||
// Third/fourth place not reliably in source data for older years
|
||||
const PLACEMENTS: Record<number, { third?: string; fourth?: string }> = {
|
||||
1930: { third: 'USA', fourth: 'Yugoslavia' },
|
||||
1934: { third: 'Germany', fourth: 'Austria' },
|
||||
@@ -35,7 +42,7 @@ const PLACEMENTS: Record<number, { third?: string; fourth?: string }> = {
|
||||
2022: { third: 'Croatia', fourth: 'Morocco' },
|
||||
}
|
||||
|
||||
// Normalize Kaggle team names to match openfootball / our canonical names
|
||||
// Normalize team names from Wikipedia to canonical DB names
|
||||
const TEAM_ALIASES: Record<string, string> = {
|
||||
'West Germany': 'Germany',
|
||||
'Korea Republic': 'South Korea',
|
||||
@@ -46,7 +53,7 @@ function normTeam(name: string): string {
|
||||
return TEAM_ALIASES[name] ?? name
|
||||
}
|
||||
|
||||
// Minimal RFC-4180 CSV parser — no external dependency needed
|
||||
// Minimal RFC-4180 CSV parser
|
||||
function parseCsv(content: string): Record<string, string>[] {
|
||||
const rows: string[][] = []
|
||||
let row: string[] = []
|
||||
@@ -78,38 +85,36 @@ function parseCsv(content: string): Record<string, string>[] {
|
||||
.map(r => Object.fromEntries(headers.map((h, i) => [h.trim(), (r[i] ?? '').trim()])))
|
||||
}
|
||||
|
||||
type GoalEntry = { name: string; minute: number | null; offset: number; isPenalty: boolean; isOwnGoal: boolean }
|
||||
|
||||
// Parse "Player Name · 57" or "Player (OG) · 90+3" → GoalEntry
|
||||
function parseGoalStr(entry: string, isPenalty = false, isOwnGoal = false): GoalEntry | null {
|
||||
const dot = entry.lastIndexOf('·')
|
||||
if (dot === -1) return null
|
||||
const name = entry.slice(0, dot).trim()
|
||||
.replace(/\s*\(P\)\s*$/, '').replace(/\s*\(OG\)\s*$/, '').trim()
|
||||
if (!name) return null
|
||||
const minRaw = entry.slice(dot + 1).trim()
|
||||
const plusIdx = minRaw.indexOf('+')
|
||||
let minute: number | null, offset = 0
|
||||
if (plusIdx !== -1) {
|
||||
minute = parseInt(minRaw.slice(0, plusIdx))
|
||||
offset = parseInt(minRaw.slice(plusIdx + 1)) || 0
|
||||
} else {
|
||||
const m = parseInt(minRaw)
|
||||
minute = isNaN(m) ? null : m
|
||||
}
|
||||
return { name, minute, offset, isPenalty, isOwnGoal }
|
||||
function readJson<T>(filePath: string): T | null {
|
||||
if (!existsSync(filePath)) return null
|
||||
try { return JSON.parse(readFileSync(filePath, 'utf-8')) as T } catch { return null }
|
||||
}
|
||||
|
||||
function parseGoalCol(col: string, isPenalty = false, isOwnGoal = false): GoalEntry[] {
|
||||
if (!col?.trim()) return []
|
||||
return col.split('|').map(e => parseGoalStr(e.trim(), isPenalty, isOwnGoal)).filter(Boolean) as GoalEntry[]
|
||||
// ── Types matching scrape-wikipedia.ts output ──────────────────────────────
|
||||
|
||||
type RawGoal = { name: string; minute?: string | number; offset?: number; penalty?: boolean; owngoal?: boolean }
|
||||
type RawScore = { ft?: number[]; ht?: number[]; et?: number[]; p?: number[] }
|
||||
type RawMatch = {
|
||||
round?: string; date?: string; time?: string;
|
||||
team1: string; team2: string; score?: RawScore;
|
||||
goals1?: RawGoal[]; goals2?: RawGoal[];
|
||||
group?: string; ground?: string;
|
||||
}
|
||||
type RawData = { matches: RawMatch[] }
|
||||
type RawStadiums = { stadiums: { name: string; city: string; cc?: string; capacity?: number; timezone?: string; coords?: string }[] }
|
||||
type RawSquad = { name: string; players: { name: string; number?: number; pos?: string; date_of_birth?: string }[] }
|
||||
|
||||
function parseScore(score: RawScore | undefined) {
|
||||
if (!score) return {}
|
||||
if (Array.isArray(score)) return { ft: score as number[] }
|
||||
return { ft: score.ft, ht: score.ht, et: score.et, p: score.p }
|
||||
}
|
||||
|
||||
async function run() {
|
||||
const client = postgres(DATABASE_URL, { max: 5 })
|
||||
const db = drizzle(client)
|
||||
|
||||
// Create tables (mirrors sync.ts DDL — runs first on a fresh DB)
|
||||
// Create tables
|
||||
await db.execute(sql`
|
||||
CREATE TABLE IF NOT EXISTS tournaments (
|
||||
year INTEGER PRIMARY KEY,
|
||||
@@ -203,7 +208,6 @@ async function run() {
|
||||
|
||||
const force = process.argv.includes('--force') || process.argv.includes('-f')
|
||||
|
||||
// Skip if already seeded (idempotency check)
|
||||
if (!force) {
|
||||
const existing = await db.execute(sql`SELECT COUNT(*)::int AS cnt FROM tournaments WHERE year < 2026`)
|
||||
if ((existing[0] as { cnt: number }).cnt > 0) {
|
||||
@@ -216,20 +220,24 @@ async function run() {
|
||||
if (force) {
|
||||
console.log('--force: clearing historical data...')
|
||||
await db.execute(sql`DELETE FROM goals WHERE match_id IN (SELECT id FROM matches WHERE tournament_year < 2026)`)
|
||||
await db.execute(sql`DELETE FROM squads WHERE tournament_year < 2026`)
|
||||
await db.execute(sql`DELETE FROM group_standings WHERE tournament_year < 2026`)
|
||||
await db.execute(sql`DELETE FROM stadiums WHERE tournament_year < 2026`)
|
||||
await db.execute(sql`DELETE FROM matches WHERE tournament_year < 2026`)
|
||||
await db.execute(sql`DELETE FROM tournaments WHERE year < 2026`)
|
||||
}
|
||||
|
||||
console.log('Seeding from Kaggle data (1930–2022)...')
|
||||
console.log('Seeding historical data (1930–2022)...')
|
||||
|
||||
const teamCache = new Map<string, number>()
|
||||
|
||||
async function upsertTeam(rawName: string): Promise<number> {
|
||||
const name = normTeam(rawName)
|
||||
if (teamCache.has(name)) return teamCache.get(name)!
|
||||
const iso2 = getIso(name)
|
||||
const [row] = await db.execute(sql`
|
||||
INSERT INTO teams (name, iso2)
|
||||
VALUES (${name}, ${getIso(name) ?? null})
|
||||
VALUES (${name}, ${iso2 ?? null})
|
||||
ON CONFLICT (name) DO UPDATE SET name = EXCLUDED.name
|
||||
RETURNING id
|
||||
`)
|
||||
@@ -238,8 +246,8 @@ async function run() {
|
||||
return id
|
||||
}
|
||||
|
||||
// 1. Tournaments from world_cup.csv
|
||||
const wcRows = parseCsv(readFileSync(path.join(DATA_DIR, 'world_cup.csv'), 'utf-8'))
|
||||
// 1. Tournaments from world_cup.csv (host, winner, runner_up)
|
||||
const wcRows = parseCsv(readFileSync(path.join(KAGGLE_DIR, 'world_cup.csv'), 'utf-8'))
|
||||
for (const r of wcRows) {
|
||||
const year = parseInt(r['Year'])
|
||||
if (isNaN(year)) continue
|
||||
@@ -247,135 +255,193 @@ async function run() {
|
||||
const runnerUp = normTeam(r['Runner-Up'] || '')
|
||||
const p = PLACEMENTS[year] ?? {}
|
||||
await db.execute(sql`
|
||||
INSERT INTO tournaments (year, host, winner, runner_up, third_place, fourth_place, teams_count, matches_count)
|
||||
INSERT INTO tournaments (year, host, winner, runner_up, third_place, fourth_place, teams_count)
|
||||
VALUES (
|
||||
${year}, ${r['Host']},
|
||||
${winner || null}, ${runnerUp || null},
|
||||
${p.third ?? null}, ${p.fourth ?? null},
|
||||
${parseInt(r['Teams']) || null}, ${parseInt(r['Matches']) || null}
|
||||
${parseInt(r['Teams']) || null}
|
||||
)
|
||||
ON CONFLICT (year) DO UPDATE SET
|
||||
host = EXCLUDED.host,
|
||||
winner = EXCLUDED.winner,
|
||||
runner_up = EXCLUDED.runner_up,
|
||||
host = EXCLUDED.host,
|
||||
winner = EXCLUDED.winner,
|
||||
runner_up = EXCLUDED.runner_up,
|
||||
third_place = EXCLUDED.third_place,
|
||||
fourth_place = EXCLUDED.fourth_place,
|
||||
teams_count = EXCLUDED.teams_count,
|
||||
matches_count = EXCLUDED.matches_count
|
||||
teams_count = EXCLUDED.teams_count
|
||||
`)
|
||||
}
|
||||
|
||||
// 2. Matches + goals from matches_1930_2022.csv
|
||||
const matchRows = parseCsv(readFileSync(path.join(DATA_DIR, 'matches_1930_2022.csv'), 'utf-8'))
|
||||
// 2. Per-year match/stadium/squad data from openfootball JSON files
|
||||
let totalMatches = 0
|
||||
let totalGoals = 0
|
||||
|
||||
let totalMatches = 0, totalGoals = 0
|
||||
for (const r of matchRows) {
|
||||
const year = parseInt(r['Year'])
|
||||
if (isNaN(year)) continue
|
||||
|
||||
const t1Id = await upsertTeam(r['home_team'])
|
||||
const t2Id = await upsertTeam(r['away_team'])
|
||||
|
||||
const homeScore = r['home_score'] !== '' ? parseInt(r['home_score']) : null
|
||||
const awayScore = r['away_score'] !== '' ? parseInt(r['away_score']) : null
|
||||
const homePen = r['home_penalty'] !== '' ? parseInt(r['home_penalty']) : null
|
||||
const awayPen = r['away_penalty'] !== '' ? parseInt(r['away_penalty']) : null
|
||||
const dateStr = r['Date'] || null
|
||||
|
||||
// Parse all goal columns
|
||||
const homeGoals = parseGoalCol(r['home_goal'])
|
||||
const awayGoals = parseGoalCol(r['away_goal'])
|
||||
const homePenGoals = parseGoalCol(r['home_penalty_goal'], true)
|
||||
const awayPenGoals = parseGoalCol(r['away_penalty_goal'], true)
|
||||
// home_own_goal = home player scored OG → goal credited to AWAY team
|
||||
const homeOgGoals = parseGoalCol(r['home_own_goal'], false, true)
|
||||
// away_own_goal = away player scored OG → goal credited to HOME team
|
||||
const awayOgGoals = parseGoalCol(r['away_own_goal'], false, true)
|
||||
|
||||
// Determine FT vs ET score split from goal minutes
|
||||
const allGoals = [...homeGoals, ...awayGoals, ...homePenGoals, ...awayPenGoals]
|
||||
const hasEt = allGoals.some(g => g.minute !== null && g.minute > 90)
|
||||
|
||||
let scoreFtHome: number | null, scoreFtAway: number | null
|
||||
let scoreEtHome: number | null = null, scoreEtAway: number | null = null
|
||||
|
||||
if (hasEt) {
|
||||
// Compute FT from goals in minutes 1–90
|
||||
const ftGoalCount = (goals: GoalEntry[]) =>
|
||||
goals.filter(g => g.minute === null || g.minute <= 90).length
|
||||
scoreFtHome = ftGoalCount(homeGoals) + ftGoalCount(homePenGoals) + ftGoalCount(awayOgGoals)
|
||||
scoreFtAway = ftGoalCount(awayGoals) + ftGoalCount(awayPenGoals) + ftGoalCount(homeOgGoals)
|
||||
scoreEtHome = homeScore
|
||||
scoreEtAway = awayScore
|
||||
} else {
|
||||
scoreFtHome = homeScore
|
||||
scoreFtAway = awayScore
|
||||
for (const year of YEARS) {
|
||||
const yearDir = path.join(WC_DIR, String(year))
|
||||
const mainData = readJson<RawData>(path.join(yearDir, 'worldcup.json'))
|
||||
if (!mainData?.matches) {
|
||||
console.log(` ${year}: no data file, skipping`)
|
||||
continue
|
||||
}
|
||||
|
||||
const [matchRow] = await db.execute(sql`
|
||||
INSERT INTO matches (
|
||||
tournament_year, round, date, team1_id, team2_id,
|
||||
score_ft_home, score_ft_away, score_et_home, score_et_away,
|
||||
score_p_home, score_p_away, is_quali_playoff
|
||||
) VALUES (
|
||||
${year}, ${r['Round'] || 'Unknown'}, ${dateStr},
|
||||
${t1Id}, ${t2Id},
|
||||
${scoreFtHome}, ${scoreFtAway}, ${scoreEtHome}, ${scoreEtAway},
|
||||
${homePen}, ${awayPen}, false
|
||||
)
|
||||
ON CONFLICT (tournament_year, team1_id, team2_id, date, is_quali_playoff) DO UPDATE SET
|
||||
round = EXCLUDED.round,
|
||||
score_ft_home = EXCLUDED.score_ft_home,
|
||||
score_ft_away = EXCLUDED.score_ft_away,
|
||||
score_et_home = EXCLUDED.score_et_home,
|
||||
score_et_away = EXCLUDED.score_et_away,
|
||||
score_p_home = EXCLUDED.score_p_home,
|
||||
score_p_away = EXCLUDED.score_p_away
|
||||
RETURNING id
|
||||
`)
|
||||
const matchId = (matchRow as { id: number }).id
|
||||
let matchCount = 0, goalCount = 0
|
||||
|
||||
await db.execute(sql`DELETE FROM goals WHERE match_id = ${matchId}`)
|
||||
// Stadiums
|
||||
const stadiumsData = readJson<RawStadiums>(path.join(yearDir, 'worldcup.stadiums.json'))
|
||||
if (stadiumsData?.stadiums) {
|
||||
for (const s of stadiumsData.stadiums) {
|
||||
await db.execute(sql`
|
||||
INSERT INTO stadiums (tournament_year, name, city)
|
||||
VALUES (${year}, ${s.name}, ${s.city ?? null})
|
||||
ON CONFLICT DO NOTHING
|
||||
`)
|
||||
}
|
||||
}
|
||||
|
||||
// home team goals (+ away player own goals that benefit home)
|
||||
for (const g of [...homeGoals, ...homePenGoals, ...awayOgGoals]) {
|
||||
await db.execute(sql`
|
||||
INSERT INTO goals (match_id, team_id, player_name, minute, minute_offset, is_penalty, is_own_goal)
|
||||
VALUES (${matchId}, ${t1Id}, ${g.name}, ${g.minute}, ${g.offset}, ${g.isPenalty}, ${g.isOwnGoal})
|
||||
// Matches and goals
|
||||
for (const m of mainData.matches) {
|
||||
const t1Id = await upsertTeam(m.team1)
|
||||
const t2Id = await upsertTeam(m.team2)
|
||||
const score = parseScore(m.score)
|
||||
|
||||
const [matchRow] = await db.execute(sql`
|
||||
INSERT INTO matches (
|
||||
tournament_year, round, group_name, date, time_local,
|
||||
team1_id, team2_id,
|
||||
score_ft_home, score_ft_away,
|
||||
score_ht_home, score_ht_away,
|
||||
score_et_home, score_et_away,
|
||||
score_p_home, score_p_away,
|
||||
is_quali_playoff
|
||||
) VALUES (
|
||||
${year}, ${m.round ?? 'Unknown'}, ${m.group ?? null},
|
||||
${m.date ?? null}, ${m.time ?? null},
|
||||
${t1Id}, ${t2Id},
|
||||
${score.ft?.[0] ?? null}, ${score.ft?.[1] ?? null},
|
||||
${score.ht?.[0] ?? null}, ${score.ht?.[1] ?? null},
|
||||
${score.et?.[0] ?? null}, ${score.et?.[1] ?? null},
|
||||
${score.p?.[0] ?? null}, ${score.p?.[1] ?? null},
|
||||
false
|
||||
)
|
||||
ON CONFLICT (tournament_year, team1_id, team2_id, date, is_quali_playoff) DO UPDATE SET
|
||||
round = EXCLUDED.round,
|
||||
group_name = COALESCE(EXCLUDED.group_name, matches.group_name),
|
||||
time_local = COALESCE(EXCLUDED.time_local, matches.time_local),
|
||||
score_ft_home = COALESCE(EXCLUDED.score_ft_home, matches.score_ft_home),
|
||||
score_ft_away = COALESCE(EXCLUDED.score_ft_away, matches.score_ft_away),
|
||||
score_ht_home = COALESCE(EXCLUDED.score_ht_home, matches.score_ht_home),
|
||||
score_ht_away = COALESCE(EXCLUDED.score_ht_away, matches.score_ht_away),
|
||||
score_et_home = COALESCE(EXCLUDED.score_et_home, matches.score_et_home),
|
||||
score_et_away = COALESCE(EXCLUDED.score_et_away, matches.score_et_away),
|
||||
score_p_home = COALESCE(EXCLUDED.score_p_home, matches.score_p_home),
|
||||
score_p_away = COALESCE(EXCLUDED.score_p_away, matches.score_p_away)
|
||||
RETURNING id
|
||||
`)
|
||||
totalGoals++
|
||||
const matchId = (matchRow as { id: number }).id
|
||||
|
||||
// Goals (delete + re-insert)
|
||||
await db.execute(sql`DELETE FROM goals WHERE match_id = ${matchId}`)
|
||||
|
||||
for (const [rawGoals, teamId, ogTeamId] of [
|
||||
[m.goals1 ?? [], t1Id, t2Id],
|
||||
[m.goals2 ?? [], t2Id, t1Id],
|
||||
] as [RawGoal[], number, number][]) {
|
||||
for (const g of rawGoals) {
|
||||
if (!g.name) continue
|
||||
const minute = g.minute != null ? parseInt(String(g.minute)) : null
|
||||
const actualTeamId = g.owngoal ? ogTeamId : teamId
|
||||
await db.execute(sql`
|
||||
INSERT INTO goals (match_id, team_id, player_name, minute, minute_offset, is_penalty, is_own_goal)
|
||||
VALUES (${matchId}, ${actualTeamId}, ${g.name}, ${!minute || isNaN(minute) ? null : minute},
|
||||
${g.offset ?? 0}, ${g.penalty ?? false}, ${g.owngoal ?? false})
|
||||
`)
|
||||
goalCount++
|
||||
}
|
||||
}
|
||||
|
||||
matchCount++
|
||||
}
|
||||
// away team goals (+ home player own goals that benefit away)
|
||||
for (const g of [...awayGoals, ...awayPenGoals, ...homeOgGoals]) {
|
||||
await db.execute(sql`
|
||||
INSERT INTO goals (match_id, team_id, player_name, minute, minute_offset, is_penalty, is_own_goal)
|
||||
VALUES (${matchId}, ${t2Id}, ${g.name}, ${g.minute}, ${g.offset}, ${g.isPenalty}, ${g.isOwnGoal})
|
||||
`)
|
||||
totalGoals++
|
||||
|
||||
// Squads
|
||||
const squadsData = readJson<RawSquad[]>(path.join(yearDir, 'worldcup.squads.json'))
|
||||
if (squadsData && Array.isArray(squadsData)) {
|
||||
for (const sq of squadsData) {
|
||||
const teamId = await upsertTeam(sq.name)
|
||||
for (const p of sq.players) {
|
||||
if (!p.name) continue
|
||||
const dob = p.date_of_birth ? p.date_of_birth.replace(/\s/g, '') : null
|
||||
await db.execute(sql`
|
||||
INSERT INTO squads (tournament_year, team_id, player_name, shirt_number, position, date_of_birth)
|
||||
VALUES (${year}, ${teamId}, ${p.name}, ${p.number ?? null},
|
||||
${p.pos ?? null}, ${dob})
|
||||
ON CONFLICT (tournament_year, team_id, shirt_number) DO UPDATE SET
|
||||
player_name = EXCLUDED.player_name,
|
||||
position = EXCLUDED.position,
|
||||
date_of_birth = EXCLUDED.date_of_birth
|
||||
`)
|
||||
}
|
||||
}
|
||||
}
|
||||
totalMatches++
|
||||
|
||||
console.log(` ${year}: ${matchCount} matches, ${goalCount} goals`)
|
||||
totalMatches += matchCount
|
||||
totalGoals += goalCount
|
||||
}
|
||||
|
||||
// 3. Update tournament aggregates
|
||||
// 3. Group standings (computed from match results)
|
||||
console.log('Computing group standings...')
|
||||
await db.execute(sql`
|
||||
DELETE FROM group_standings WHERE tournament_year < 2026
|
||||
`)
|
||||
await db.execute(sql`
|
||||
INSERT INTO group_standings (tournament_year, group_name, team_id, played, won, drawn, lost,
|
||||
goals_for, goals_against, goal_diff, pts)
|
||||
WITH match_results AS (
|
||||
SELECT tournament_year, group_name, team1_id AS team_id, score_ft_home AS gf, score_ft_away AS ga
|
||||
FROM matches WHERE tournament_year < 2026 AND group_name IS NOT NULL
|
||||
AND is_quali_playoff = false AND score_ft_home IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT tournament_year, group_name, team2_id, score_ft_away, score_ft_home
|
||||
FROM matches WHERE tournament_year < 2026 AND group_name IS NOT NULL
|
||||
AND is_quali_playoff = false AND score_ft_home IS NOT NULL
|
||||
)
|
||||
SELECT tournament_year, group_name, team_id,
|
||||
COUNT(*)::int,
|
||||
SUM(CASE WHEN gf > ga THEN 1 ELSE 0 END)::int,
|
||||
SUM(CASE WHEN gf = ga THEN 1 ELSE 0 END)::int,
|
||||
SUM(CASE WHEN gf < ga THEN 1 ELSE 0 END)::int,
|
||||
SUM(gf)::int, SUM(ga)::int, SUM(gf - ga)::int,
|
||||
SUM(CASE WHEN gf > ga THEN 3 WHEN gf = ga THEN 1 ELSE 0 END)::int
|
||||
FROM match_results
|
||||
GROUP BY tournament_year, group_name, team_id
|
||||
ON CONFLICT (tournament_year, group_name, team_id) DO UPDATE SET
|
||||
played = EXCLUDED.played, won = EXCLUDED.won, drawn = EXCLUDED.drawn,
|
||||
lost = EXCLUDED.lost, goals_for = EXCLUDED.goals_for,
|
||||
goals_against = EXCLUDED.goals_against, goal_diff = EXCLUDED.goal_diff,
|
||||
pts = EXCLUDED.pts
|
||||
`)
|
||||
|
||||
// 4. Tournament aggregates
|
||||
await db.execute(sql`
|
||||
UPDATE tournaments t SET
|
||||
matches_count = (
|
||||
SELECT COUNT(*)::int FROM matches WHERE tournament_year = t.year AND is_quali_playoff = false
|
||||
),
|
||||
total_goals = (
|
||||
SELECT COUNT(g.id)::int
|
||||
FROM goals g JOIN matches m ON g.match_id = m.id
|
||||
WHERE m.tournament_year = t.year AND m.is_quali_playoff = false
|
||||
),
|
||||
matches_count = (
|
||||
SELECT COUNT(*)::int FROM matches WHERE tournament_year = t.year AND is_quali_playoff = false
|
||||
),
|
||||
avg_goals_per_game = (
|
||||
SELECT ROUND(COUNT(g.id)::numeric / NULLIF(COUNT(DISTINCT m.id), 0), 2)
|
||||
FROM goals g JOIN matches m ON g.match_id = m.id
|
||||
WHERE m.tournament_year = t.year AND m.is_quali_playoff = false
|
||||
AND m.score_ft_home IS NOT NULL
|
||||
)
|
||||
WHERE t.year < 2026
|
||||
`)
|
||||
|
||||
console.log(`✅ Seed complete: ${totalMatches} matches, ${totalGoals} goals (1930–2022)`)
|
||||
console.log(`\n✅ Seed complete: ${totalMatches} matches, ${totalGoals} goals (1930–2022)`)
|
||||
await client.end()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user