├── bun.lockb ├── .gitignore ├── .babelrc ├── sandbox.config.json ├── .editorconfig ├── index.d.ts ├── package.json ├── README.md ├── test ├── index.js ├── real-madrid.json └── real-madrid.html └── index.js /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablopunk/livesoccertv-parser/HEAD/bun.lockb -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | coverage* 4 | .nyc_output 5 | build.js 6 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["transform-object-rest-spread"], 3 | "presets": ["es2017"] 4 | } 5 | -------------------------------------------------------------------------------- /sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "infiniteLoopProtection": true, 3 | "hardReloadOnChange": false, 4 | "view": "tests", 5 | "template": "node" 6 | } 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare module "livesoccertv-parser" { 2 | interface Match { 3 | live: boolean; 4 | played: boolean; 5 | competition: string; 6 | date: string; 7 | time: string; 8 | game: string; 9 | tvs: string[]; 10 | } 11 | 12 | interface MatchesOptions { 13 | timezone?: string; 14 | } 15 | 16 | /** 17 | * Fetches matches for a specific country and team, with optional parameters. 18 | * @param country - The country to get matches for (e.g., 'spain'). 19 | * @param team - The team to get matches for (e.g., 'real-madrid'). 20 | * @param options - Optional parameters like timezone. 21 | * @returns A promise that resolves to an array of Match objects. 22 | */ 23 | function getMatches( 24 | country: string, 25 | team: string, 26 | options?: MatchesOptions 27 | ): Promise; 28 | 29 | /** 30 | * Searches for teams based on a query string. 31 | * @param query - The search query. 32 | * @param options - Optional parameters like timezone. 33 | * @returns A promise that resolves to an array of [country, team] tuples. 34 | */ 35 | function searchTeams( 36 | query: string, 37 | options?: MatchesOptions 38 | ): Promise<[string, string][]>; 39 | 40 | /** 41 | * Parses matches from HTML content. 42 | * @param body - The HTML content to parse. 43 | * @param timezone - The timezone to use for parsing times. 44 | * @returns An array of Match objects. 45 | */ 46 | function parseMatchesFromHtml(body: string, timezone?: string): Match[]; 47 | 48 | export { getMatches, searchTeams, parseMatchesFromHtml }; 49 | } 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "livesoccertv-parser", 3 | "version": "6.0.6", 4 | "description": "Parse match info from livesoccertv", 5 | "author": "Pablo Varela ", 6 | "scripts": { 7 | "test": "bun run test-coverage", 8 | "test:watch": "bunx nodemon --ext js --exec 'bun run test'", 9 | "test-coverage": "nyc myass", 10 | "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", 11 | "build": "babel index.js --out-file build.js", 12 | "prepublishOnly": "bun run build && bun run test" 13 | }, 14 | "bugs": { 15 | "url": "https://github.com/pablopunk/livesoccertv-parser/issues", 16 | "email": "pablo@pablopunk.com" 17 | }, 18 | "contributors": [ 19 | "Pablo Varela " 20 | ], 21 | "dependencies": { 22 | "cheerio": "^1.0.0-rc.2", 23 | "city-timezones": "^1.0.3", 24 | "moment": "^2.20.1", 25 | "moment-timezone": "^0.5.14" 26 | }, 27 | "devDependencies": { 28 | "babel-cli": "^6.26.0", 29 | "babel-plugin-transform-object-rest-spread": "^6.26.0", 30 | "babel-preset-es2017": "^6.24.1", 31 | "codecov": "*", 32 | "husky": "*", 33 | "myass": "*", 34 | "nyc": "*", 35 | "prettier": "*", 36 | "pretty-quick": "*" 37 | }, 38 | "homepage": "https://github.com/pablopunk/livesoccertv-parser", 39 | "keywords": [ 40 | "soccer", 41 | "football", 42 | "futbol", 43 | "live", 44 | "parser", 45 | "games", 46 | "tv", 47 | "tvs", 48 | "channels", 49 | "guide", 50 | "schedule", 51 | "livesoccertv" 52 | ], 53 | "license": "MIT", 54 | "main": "index.js", 55 | "nyc": { 56 | "reporter": [ 57 | "lcov", 58 | "html", 59 | "text" 60 | ] 61 | }, 62 | "repository": { 63 | "type": "git", 64 | "url": "https://github.com/pablopunk/livesoccertv-parser" 65 | }, 66 | "husky": { 67 | "hooks": { 68 | "pre-commit": "pretty-quick --staged" 69 | } 70 | }, 71 | "prettier": { 72 | "semi": false, 73 | "singleQuote": true, 74 | "tabWidth": 2 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # livesoccertv-parser 2 | 3 | > © All rights reserved to [Live soccer TV](http://www.livesoccertv.com/) 4 | 5 |

6 | 7 | 8 |

9 | 10 |

11 | Parse games info from livesoccertv 12 |

13 | 14 | ## Install 15 | 16 | ```bash 17 | npm install livesoccertv-parser 18 | ``` 19 | 20 | ## Usage 21 | 22 | The parser works with promises: 23 | 24 | ```js 25 | const {getMatches} = require('livesoccertv-parser') 26 | console.log(await getMatches('spain', 'real-madrid')) //=> [{...}, {...}, ...] 27 | ``` 28 | 29 | Match object: 30 | 31 | ```js 32 | Match { 33 | live: false, 34 | played: true, 35 | competition: 'Supercopa de España', 36 | date: 'August 13', 37 | time: '4:00 PM', 38 | game: 'Barcelona vs Real Madrid', 39 | tvs: 40 | [ 41 | 'TeleCinco', 42 | 'TV3', 43 | 'Radio Barca' 44 | ] 45 | } 46 | ``` 47 | 48 | ### API 49 | 50 | - Timezone 51 | 52 | By default, the timezone is `America/New_York`. You can set your own with: 53 | 54 | ```js 55 | getMatches('spain', 'real-madrid', { timezone: 'Europe/Madrid' }) 56 | getMatches('england', 'arsenal', { timezone: 'Europe/London' }) 57 | ``` 58 | 59 | - Search 60 | 61 | You can search for teams like so: 62 | 63 | ```js 64 | const {searchTeams} = require("livesoccertv-parser") 65 | searchTeams("madrid") 66 | // [ 67 | // ["spain", "real-madrid"], 68 | // ["spain", "atletico-madrid"], 69 | // ] 70 | ``` 71 | 72 | ## Contribute 73 | 74 | Feel free to open an _issue_ or a _PR_. 75 | 76 | ## License 77 | 78 | MIT 79 | 80 | ## Related 81 | 82 | More at [pablopunk.com](https://pablopunk.com) 83 | 84 | - [microsoccer](https://github.com/pablopunk/microsoccer): Microservice to fetch soccer games schedules and tv channels. 85 | 86 | ## Author 87 | 88 | | ![me](https://gravatar.com/avatar/fa50aeff0ddd6e63273a068b04353d9d?size=100) | 89 | | ---------------------------------------------------------------------------- | 90 | | © 2018 [Pablo Varela](https://pablopunk.com) | 91 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | const test = require("myass"); 2 | const fs = require("fs"); 3 | const moment = require("moment"); 4 | const m = require("../index"); // dont import built code - can help when getting errors on tests 5 | 6 | const sortArray = (search) => { 7 | return search.sort((a, b) => 8 | `${a[0]}/${a[1]}`.localeCompare(`${b[0]}/${b[1]}`), 9 | ); 10 | }; 11 | 12 | const basicTest = async (t, country, team) => { 13 | const matches = await m.getMatches(country, team); 14 | t.true(Array.isArray(matches)); 15 | t.true(matches.length > 0); 16 | 17 | return matches; 18 | }; 19 | 20 | test("Test Real Madrid", async (t) => { 21 | await basicTest(t, "spain", "real-madrid"); 22 | }); 23 | 24 | test("Test Barcelona", async (t) => { 25 | await basicTest(t, "spain", "barcelona"); 26 | }); 27 | 28 | test("Unknown country/team/timezone does not throw", async (t) => { 29 | const matches = await m.getMatches("foo", "bar", { timezone: "foo/bar" }); 30 | t.is(matches, []); 31 | }); 32 | 33 | test("Test timezones", async (t) => { 34 | const inEngland = await m.getMatches("england", "arsenal", { 35 | timezone: "Europe/Madrid", 36 | }); 37 | const inSpain = await m.getMatches("england", "arsenal", { 38 | timezone: "Europe/London", 39 | }); 40 | const timeInSpain = moment(inSpain[0].time, "LT"); 41 | const timeInEngland = moment(inEngland[0].time, "LT"); 42 | const diff = timeInSpain.diff(timeInEngland, "hours"); 43 | t.is(diff, -1); 44 | }); 45 | 46 | test("TVs should differ", async (t) => { 47 | const inEngland = await m.getMatches("england", "arsenal", { 48 | timezone: "Europe/Madrid", 49 | }); 50 | const inSpain = await m.getMatches("england", "arsenal", { 51 | timezone: "Europe/London", 52 | }); 53 | t.false(inEngland[0].tvs[0] === inSpain[0].tvs[0]); 54 | }); 55 | 56 | test("Test time change", async (t) => { 57 | t.is(m.adjustLocalTime("7:00pm", "America/New_York"), "19:00"); 58 | t.is(m.adjustLocalTime("7:00am", "America/New_York"), "07:00"); 59 | t.is(m.adjustLocalTime("7:00am", "Europe/London"), "12:00"); 60 | t.is(m.adjustLocalTime("7:00am", "Europe/Madrid"), "13:00"); 61 | }); 62 | 63 | test("Test search", async (t) => { 64 | const search = await m.searchTeams("madrid"); 65 | const sortedSearch = sortArray(search); 66 | const sortedExpected = sortArray([ 67 | ["spain", "real-madrid"], 68 | ["spain", "atletico-madrid"], 69 | ]); 70 | t.is(sortedSearch, sortedExpected); 71 | }); 72 | 73 | test("Test empty search", async (t) => { 74 | const search = await m.searchTeams("skhjakhjfadkjsafdkhj"); 75 | t.is(search, []); 76 | }); 77 | 78 | test("Static html", async (t) => { 79 | const html = fs.readFileSync("./test/real-madrid.html").toString(); 80 | const matches = m.parseMatchesFromHtml(html); 81 | const results = require("./real-madrid.json"); 82 | 83 | // Uncomment this to write new results to the HTML 84 | // require("fs").writeFileSync("./test/real-madrid.json", JSON.stringify(matches, null, 2)); 85 | 86 | t.is(matches, results); 87 | }); 88 | -------------------------------------------------------------------------------- /test/real-madrid.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "live": false, 4 | "played": true, 5 | "competition": "La Liga", 6 | "date": "Domingo, 18 Agosto", 7 | "time": "15:30", 8 | "game": "Mallorca 1 - 1\n Real Madrid", 9 | "tvs": [ 10 | "Movistar+", 11 | "LaLiga TV Bar HD", 12 | "DAZN Spain", 13 | "DAZN LaLiga", 14 | "DAZN LaLiga 2" 15 | ] 16 | }, 17 | { 18 | "live": false, 19 | "played": true, 20 | "competition": "La Liga", 21 | "date": "Domingo, 25 Agosto", 22 | "time": "11:00", 23 | "game": "Real Madrid 3 - 0\n Real Valladolid", 24 | "tvs": [ 25 | "Movistar+", 26 | "LaLiga TV Bar HD", 27 | "M+ LALIGA TV", 28 | "M+ LALIGA TV 2", 29 | "DAZN Deutschland" 30 | ] 31 | }, 32 | { 33 | "live": false, 34 | "played": true, 35 | "competition": "La Liga", 36 | "date": "Jueves, 29 Agosto", 37 | "time": "15:30", 38 | "game": "Las Palmas 1 - 1\n Real Madrid", 39 | "tvs": [ 40 | "Movistar+", 41 | "LaLiga TV Bar HD", 42 | "M+ LALIGA TV", 43 | "M+ LALIGA TV 2", 44 | "DAZN Deutschland" 45 | ] 46 | }, 47 | { 48 | "live": false, 49 | "played": true, 50 | "competition": "La Liga", 51 | "date": "Domingo, 1 Septiembre", 52 | "time": "15:30", 53 | "game": "Real Madrid 2 - 0\n Real Betis", 54 | "tvs": [ 55 | "Movistar+", 56 | "LaLiga TV Bar HD", 57 | "DAZN Spain", 58 | "DAZN LaLiga", 59 | "DAZN LaLiga 2" 60 | ] 61 | }, 62 | { 63 | "live": false, 64 | "played": true, 65 | "competition": "La Liga", 66 | "date": "Sábado, 14 Septiembre", 67 | "time": "15:00", 68 | "game": "Real Sociedad 0 - 2\n Real Madrid", 69 | "tvs": [ 70 | "Movistar+", 71 | "LaLiga TV Bar HD", 72 | "M+ LALIGA TV", 73 | "M+ LALIGA TV 2", 74 | "Movistar Plus+" 75 | ] 76 | }, 77 | { 78 | "live": false, 79 | "played": false, 80 | "competition": "Liga de Campeones de la UEFA", 81 | "date": "Martes, 17 Septiembre", 82 | "time": "15:00", 83 | "game": "Real Madrid vs Stuttgart", 84 | "tvs": [ 85 | "Movistar+", 86 | "Movistar Liga de Campeones", 87 | "Sport 24", 88 | "TV2 Sport", 89 | "Tring Sport 1" 90 | ] 91 | }, 92 | { 93 | "live": false, 94 | "played": false, 95 | "competition": "La Liga", 96 | "date": "Sábado, 21 Septiembre", 97 | "time": "15:00", 98 | "game": "Real Madrid vs Espanyol", 99 | "tvs": [ 100 | "Movistar+", 101 | "LaLiga TV Bar HD", 102 | "M+ LALIGA TV", 103 | "M+ LALIGA TV 2", 104 | "DAZN Deutschland" 105 | ] 106 | }, 107 | { 108 | "live": false, 109 | "played": false, 110 | "competition": "La Liga", 111 | "date": "Martes, 24 Septiembre", 112 | "time": "15:00", 113 | "game": "Real Madrid vs Deportivo Alavés", 114 | "tvs": [ 115 | "LaLiga TV Bar HD", 116 | "DAZN Spain", 117 | "TV4 Play", 118 | "TV 2 Play", 119 | "Blue Sport" 120 | ] 121 | }, 122 | { 123 | "live": false, 124 | "played": false, 125 | "competition": "La Liga", 126 | "date": "Domingo, 29 Septiembre", 127 | "time": "15:00", 128 | "game": "Atlético Madrid vs Real Madrid", 129 | "tvs": [ 130 | "LaLiga TV Bar HD", 131 | "DAZN Spain", 132 | "TV4 Play", 133 | "TV 2 Play", 134 | "Blue Sport" 135 | ] 136 | }, 137 | { 138 | "live": false, 139 | "played": false, 140 | "competition": "Liga de Campeones de la UEFA", 141 | "date": "Miércoles, 2 Octubre", 142 | "time": "15:00", 143 | "game": "Lille vs Real Madrid", 144 | "tvs": [ 145 | "Movistar+", 146 | "Viaplay Sweden", 147 | "TV 2 Play", 148 | "Okko Спорт", 149 | "FAST TV" 150 | ] 151 | } 152 | ] -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment') 2 | const cheerio = require('cheerio') 3 | const cityTimezones = require('city-timezones') 4 | 5 | require('moment-timezone') 6 | const DEFAULT_TIMEZONE = 'America/New_York' 7 | // biome-ignore lint/complexity/useOptionalChain: 8 | if (moment.tz && moment.tz.setDefault) { 9 | moment.tz.setDefault(DEFAULT_TIMEZONE) 10 | } 11 | 12 | let $ // cheerio will be initialized with the html body 13 | 14 | const baseUrl = 'https://www.livesoccertv.com/teams' 15 | 16 | const splitTimezone = (tz) => tz.split('/') 17 | const urlifyTimezone = (tz) => tz.replace('/', '%2F') 18 | const getCountry = (city, tz) => { 19 | const cities = cityTimezones.lookupViaCity(city) 20 | for (const c of cities) { 21 | if (c.timezone === tz) { 22 | return c 23 | } 24 | } 25 | return cities[0] 26 | } 27 | 28 | const badCountryCodes = { 29 | ESP: 'ES', 30 | USA: 'US', 31 | GBR: 'UK', 32 | RUS: 'RU', 33 | } 34 | 35 | const badLangCodes = { 36 | us: 'en', 37 | gb: 'en', 38 | } 39 | 40 | const fixCountryCode = (_country) => { 41 | let country = _country 42 | for (const bad in badCountryCodes) { 43 | country = country.replace(bad, badCountryCodes[bad]) 44 | } 45 | 46 | return country 47 | } 48 | 49 | const fixLangCode = (_lang) => { 50 | let lang = _lang 51 | for (const bad in badLangCodes) { 52 | lang = lang.replace(bad, badLangCodes[bad]) 53 | } 54 | 55 | return lang 56 | } 57 | 58 | const getDataFromTimezone = (timezone) => { 59 | const [continent, city] = splitTimezone(timezone) 60 | const countryInfo = getCountry(city.replace('_', ' '), timezone) 61 | if (!countryInfo) { 62 | console.error('Unkown country/team/timezone', { timezone }) 63 | return null 64 | } 65 | let countryCode = countryInfo.iso3 66 | let lang = countryInfo.iso2 67 | lang = lang.toLowerCase() 68 | lang = fixLangCode(lang) 69 | countryCode = fixCountryCode(countryCode) 70 | const locale = `${lang}_${countryCode}` 71 | const country = countryInfo.country 72 | 73 | return { 74 | countryCode, 75 | country, 76 | lang, 77 | locale, 78 | continent, 79 | } 80 | } 81 | 82 | const getBody = async ({ country, team, timezone }) => { 83 | const url = getTeamUrl(country, team) 84 | const timezoneData = getDataFromTimezone(timezone) 85 | const cookie = `u_country=${timezoneData.country}; u_country_code=${timezoneData.countryCode}; u_timezone=${urlifyTimezone( 86 | timezone, 87 | )}; live=live; u_scores=on; u_continent=${timezoneData.continent}; u_lang=${timezoneData.lang}; u_locale=${timezoneData.locale}; cf_clearance=bk.KgidKvvr6VwkqAS4WsVpC1q.BjwFWKTuSpLBRgJQ-1726529836-1.2.1.1-uhaLBvQThL5uZsG_4v6CKc8I6WZnh.Tc4U3LrQZyz7FKNFjQBJHQnegA63J1yTSNL5lHSLqQfAyFQHdlvhYBFHfylHYk4rLyhXA30xUvMtrrbfwuLWUAWoco2qzyUi8SPrikOZQEbAgETrm7WcyILiS7ZXWJqA_C.ws3Rw0WHtdbjQ8AmLL0j19J9D49vFD.f5KvYmJkk7Lf7jz9ywfY4oOxpJIF9ghs6EzldFQaDDJEkrLfy7eUuNQPTWJpKfyt6GTIpvdaEqVKFDql6V0VLWp1g2pXJpQ0vbb21shaMqBWZLPXB1Vot6Y1kI95rl4ekAmuMgTOb6JAIcs3F9hZtLYe.LJyD_9dfJrBs3x8KjV1kq0_Gjqx32EDxyJy2ZxNFXprn65.xJDoEtfHXHgqlA` 88 | 89 | const response = await fetch(url, { 90 | headers: { 91 | cookie, 92 | accept: 93 | 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 94 | 'accept-language': `${timezoneData.lang}-${timezoneData.countryCode},${timezoneData.lang};q=0.9`, 95 | priority: 'u=0, i', 96 | 'sec-ch-ua': '"Not;A=Brand";v="24", "Chromium";v="128"', 97 | 'sec-ch-ua-mobile': '?0', 98 | 'sec-ch-ua-platform': '"macOS"', 99 | 'sec-fetch-dest': 'document', 100 | 'sec-fetch-mode': 'navigate', 101 | 'sec-fetch-site': 'same-origin', 102 | 'sec-fetch-user': '?1', 103 | 'upgrade-insecure-requests': '1', 104 | }, 105 | body: null, 106 | method: 'GET', 107 | }) 108 | 109 | return response.text() 110 | } 111 | const getTeamUrl = (country, team) => `${baseUrl}/${country}/${team}` 112 | 113 | const adjustLocalTime = (time, timezone) => { 114 | const resultDate = moment(time, 'h:mm A').tz(timezone).format('HH:mm') 115 | return resultDate !== 'Invalid date' ? resultDate : time 116 | } 117 | 118 | const parseLive = (n) => $('tr.matchrow').eq(n).hasClass('livematch') 119 | const parsePlayed = (n) => 120 | $('tr.matchrow').eq(n).find('.livecell').hasClass('ft') 121 | const parseCompetition = (n) => 122 | $('tr.matchrow').eq(n).prev('tr.drow').find('a').eq(1).text().trim() 123 | const parseDate = (n) => 124 | $('tr.matchrow').eq(n).prev('tr.drow').find('a').eq(0).text().trim() 125 | const parseTime = (n) => 126 | $('tr.matchrow').eq(n).find('.timecell span').eq(0).text().trim() 127 | const parseGame = (n) => $('tr.matchrow').eq(n).find('a').eq(0).text().trim() 128 | 129 | const parseTvs = (n) => { 130 | const tvs = [] 131 | $('tr.matchrow') 132 | .eq(n) 133 | .find('#channels a') 134 | .each((i, el) => { 135 | tvs.push($(el).text().trim()) 136 | }) 137 | return tvs 138 | } 139 | 140 | const filterTvs = (tv) => tv && !tv.includes('…') 141 | 142 | const convertObjectsToArray = (objects) => { 143 | const array = [] 144 | objects.map((i, o) => array.push(o)) 145 | return array 146 | } 147 | 148 | class Match { 149 | constructor(n) { 150 | this.live = parseLive(n) 151 | this.played = parsePlayed(n) 152 | this.competition = parseCompetition(n) 153 | this.date = parseDate(n) 154 | this.time = parseTime(n) 155 | this.game = parseGame(n) 156 | this.tvs = parseTvs(n) 157 | this.tvs = this.tvs.filter(filterTvs) 158 | } 159 | } 160 | 161 | const parseMatchesFromHtml = (body, timezone = DEFAULT_TIMEZONE) => { 162 | $ = cheerio.load(body) 163 | const matchRows = $('tr.matchrow') 164 | 165 | let matches = matchRows.map((i) => new Match(i)) 166 | matches = convertObjectsToArray(matches) 167 | matches = matches.filter((m) => m.tvs.length !== 0) 168 | 169 | matches = matches.map((m) => ({ 170 | ...m, 171 | time: adjustLocalTime(m.time, timezone), 172 | })) 173 | 174 | return matches 175 | } 176 | 177 | module.exports.getMatches = async (country, team, options = {}) => { 178 | try { 179 | const timezone = options.timezone || DEFAULT_TIMEZONE 180 | const body = await getBody({ country, team, timezone }) 181 | const matches = parseMatchesFromHtml(body, timezone) 182 | 183 | return matches 184 | } catch (error) { 185 | console.error('Error fetching matches', { error }) 186 | return [] 187 | } 188 | } 189 | 190 | module.exports.searchTeams = async (query, options = {}) => { 191 | try { 192 | const timezone = options.timezone || DEFAULT_TIMEZONE 193 | const { lang, countryCode } = getDataFromTimezone(timezone) 194 | const url = `https://www.livesoccertv.com/es/include/autocomplete.php?search=${query}&s_type=instant&lang=${lang}&iso=${countryCode}` 195 | const response = await fetch(url) 196 | const body = await response.text() 197 | const $ = cheerio.load(body) 198 | const teams = $('a[href*="%2Fteams%2F"]') 199 | .map((i, el) => { 200 | const href = $(el).attr('href') 201 | const match = href.match(/%2Fteams%2F([^%]+%2F[^%]+)%2F/) 202 | return match ? decodeURIComponent(match[1]) : null 203 | }) 204 | .get() 205 | .filter(Boolean) 206 | .map((team) => team.split('/')) 207 | return teams 208 | } catch (error) { 209 | console.error('Error searching teams', { error }) 210 | return [] 211 | } 212 | } 213 | 214 | // Exporting for testing 215 | module.exports.parseMatchesFromHtml = parseMatchesFromHtml 216 | module.exports.adjustLocalTime = adjustLocalTime 217 | -------------------------------------------------------------------------------- /test/real-madrid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Real Madrid Programación de TV, Calendarios, Resultados, Noticias, Escuadra, Vídeos :: Live Soccer TV 6 | 7 | 8 | 9 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 104 | 105 | 127 | 128 | 129 | 130 |
131 |
132 |
133 |
134 |
135 |
136 | 139 |
140 | 183 | 196 | 197 |
198 | 199 | 242 |
243 |
244 |
245 |
246 | 255 |
256 |
257 |
258 | 325 | 331 | 337 |
338 |
PUBLICIDAD
339 |
340 | 341 | 344 |
345 |
346 | 351 |
352 |
353 | 825 |
826 |
827 |
828 | 829 |

Real Madrid CF

830 | 871 |
872 |
873 |
874 |
875 |
Partidos
876 |
Jugadores
877 |
Estadísticas
878 |
Transferencias
879 |
Acerca de
880 |
881 |
882 |
883 |
884 |
885 |

Partidos

886 |

Real Madrid CF Partidos, resultados, marcadores en vivo, transmisiones en línea

887 | 893 |
894 |
895 | 896 | 897 |
898 | 899 | 900 | 904 | 905 | 906 | 918 | 924 | 933 | 934 | 935 | 939 | 940 | 941 | 953 | 959 | 968 | 969 | 970 | 974 | 975 | 976 | 988 | 994 | 1003 | 1004 | 1005 | 1009 | 1010 | 1011 | 1023 | 1029 | 1038 | 1039 | 1040 | 1044 | 1045 | 1046 | 1058 | 1064 | 1073 | 1074 | 1075 | 1079 | 1080 | 1081 | 1091 | 1094 | 1103 | 1104 | 1105 | 1109 | 1110 | 1111 | 1121 | 1124 | 1133 | 1134 | 1135 | 1139 | 1140 | 1141 | 1151 | 1154 | 1163 | 1164 | 1165 | 1169 | 1170 | 1171 | 1181 | 1184 | 1193 | 1194 | 1195 | 1199 | 1200 | 1201 | 1211 | 1214 | 1223 | 1224 |
901 | Domingo, 18 Agosto 902 | ·La Liga 903 |
907 |
908 | En Vivo 909 |
910 | + 911 |
912 | 913 | 15:30 914 | 915 | 916 |
917 |
919 | 920 | Mallorca 1 - 1 921 | Real Madrid 922 | 923 | 925 | 932 |
936 | Domingo, 25 Agosto 937 | ·La Liga 938 |
942 |
943 | En Vivo 944 |
945 | + 946 |
947 | 948 | 11:00 949 | 950 | 951 |
952 |
954 | 955 | Real Madrid 3 - 0 956 | Real Valladolid 957 | 958 | 960 | 967 |
971 | Jueves, 29 Agosto 972 | ·La Liga 973 |
977 |
978 | En Vivo 979 |
980 | + 981 |
982 | 983 | 15:30 984 | 985 | 986 |
987 |
989 | 990 | Las Palmas 1 - 1 991 | Real Madrid 992 | 993 | 995 | 1002 |
1006 | Domingo, 1 Septiembre 1007 | ·La Liga 1008 |
1012 |
1013 | En Vivo 1014 |
1015 | + 1016 |
1017 | 1018 | 15:30 1019 | 1020 | 1021 |
1022 |
1024 | 1025 | Real Madrid 2 - 0 1026 | Real Betis 1027 | 1028 | 1030 | 1037 |
1041 | Sábado, 14 Septiembre 1042 | ·La Liga 1043 |
1047 |
1048 | En Vivo 1049 |
1050 | + 1051 |
1052 | 1053 | 15:00 1054 | 1055 | 1056 |
1057 |
1059 | 1060 | Real Sociedad 0 - 2 1061 | Real Madrid 1062 | 1063 | 1065 | 1072 |
1076 | Martes, 17 Septiembre 1077 | ·Liga de Campeones de la UEFA 1078 |
1082 |
1083 | 1084 |
1085 | 1086 | 15:00 1087 | 1088 | 1089 |
1090 |
1092 | Real Madrid vs Stuttgart 1093 | 1095 | 1102 |
1106 | Sábado, 21 Septiembre 1107 | ·La Liga 1108 |
1112 |
1113 | 1114 |
1115 | 1116 | 15:00 1117 | 1118 | 1119 |
1120 |
1122 | Real Madrid vs Espanyol 1123 | 1125 | 1132 |
1136 | Martes, 24 Septiembre 1137 | ·La Liga 1138 |
1142 |
1143 | 1144 |
1145 | 1146 | 15:00 1147 | 1148 | 1149 |
1150 |
1152 | Real Madrid vs Deportivo Alavés 1153 | 1155 | 1162 |
1166 | Domingo, 29 Septiembre 1167 | ·La Liga 1168 |
1172 |
1173 | 1174 |
1175 | 1176 | 15:00 1177 | 1178 | 1179 |
1180 |
1182 | Atlético Madrid vs Real Madrid 1183 | 1185 | 1192 |
1196 | Miércoles, 2 Octubre 1197 | ·Liga de Campeones de la UEFA 1198 |
1202 |
1203 | 1204 |
1205 | 1206 | 15:00 1207 | 1208 | 1209 |
1210 |
1212 | Lille vs Real Madrid 1213 | 1215 | 1222 |
1225 |
1226 | 1229 |
1230 |
*Please note that we do not provide live streaming of Real Madrid CF directly. We publish Real Madrid CF TV schedules and live stream links strictly for the official rights holding broadcasters and streaming providers only. For how to watch Real Madrid CF matches in Spain, see additional information below. For any omissions or errors, please contact us.
1231 |
1232 | 1233 |
1234 | 1237 |
1238 |

Jugadores

1239 |

Real Madrid CF Escuadra

1240 |

Porteros

1241 |
1242 |
1243 | Fran González 1244 |
1245 |
1246 | # 26 Fran González 1247 |
1248 |

España

1249 |

19 años ··199 cm

1250 |
1251 |
1252 |
1253 | T. Courtois 1254 |
1255 |
1256 | # 1 T. Courtois 1257 |
1258 |

Bélgica

1259 |

32 años ·96 kgs. ·200 cm

1260 |
1261 |
1262 |
1263 | A. Lunin 1264 |
1265 |
1266 | # 13 A. Lunin 1267 |
1268 |

Ucrania

1269 |

25 años ·80 kgs. ·191 cm

1270 |
1271 |
1272 |
1273 |

Defensas

1274 |
1275 |
1276 | D. Alaba 1277 |
1278 |
1279 | # 4 D. Alaba 1280 |
1281 |

Austria

1282 |

32 años ·78 kgs. ·180 cm

1283 |
1284 |
1285 |
1286 | Jacobo Ramón 1287 |
1288 |
1289 | # 31 Jacobo Ramón 1290 |
1291 |

España

1292 |

19 años ··188 cm

1293 |
1294 |
1295 |
1296 | Fran García 1297 |
1298 |
1299 | # 20 Fran García 1300 |
1301 |

España

1302 |

25 años ·69 kgs. ·167 cm

1303 |
1304 |
1305 |
1306 | Éder Militão 1307 |
1308 |
1309 | # 3 Éder Militão 1310 |
1311 |

Brasil

1312 |

26 años ·78 kgs. ·186 cm

1313 |
1314 |
1315 |
1316 | Dani Carvajal 1317 |
1318 |
1319 | # 2 Dani Carvajal 1320 |
1321 |

España

1322 |

32 años ·73 kgs. ·173 cm

1323 |
1324 |
1325 |
1326 | F. Mendy 1327 |
1328 |
1329 | # 23 F. Mendy 1330 |
1331 |

Francia

1332 |

29 años ·73 kgs. ·180 cm

1333 |
1334 |
1335 |
1336 | A. Rüdiger 1337 |
1338 |
1339 | # 22 A. Rüdiger 1340 |
1341 |

Alemania

1342 |

31 años ·85 kgs. ·190 cm

1343 |
1344 |
1345 |
1346 | Jesús Vallejo 1347 |
1348 |
1349 | # 18 Jesús Vallejo 1350 |
1351 |

España

1352 |

27 años ·79 kgs. ·184 cm

1353 |
1354 |
1355 |
1356 |

Mediocampistas

1357 |
1358 |
1359 | A. Tchouaméni 1360 |
1361 |
1362 | # 14 A. Tchouaméni 1363 |
1364 |

Francia

1365 |

24 años ·81 kgs. ·187 cm

1366 |
1367 |
1368 |
1369 | L. Modrić 1370 |
1371 |
1372 | # 10 L. Modrić 1373 |
1374 |

Croacia

1375 |

39 años ·66 kgs. ·172 cm

1376 |
1377 |
1378 |
1379 | A. Güler 1380 |
1381 |
1382 | # 15 A. Güler 1383 |
1384 |

Turquía

1385 |

19 años ·67 kgs. ·176 cm

1386 |
1387 |
1388 |
1389 | J. Bellingham 1390 |
1391 |
1392 | # 5 J. Bellingham 1393 |
1394 |

Inglaterra

1395 |

21 años ·75 kgs. ·186 cm

1396 |
1397 |
1398 |
1399 | E. Camavinga 1400 |
1401 |
1402 | # 6 E. Camavinga 1403 |
1404 |

Francia

1405 |

21 años ·68 kgs. ·182 cm

1406 |
1407 |
1408 |
1409 | Lucas Vázquez 1410 |
1411 |
1412 | # 17 Lucas Vázquez 1413 |
1414 |

España

1415 |

33 años ·70 kgs. ·173 cm

1416 |
1417 |
1418 |
1419 | Brahim Díaz 1420 |
1421 |
1422 | # 21 Brahim Díaz 1423 |
1424 |

Marruecos

1425 |

25 años ·59 kgs. ·171 cm

1426 |
1427 |
1428 |
1429 | F. Valverde 1430 |
1431 |
1432 | # 8 F. Valverde 1433 |
1434 |

Uruguay

1435 |

26 años ·78 kgs. ·182 cm

1436 |
1437 |
1438 |
1439 | Dani Ceballos 1440 |
1441 |
1442 | # 19 Dani Ceballos 1443 |
1444 |

España

1445 |

28 años ·70 kgs. ·179 cm

1446 |
1447 |
1448 |
1449 |

Delanteros

1450 |
1451 |
1452 | Vinícius Júnior 1453 |
1454 |
1455 | # 7 Vinícius Júnior 1456 |
1457 |

Brasil

1458 |

24 años ·73 kgs. ·176 cm

1459 |
1460 |
1461 |
1462 | Rodrygo 1463 |
1464 |
1465 | # 11 Rodrygo 1466 |
1467 |

Brasil

1468 |

23 años ·64 kgs. ·174 cm

1469 |
1470 |
1471 |
1472 | Endrick 1473 |
1474 |
1475 | # 16 Endrick 1476 |
1477 |

Brasil

1478 |

18 años ·66 kgs. ·173 cm

1479 |
1480 |
1481 |
1482 | K. Mbappé 1483 |
1484 |
1485 | # 9 K. Mbappé 1486 |
1487 |

Francia

1488 |

25 años ·75 kgs. ·178 cm

1489 |
1490 |
1491 |
1492 |
1493 |
1494 |

Estadísticas

1495 |

Real Madrid CF Player Statistics

1496 | 1497 | 1498 | 1499 | 1502 | 1505 | 1508 | 1511 | 1514 | 1517 | 1520 | 1523 | 1526 | 1529 | 1532 | 1533 | 1534 | 1535 | 1536 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1569 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1662 | 1663 | 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 1672 | 1673 | 1674 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1815 | 1816 | 1817 | 1818 | 1819 | 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 |
Nombre 1500 | 1501 | 1503 | 1504 | 1506 | 1507 | 1509 | 1510 | 1512 | 1513 | 1515 | 1516 | 1518 | 1519 | 1521 | A 1522 | 1524 | 1525 | 1527 | 1528 | 1530 | 1531 |
Porteros
1537 | Fran González 1538 | 00000400000
1552 | T. Courtois 1553 | 3604400000000
1567 | A. Lunin 1568 | 00000400000
Defensas
1585 | D. Alaba 1586 | 00000000000
1600 | Jacobo Ramón 1601 | 00000400000
1615 | Fran García 1616 | 1593120300000
1630 | Éder Militão 1631 | 3604400001100
1645 | Dani Carvajal 1646 | 2824311100200
1660 | F. Mendy 1661 | 2013302000101
1675 | A. Rüdiger 1676 | 3604400000000
1690 | Jesús Vallejo 1691 | 00000100000
Mediocampistas
1708 | A. Tchouaméni 1709 | 3334401000000
1723 | L. Modrić 1724 | 1184131300000
1738 | A. Güler 1739 | 973121300100
1753 | J. Bellingham 1754 | 881101000000
1768 | E. Camavinga 1769 | 00000000000
1783 | Lucas Vázquez 1784 | 782111300000
1798 | Brahim Díaz 1799 | 944131311000
1813 | F. Valverde 1814 | 3604400011000
1828 | Dani Ceballos 1829 | 702111300000
Delanteros
1846 | Vinícius Júnior 1847 | 3494403011100
1861 | Rodrygo 1862 | 2924312111000
1876 | Endrick 1877 | 93030410000
1891 | K. Mbappé 1892 | 3504402020000
1905 |
1906 |

Transferencias

1907 |

Real Madrid CF Transfers

1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1932 | 1933 | 1934 | 1935 | 1936 | 1937 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2034 | 2035 | 2036 | 2037 | 2038 |
NombreFechaDelMonto
Jugadores firmados
1920 | Jesús Vallejo 1921 |
01 julio 2024
1922 |
01 julio 2024Granada-
1929 | K. Mbappé 1930 |
01 julio 2024
1931 |
01 julio 2024PSGFree
1938 | Pablo Ramón 1939 |
01 julio 2024
1940 |
01 julio 2024Mirandes-
1947 | Endrick 1948 |
21 julio 2024
1949 |
21 julio 2024Palmeiras€35M
Jugadores salientes
1959 | Joselu 1960 |
01 julio 2024
1961 |
01 julio 2024Gharafa-
1968 | Nacho 1969 |
18 julio 2024
1970 |
18 julio 2024Al-QadsiahFree
1977 | Kepa 1978 |
01 julio 2024
1979 |
01 julio 2024Chelsea-
1986 | Marvin Park 1987 |
01 julio 2024
1988 |
01 julio 2024Las Palmas€2M
1995 | Rafa Marín 1996 |
01 julio 2024
1997 |
01 julio 2024Real Madrid-
2004 | Rafael Obrador 2005 |
21 agosto 2024
2006 |
21 agosto 2024La CoruñaPréstamo
2013 | Vinícius Tobias 2014 |
01 julio 2024
2015 |
01 julio 2024Shakhtar D-
2022 | Á. Rodríguez 2023 |
29 agosto 2024
2024 |
29 agosto 2024GetafePréstamo
2031 | Mario Martín 2032 |
23 agosto 2024
2033 |
23 agosto 2024ValladolidPréstamo
2039 |
2040 |
2041 |

Sobre Real Madrid CF

2042 |

2043 | El Real Madrid es un club de fútbol de España. El equipo es posiblemente uno de los más famosos en todo el mundo y es conocido por sus fanáticos como Los Merengues o Los Blancos. Esta institución fue fundada en 1902 y disputa sus juegos en casa en el estadio Santiago Bernabéu, un inmueble con más de 81,000 asientos para que los fanáticos del equipo apoyen cada quince días.
2044 |
2045 | Los Merengues son uno de los equipos más ganadores del fútbol mundial. El legado del equipo se ha cimentado con sus éxitos en la máxima categoría española, conocida como La Liga. El club también ha ganado varios títulos de la Copa del Rey y la Supercopa de España, entre otras competiciones nacionales. No obstante, sus mayores éxitos han llegado en el fútbol internacional, donde han ganado más títulos de la UEFA Champions League que cualquier otro club de la historia, además de contar con varias copas en la UEFA Europa League, la Copa Mundial de Clubes de la FIFA y títulos de la Super Copa de la UEFA en su impresionante currículum.
2046 |
2047 | El Real Madrid tiene algunas rivalidades que han hecho su historia aún más rica. Sus principales rivales son el FC Barcelona, ??un equipo con el que comparten uno de los mayores enfrentamientos que un fanático del fútbol puede ver: El Clásico. Estos pesos pesados ??españoles han visto que su rivalidad se ha intensificado con el paso de los años, viviendo uno de sus puntos más altos en la década de 2010, cuando el Real Madrid tenía en sus filas a Cristiano Ronaldo y Barcelona contaba con Lionel Messi como ícono y capitán del equipo. Otra rivalidad feroz para Los Merengues es el Derby de Madrid, misma que los ve enfrentarse contra el Atlético Madrid. La rivalidad entre estos clubes se ha expandido a torneos europeos, ya que jugaron dos intensas finales de la UEFA Champions League en 2014 y 2016, ambas ganadas por el Real Madrid.
2048 |
2049 | El equipo no es propiedad de una compañía como tal, pues deja a sus socios que tomen algunas decisiones importantes conforme a los intereses del club. El equipo elige a un presidente cada cuatro años, pero este puede puede ser reelegido si no hay otros candidatos para ocupar el cargo. El presidente actual, Florentino Pérez, ha estado a cargo desde 2009.
2050 |
2051 | Real Madrid TV funge como el canal oficial del equipo, transmitiendo contenido en inglés y español. El club lanzó su canal de televisión en 1999, y se ha utilizado para transmitir contenido relacionado con todas sus categorías, incluidos equipos de otras disciplinas. Real Madrid TV también ha transmitido partidos amistosos, documentales, entrevistas y previos de partidos tanto en La Liga como en torneos europeos.
2052 |

2053 |
2054 |
2055 | 2056 | 2061 |
2062 |

Próximos partidos relevantes »

2063 | 2064 | 2065 | 2066 | 2069 | 2070 | 2075 | 2076 | 2079 | 2080 |
2067 | Monaco 2068 | Monaco 2071 | sep 19 2072 |
2073 | 15:00 2074 |
Barcelona 2077 | Barcelona 2078 |
2081 |
2082 | 2083 | 2084 | 2085 | 2088 | 2089 | 2094 | 2095 | 2098 | 2099 |
2086 | Atalanta 2087 | Atalanta 2090 | sep 19 2091 |
2092 | 15:00 2093 |
Arsenal 2096 | Arsenal 2097 |
2100 |
2101 | 2102 | 2103 | 2104 | 2107 | 2108 | 2113 | 2114 | 2117 | 2118 |
2105 | West Ham United 2106 | West Ham United 2109 | sep 21 2110 |
2111 | 7:30 2112 |
Chelsea 2115 | Chelsea 2116 |
2119 |
2120 | 2121 | 2122 | 2123 | 2126 | 2127 | 2132 | 2133 | 2136 | 2137 |
2124 | Werder Bremen 2125 | Werder Bremen 2128 | sep 21 2129 |
2130 | 9:30 2131 |
Bayern München 2134 | Bayern München 2135 |
2138 |
2139 | 2140 | 2141 | 2142 | 2145 | 2146 | 2151 | 2152 | 2155 | 2156 |
2143 | Liverpool 2144 | Liverpool 2147 | sep 21 2148 |
2149 | 10:00 2150 |
AFC Bournemouth 2153 | AFC Bournemouth 2154 |
2157 |
2158 | 2159 | 2160 | 2161 | 2164 | 2165 | 2170 | 2171 | 2174 | 2175 |
2162 | Crystal Palace 2163 | Crystal Palace 2166 | sep 21 2167 |
2168 | 12:30 2169 |
Manchester United 2172 | Manchester United 2173 |
2176 |
2177 | 2178 | 2179 | 2180 | 2183 | 2184 | 2189 | 2190 | 2193 | 2194 |
2181 | Real Madrid 2182 | Real Madrid 2185 | sep 21 2186 |
2187 | 15:00 2188 |
Espanyol 2191 | Espanyol 2192 |
2195 |
2196 | 2197 | 2198 | 2199 | 2202 | 2203 | 2208 | 2209 | 2212 | 2213 |
2200 | Manchester City 2201 | Manchester City 2204 | sep 22 2205 |
2206 | 11:30 2207 |
Arsenal 2210 | Arsenal 2211 |
2214 |
2215 | 2216 | 2217 | 2218 | 2221 | 2222 | 2227 | 2228 | 2231 | 2232 |
2219 | Villarreal 2220 | Villarreal 2223 | sep 22 2224 |
2225 | 12:30 2226 |
Barcelona 2229 | Barcelona 2230 |
2233 |
2234 | 2235 | 2236 | 2237 | 2240 | 2241 | 2246 | 2247 | 2250 | 2251 |
2238 | Real Madrid 2239 | Real Madrid 2242 | sep 24 2243 |
2244 | 15:00 2245 |
Deportivo Alavés 2248 | Deportivo Alavés 2249 |
2252 |
2253 | 2254 | 2255 | 2256 | 2259 | 2260 | 2265 | 2266 | 2269 | 2270 |
2257 | Manchester United 2258 | Manchester United 2261 | sep 25 2262 |
2263 | 15:00 2264 |
Twente 2267 | Twente 2268 |
2271 |
2272 |
2273 | 2278 | 2283 |
2284 |
2285 |
2286 |
2287 | LiveSoccerTV.com 2288 |
2289 |
2290 |
2291 | 2298 |
2299 |

Suscríbete a nuestro boletín »

2300 |
2301 | 2302 | 2303 | 2304 | 2307 | 2311 | 2314 | 2315 | 2316 | 2327 | 2328 |
Email: 2305 | 2306 | 2308 |
2309 | 2310 |
2312 | ¿Por qué Suscribirse? 2313 |
2317 |
2318 | This form is protected by reCAPTCHA.
2319 | The Google 2320 | Privacy Policy 2321 | and 2322 | Terms of Service 2323 | apply. 2324 | 2325 |
2326 |
2329 | 2337 | 2338 | 2339 | 2340 |
2341 |
2342 |
2343 | 2344 | App Live Soccer TV 2345 | 2346 |
2347 | Baja la App de Live Soccer TV para
2348 | 2349 | Iphone 2350 | 2351 | o 2352 | 2353 | Android 2354 | 2355 |
2356 | 2357 | App de Live Soccer TV para iOS 2358 | 2359 | 2360 | App de Live Soccer TV para Android 2361 | 2362 |
2363 |
2364 | 2797 |
2798 | 2818 | 2819 | 2828 | 2997 |
2998 | 2999 | --------------------------------------------------------------------------------