@vixoniccom/footbal-score 1.4.6-dev.7 → 1.4.6-dev.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/build/main.js +1 -1
- package/build/main.js.LICENSE.txt +0 -7
- package/build/test/parameters.json +1 -0
- package/build/test/services.json +109 -0
- package/build.zip +0 -0
- package/configuration.json +1 -45
- package/package.json +1 -1
- package/src/App.tsx +9 -3
- package/src/components/Table/components/Results.tsx +2 -2
- package/src/components/Table/components/Row.tsx +2 -1
- package/src/components/Table/components/Time.tsx +4 -8
- package/src/components/Table/index.tsx +7 -1
- package/src/football-loader.ts +12 -1
- package/src/helpers/getFixture.ts +1 -0
- package/src/main.ts +6 -3
- package/src/test/parameters.json +1 -0
- package/src/test/services.json +109 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"services": {
|
|
3
|
+
"f7e3a1b2-c4d5-6789-abcd-ef0123456789": {
|
|
4
|
+
"id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789",
|
|
5
|
+
"data": {
|
|
6
|
+
"fixtures": [
|
|
7
|
+
{
|
|
8
|
+
"fixture": {
|
|
9
|
+
"id": 1001,
|
|
10
|
+
"date": "2026-06-22T18:00:00+00:00",
|
|
11
|
+
"status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
|
|
12
|
+
"venue": { "name": "Camp Nou", "city": "Barcelona" }
|
|
13
|
+
},
|
|
14
|
+
"league": {
|
|
15
|
+
"id": 140,
|
|
16
|
+
"name": "La Liga",
|
|
17
|
+
"country": "Spain",
|
|
18
|
+
"logo": "https://media.api-sports.io/football/leagues/140.png",
|
|
19
|
+
"round": "Regular Season - 38"
|
|
20
|
+
},
|
|
21
|
+
"teams": {
|
|
22
|
+
"home": { "id": 529, "name": "Barcelona", "logo": "https://media.api-sports.io/football/teams/529.png", "winner": true },
|
|
23
|
+
"away": { "id": 541, "name": "Real Madrid", "logo": "https://media.api-sports.io/football/teams/541.png", "winner": false }
|
|
24
|
+
},
|
|
25
|
+
"goals": { "home": 3, "away": 1 },
|
|
26
|
+
"score": {
|
|
27
|
+
"halftime": { "home": 1, "away": 0 },
|
|
28
|
+
"fulltime": { "home": 3, "away": 1 }
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"fixture": {
|
|
33
|
+
"id": 1002,
|
|
34
|
+
"date": "2026-06-22T20:45:00+00:00",
|
|
35
|
+
"status": { "long": "Second Half", "short": "2H", "elapsed": 67 },
|
|
36
|
+
"venue": { "name": "Anfield", "city": "Liverpool" }
|
|
37
|
+
},
|
|
38
|
+
"league": {
|
|
39
|
+
"id": 39,
|
|
40
|
+
"name": "Premier League",
|
|
41
|
+
"country": "England",
|
|
42
|
+
"logo": "https://media.api-sports.io/football/leagues/39.png",
|
|
43
|
+
"round": "Regular Season - 38"
|
|
44
|
+
},
|
|
45
|
+
"teams": {
|
|
46
|
+
"home": { "id": 40, "name": "Liverpool", "logo": "https://media.api-sports.io/football/teams/40.png", "winner": null },
|
|
47
|
+
"away": { "id": 42, "name": "Arsenal", "logo": "https://media.api-sports.io/football/teams/42.png", "winner": null }
|
|
48
|
+
},
|
|
49
|
+
"goals": { "home": 2, "away": 2 },
|
|
50
|
+
"score": {
|
|
51
|
+
"halftime": { "home": 1, "away": 1 },
|
|
52
|
+
"fulltime": { "home": null, "away": null }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"fixture": {
|
|
57
|
+
"id": 1003,
|
|
58
|
+
"date": "2026-06-23T19:00:00+00:00",
|
|
59
|
+
"status": { "long": "Not Started", "short": "NS", "elapsed": null },
|
|
60
|
+
"venue": { "name": "Allianz Arena", "city": "Munich" }
|
|
61
|
+
},
|
|
62
|
+
"league": {
|
|
63
|
+
"id": 78,
|
|
64
|
+
"name": "Bundesliga",
|
|
65
|
+
"country": "Germany",
|
|
66
|
+
"logo": "https://media.api-sports.io/football/leagues/78.png",
|
|
67
|
+
"round": "Regular Season - 34"
|
|
68
|
+
},
|
|
69
|
+
"teams": {
|
|
70
|
+
"home": { "id": 157, "name": "Bayern Munich", "logo": "https://media.api-sports.io/football/teams/157.png", "winner": null },
|
|
71
|
+
"away": { "id": 165, "name": "Borussia Dortmund", "logo": "https://media.api-sports.io/football/teams/165.png", "winner": null }
|
|
72
|
+
},
|
|
73
|
+
"goals": { "home": null, "away": null },
|
|
74
|
+
"score": {
|
|
75
|
+
"halftime": { "home": null, "away": null },
|
|
76
|
+
"fulltime": { "home": null, "away": null }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"fixture": {
|
|
81
|
+
"id": 1004,
|
|
82
|
+
"date": "2026-06-22T17:30:00+00:00",
|
|
83
|
+
"status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
|
|
84
|
+
"venue": { "name": "San Siro", "city": "Milan" }
|
|
85
|
+
},
|
|
86
|
+
"league": {
|
|
87
|
+
"id": 135,
|
|
88
|
+
"name": "Serie A",
|
|
89
|
+
"country": "Italy",
|
|
90
|
+
"logo": "https://media.api-sports.io/football/leagues/135.png",
|
|
91
|
+
"round": "Regular Season - 38"
|
|
92
|
+
},
|
|
93
|
+
"teams": {
|
|
94
|
+
"home": { "id": 489, "name": "AC Milan", "logo": "https://media.api-sports.io/football/teams/489.png", "winner": false },
|
|
95
|
+
"away": { "id": 505, "name": "Inter", "logo": "https://media.api-sports.io/football/teams/505.png", "winner": true }
|
|
96
|
+
},
|
|
97
|
+
"goals": { "home": 0, "away": 2 },
|
|
98
|
+
"score": {
|
|
99
|
+
"halftime": { "home": 0, "away": 1 },
|
|
100
|
+
"fulltime": { "home": 0, "away": 2 }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"updatedAt": 1750608000000,
|
|
106
|
+
"__typename": "FootballAppService"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
package/build.zip
CHANGED
|
Binary file
|
package/configuration.json
CHANGED
|
@@ -241,43 +241,7 @@
|
|
|
241
241
|
"required": true,
|
|
242
242
|
"defaultValue": "7pm"
|
|
243
243
|
},
|
|
244
|
-
|
|
245
|
-
"id": "updateTime",
|
|
246
|
-
"label": "Actualización",
|
|
247
|
-
"type": "select-input",
|
|
248
|
-
"items": [
|
|
249
|
-
{
|
|
250
|
-
"label": "5 minutos",
|
|
251
|
-
"value": 300000
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
"label": "10 minutos",
|
|
255
|
-
"value": 600000
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
"label": "30 minutos",
|
|
259
|
-
"value": 1800000
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
"label": "1 hora",
|
|
263
|
-
"value": 3600000
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
"label": "6 horas",
|
|
267
|
-
"value": 21600000
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
"label": "12 horas",
|
|
271
|
-
"value": 43200000
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
"label": "Diario",
|
|
275
|
-
"value": 86400000
|
|
276
|
-
}
|
|
277
|
-
],
|
|
278
|
-
"required": true,
|
|
279
|
-
"defaultValue": 300000
|
|
280
|
-
},
|
|
244
|
+
|
|
281
245
|
{
|
|
282
246
|
"id": "titleEnabled",
|
|
283
247
|
"label": "Título App",
|
|
@@ -342,14 +306,6 @@
|
|
|
342
306
|
"type": "number-input",
|
|
343
307
|
"range": "[1:100:]",
|
|
344
308
|
"description": "Duración por página (en segundos)"
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"id": "debugTimezone",
|
|
348
|
-
"label": "Debug Timezone",
|
|
349
|
-
"type": "switch",
|
|
350
|
-
"defaultValue": false,
|
|
351
|
-
"displayOnTrue": "Visible",
|
|
352
|
-
"displayOnFalse": "Oculto"
|
|
353
309
|
}
|
|
354
310
|
]
|
|
355
311
|
},
|
package/package.json
CHANGED
package/src/App.tsx
CHANGED
|
@@ -4,17 +4,18 @@ import { FontLoader, FormattedText, Table } from './components'
|
|
|
4
4
|
|
|
5
5
|
export type Props = {
|
|
6
6
|
appData?: VixonicData
|
|
7
|
-
start: boolean
|
|
8
7
|
fixtures: FootballFixture[]
|
|
9
8
|
serviceError?: string
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
export const App: React.FunctionComponent<Props> = ({ appData,
|
|
13
|
-
if (!appData
|
|
11
|
+
export const App: React.FunctionComponent<Props> = ({ appData, fixtures }) => {
|
|
12
|
+
if (!appData) return null
|
|
14
13
|
|
|
15
14
|
const { parameters, downloadsPath } = appData
|
|
16
15
|
const { backgroundImage, padding, msj0 = '', matchesYesterday, matchesTomorrow } = parameters
|
|
17
16
|
|
|
17
|
+
console.log('[App] fixtures received:', fixtures.length, fixtures)
|
|
18
|
+
|
|
18
19
|
const backgroundImageState = backgroundImage?.filename
|
|
19
20
|
? `url("${downloadsPath}/${backgroundImage.filename}")`
|
|
20
21
|
: ''
|
|
@@ -27,6 +28,9 @@ export const App: React.FunctionComponent<Props> = ({ appData, start, fixtures }
|
|
|
27
28
|
const yesterdayStr = moment().utcOffset(serviceUtcOffset).subtract(1, 'days').format('YYYY-MM-DD')
|
|
28
29
|
const tomorrowStr = moment().utcOffset(serviceUtcOffset).add(1, 'days').format('YYYY-MM-DD')
|
|
29
30
|
|
|
31
|
+
console.log('[App] date context — today:', today, 'yesterday:', yesterdayStr, 'tomorrow:', tomorrowStr, 'utcOffset:', serviceUtcOffset)
|
|
32
|
+
console.log('[App] filter config — matchesYesterday:', matchesYesterday, 'matchesTomorrow:', matchesTomorrow)
|
|
33
|
+
|
|
30
34
|
const filteredFixtures = fixtures.filter(f => {
|
|
31
35
|
const fixtureDate = moment.parseZone(f.fixture.date).format('YYYY-MM-DD')
|
|
32
36
|
if (fixtureDate === today) return true
|
|
@@ -35,6 +39,8 @@ export const App: React.FunctionComponent<Props> = ({ appData, start, fixtures }
|
|
|
35
39
|
return false
|
|
36
40
|
})
|
|
37
41
|
|
|
42
|
+
console.log('[App] filteredFixtures count:', filteredFixtures.length)
|
|
43
|
+
|
|
38
44
|
return (
|
|
39
45
|
<>
|
|
40
46
|
{filteredFixtures.length > 0 ?
|
|
@@ -11,11 +11,11 @@ interface Props {
|
|
|
11
11
|
export const Results: React.FunctionComponent<Props> = ({ parameters, goals, score }) => {
|
|
12
12
|
return (
|
|
13
13
|
<div style={{ display: 'flex', justifyContent: 'center' }}>
|
|
14
|
-
{isNumber(score.penalty
|
|
14
|
+
{isNumber(score.penalty?.home) ? <FormattedText text={`(${score.penalty.home})`} format={parameters.goalsFormat} /> : ''}
|
|
15
15
|
<FormattedText text={goals.home ? goals.home : 0} format={parameters.goalsFormat} />
|
|
16
16
|
<FormattedText text={'-'} format={parameters.goalsFormat} />
|
|
17
17
|
<FormattedText text={goals.away ? goals.away : 0} format={parameters.goalsFormat} />
|
|
18
|
-
{isNumber(score.penalty
|
|
18
|
+
{isNumber(score.penalty?.away) ? <FormattedText text={`(${score.penalty.away})`} format={parameters.goalsFormat} /> : ''}
|
|
19
19
|
</div>
|
|
20
20
|
)
|
|
21
21
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import moment from 'moment'
|
|
1
2
|
import React, { useEffect, useState } from 'react'
|
|
2
3
|
import { Results, Status, Time } from './'
|
|
3
4
|
import { FormattedText } from '../../'
|
|
@@ -71,7 +72,7 @@ export const Row: React.FunctionComponent<Props> = ({ item, parameters }) => {
|
|
|
71
72
|
justifyContent: 'center'
|
|
72
73
|
}}>
|
|
73
74
|
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
74
|
-
<Time time={
|
|
75
|
+
<Time time={moment.parseZone(fixture.date).unix()} utcOffset={moment.parseZone(fixture.date).utcOffset()} parameters={parameters} />
|
|
75
76
|
</div>
|
|
76
77
|
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
77
78
|
<Status status={fixture.status.short} parameters={parameters} />
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import moment from 'moment'
|
|
2
2
|
import React from 'react'
|
|
3
3
|
import { FormattedText } from '../../'
|
|
4
|
-
import { resolvedTimezone } from '../../../helpers/getFixture'
|
|
5
4
|
|
|
6
5
|
interface Props {
|
|
7
6
|
time: number
|
|
7
|
+
utcOffset: number
|
|
8
8
|
parameters: VixonicParameters
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
const
|
|
12
|
-
const offset = MEXICO_TIMEZONES.includes(resolvedTimezone) ? -3600 : 0
|
|
13
|
-
|
|
14
|
-
export const Time: React.FunctionComponent<Props> = ({ time, parameters }) => {
|
|
15
|
-
const adjusted = time + offset
|
|
11
|
+
export const Time: React.FunctionComponent<Props> = ({ time, utcOffset, parameters }) => {
|
|
16
12
|
return (
|
|
17
13
|
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>
|
|
18
|
-
<FormattedText text={moment.unix(
|
|
19
|
-
<FormattedText text={moment.unix(
|
|
14
|
+
<FormattedText text={moment.unix(time).utcOffset(utcOffset).format('DD-MM')} format={parameters.timeFormat} />
|
|
15
|
+
<FormattedText text={moment.unix(time).utcOffset(utcOffset).format('h:mm a')} format={parameters.timeFormat} />
|
|
20
16
|
</div>
|
|
21
17
|
)
|
|
22
18
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import moment from 'moment'
|
|
1
2
|
import React, { useEffect, useState } from 'react'
|
|
2
3
|
import { Row } from './components'
|
|
3
4
|
|
|
@@ -9,11 +10,16 @@ type Props = {
|
|
|
9
10
|
export const Table: React.FunctionComponent<Props> = ({ dataFixture, parameters }) => {
|
|
10
11
|
const { itemsPerPage, durationPerPage } = parameters
|
|
11
12
|
const rows = Number(itemsPerPage || 4)
|
|
12
|
-
const orderedData = dataFixture.sort((a, b) => a.fixture.
|
|
13
|
+
const orderedData = dataFixture.sort((a, b) => moment.parseZone(a.fixture.date).unix() - moment.parseZone(b.fixture.date).unix())
|
|
13
14
|
const [page, setPage] = useState<number>(1)
|
|
14
15
|
const [items, setItems] = useState<string[][]>(orderedData.slice(0, rows))
|
|
15
16
|
const total = orderedData.length
|
|
16
17
|
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setPage(1)
|
|
20
|
+
setItems(orderedData.slice(0, rows))
|
|
21
|
+
}, [dataFixture])
|
|
22
|
+
|
|
17
23
|
useEffect(() => {
|
|
18
24
|
const timer = setTimeout(() => {
|
|
19
25
|
handlePagination()
|
package/src/football-loader.ts
CHANGED
|
@@ -4,10 +4,21 @@ export class FootballLoader {
|
|
|
4
4
|
|
|
5
5
|
update(appData: VixonicData) {
|
|
6
6
|
const serviceId = appData.parameters.footballService?.id
|
|
7
|
-
|
|
7
|
+
console.log('[FootballLoader] serviceId:', serviceId)
|
|
8
|
+
|
|
9
|
+
if (!serviceId || !appData.services[serviceId]) {
|
|
10
|
+
console.log('[FootballLoader] service not found in appData.services. Available keys:', Object.keys(appData.services))
|
|
11
|
+
return
|
|
12
|
+
}
|
|
8
13
|
|
|
9
14
|
const rawData = appData.services[serviceId].data as FootballServiceData | undefined
|
|
15
|
+
console.log('[FootballLoader] rawData:', JSON.stringify(rawData, null, 2))
|
|
16
|
+
|
|
10
17
|
const fixtures = rawData?.fixtures ?? []
|
|
18
|
+
console.log('[FootballLoader] fixtures count:', fixtures.length)
|
|
19
|
+
if (fixtures.length > 0) {
|
|
20
|
+
console.log('[FootballLoader] first fixture:', JSON.stringify(fixtures[0], null, 2))
|
|
21
|
+
}
|
|
11
22
|
|
|
12
23
|
this.onData?.(fixtures)
|
|
13
24
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const resolvedTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
package/src/main.ts
CHANGED
|
@@ -4,7 +4,6 @@ import { App } from './App'
|
|
|
4
4
|
import { FootballLoader } from './football-loader'
|
|
5
5
|
const { ipcRenderer } = require('electron')
|
|
6
6
|
|
|
7
|
-
let start: boolean = false
|
|
8
7
|
let appData: VixonicData | undefined = undefined
|
|
9
8
|
let fixtures: FootballFixture[] = []
|
|
10
9
|
let serviceError: string | undefined = undefined
|
|
@@ -22,19 +21,23 @@ footballLoader.onError = (error) => {
|
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
ipcRenderer.on('preload', (_event: any, data: VixonicData) => {
|
|
24
|
+
console.log('[main] preload received. parameters:', JSON.stringify(data.parameters, null, 2))
|
|
25
|
+
console.log('[main] preload services keys:', Object.keys(data.services))
|
|
25
26
|
appData = data
|
|
26
27
|
footballLoader.update(data)
|
|
27
28
|
render()
|
|
28
29
|
})
|
|
29
30
|
|
|
30
31
|
ipcRenderer.on('start', (_event: any, data: VixonicData) => {
|
|
32
|
+
console.log('[main] start received. parameters:', JSON.stringify(data.parameters, null, 2))
|
|
33
|
+
console.log('[main] start services keys:', Object.keys(data.services))
|
|
31
34
|
appData = data
|
|
32
35
|
footballLoader.update(data)
|
|
33
|
-
start = true
|
|
34
36
|
render()
|
|
35
37
|
})
|
|
36
38
|
|
|
37
39
|
ipcRenderer.on('update', (_event: any, data: VixonicData) => {
|
|
40
|
+
console.log('[main] update received. services keys:', Object.keys(data.services))
|
|
38
41
|
appData = data
|
|
39
42
|
footballLoader.update(data)
|
|
40
43
|
render()
|
|
@@ -47,7 +50,7 @@ ipcRenderer.on('finish', (_event: any) => {
|
|
|
47
50
|
|
|
48
51
|
function render() {
|
|
49
52
|
ReactDOM.render(
|
|
50
|
-
React.createElement(App, {
|
|
53
|
+
React.createElement(App, { appData, fixtures, serviceError }),
|
|
51
54
|
document.getElementById('root')
|
|
52
55
|
)
|
|
53
56
|
}
|
package/src/test/parameters.json
CHANGED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"services": {
|
|
3
|
+
"f7e3a1b2-c4d5-6789-abcd-ef0123456789": {
|
|
4
|
+
"id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789",
|
|
5
|
+
"data": {
|
|
6
|
+
"fixtures": [
|
|
7
|
+
{
|
|
8
|
+
"fixture": {
|
|
9
|
+
"id": 1001,
|
|
10
|
+
"date": "2026-06-22T18:00:00+00:00",
|
|
11
|
+
"status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
|
|
12
|
+
"venue": { "name": "Camp Nou", "city": "Barcelona" }
|
|
13
|
+
},
|
|
14
|
+
"league": {
|
|
15
|
+
"id": 140,
|
|
16
|
+
"name": "La Liga",
|
|
17
|
+
"country": "Spain",
|
|
18
|
+
"logo": "https://media.api-sports.io/football/leagues/140.png",
|
|
19
|
+
"round": "Regular Season - 38"
|
|
20
|
+
},
|
|
21
|
+
"teams": {
|
|
22
|
+
"home": { "id": 529, "name": "Barcelona", "logo": "https://media.api-sports.io/football/teams/529.png", "winner": true },
|
|
23
|
+
"away": { "id": 541, "name": "Real Madrid", "logo": "https://media.api-sports.io/football/teams/541.png", "winner": false }
|
|
24
|
+
},
|
|
25
|
+
"goals": { "home": 3, "away": 1 },
|
|
26
|
+
"score": {
|
|
27
|
+
"halftime": { "home": 1, "away": 0 },
|
|
28
|
+
"fulltime": { "home": 3, "away": 1 }
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"fixture": {
|
|
33
|
+
"id": 1002,
|
|
34
|
+
"date": "2026-06-22T20:45:00+00:00",
|
|
35
|
+
"status": { "long": "Second Half", "short": "2H", "elapsed": 67 },
|
|
36
|
+
"venue": { "name": "Anfield", "city": "Liverpool" }
|
|
37
|
+
},
|
|
38
|
+
"league": {
|
|
39
|
+
"id": 39,
|
|
40
|
+
"name": "Premier League",
|
|
41
|
+
"country": "England",
|
|
42
|
+
"logo": "https://media.api-sports.io/football/leagues/39.png",
|
|
43
|
+
"round": "Regular Season - 38"
|
|
44
|
+
},
|
|
45
|
+
"teams": {
|
|
46
|
+
"home": { "id": 40, "name": "Liverpool", "logo": "https://media.api-sports.io/football/teams/40.png", "winner": null },
|
|
47
|
+
"away": { "id": 42, "name": "Arsenal", "logo": "https://media.api-sports.io/football/teams/42.png", "winner": null }
|
|
48
|
+
},
|
|
49
|
+
"goals": { "home": 2, "away": 2 },
|
|
50
|
+
"score": {
|
|
51
|
+
"halftime": { "home": 1, "away": 1 },
|
|
52
|
+
"fulltime": { "home": null, "away": null }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"fixture": {
|
|
57
|
+
"id": 1003,
|
|
58
|
+
"date": "2026-06-23T19:00:00+00:00",
|
|
59
|
+
"status": { "long": "Not Started", "short": "NS", "elapsed": null },
|
|
60
|
+
"venue": { "name": "Allianz Arena", "city": "Munich" }
|
|
61
|
+
},
|
|
62
|
+
"league": {
|
|
63
|
+
"id": 78,
|
|
64
|
+
"name": "Bundesliga",
|
|
65
|
+
"country": "Germany",
|
|
66
|
+
"logo": "https://media.api-sports.io/football/leagues/78.png",
|
|
67
|
+
"round": "Regular Season - 34"
|
|
68
|
+
},
|
|
69
|
+
"teams": {
|
|
70
|
+
"home": { "id": 157, "name": "Bayern Munich", "logo": "https://media.api-sports.io/football/teams/157.png", "winner": null },
|
|
71
|
+
"away": { "id": 165, "name": "Borussia Dortmund", "logo": "https://media.api-sports.io/football/teams/165.png", "winner": null }
|
|
72
|
+
},
|
|
73
|
+
"goals": { "home": null, "away": null },
|
|
74
|
+
"score": {
|
|
75
|
+
"halftime": { "home": null, "away": null },
|
|
76
|
+
"fulltime": { "home": null, "away": null }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"fixture": {
|
|
81
|
+
"id": 1004,
|
|
82
|
+
"date": "2026-06-22T17:30:00+00:00",
|
|
83
|
+
"status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
|
|
84
|
+
"venue": { "name": "San Siro", "city": "Milan" }
|
|
85
|
+
},
|
|
86
|
+
"league": {
|
|
87
|
+
"id": 135,
|
|
88
|
+
"name": "Serie A",
|
|
89
|
+
"country": "Italy",
|
|
90
|
+
"logo": "https://media.api-sports.io/football/leagues/135.png",
|
|
91
|
+
"round": "Regular Season - 38"
|
|
92
|
+
},
|
|
93
|
+
"teams": {
|
|
94
|
+
"home": { "id": 489, "name": "AC Milan", "logo": "https://media.api-sports.io/football/teams/489.png", "winner": false },
|
|
95
|
+
"away": { "id": 505, "name": "Inter", "logo": "https://media.api-sports.io/football/teams/505.png", "winner": true }
|
|
96
|
+
},
|
|
97
|
+
"goals": { "home": 0, "away": 2 },
|
|
98
|
+
"score": {
|
|
99
|
+
"halftime": { "home": 0, "away": 1 },
|
|
100
|
+
"fulltime": { "home": 0, "away": 2 }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"updatedAt": 1750608000000,
|
|
106
|
+
"__typename": "FootballAppService"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|