From bcbb2d3000a01e5bcc625ee5700f91b82af78969 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:22:11 +0300 Subject: [PATCH 1/6] Create content.json --- sites/claro.com.br/__data__/content.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 sites/claro.com.br/__data__/content.json diff --git a/sites/claro.com.br/__data__/content.json b/sites/claro.com.br/__data__/content.json new file mode 100644 index 00000000..e284d118 --- /dev/null +++ b/sites/claro.com.br/__data__/content.json @@ -0,0 +1 @@ +{"response":{"docs":[{"id_canal":"1682","st_titulo":"encontro_com_a_autora","dh_inicio":"2025-08-13T00:00Z","id_cidade":"1","dh_fim":"2025-08-13T01:00Z","id_programa":"1128311","titulo":"Encontro Com a Autora"},{"id_canal":"1682","st_titulo":"reapresentacao_de_comissao","dh_inicio":"2025-08-13T01:00Z","id_cidade":"1","dh_fim":"2025-08-13T06:30Z","id_programa":"241044","titulo":"Reapresentação de Comissão"},{"id_canal":"1682","st_titulo":"palavra_aberta","dh_inicio":"2025-08-13T06:30Z","id_cidade":"1","dh_fim":"2025-08-13T07:00Z","id_programa":"944547","titulo":"Palavra Aberta"},{"id_canal":"1682","st_titulo":"documentario_edital","dh_inicio":"2025-08-13T07:00Z","id_cidade":"1","dh_fim":"2025-08-13T07:30Z","id_programa":"1354533","titulo":"Documentário Edital"},{"id_canal":"1682","st_titulo":"palavra_aberta","dh_inicio":"2025-08-13T07:30Z","id_cidade":"1","dh_fim":"2025-08-13T08:00Z","id_programa":"944547","titulo":"Palavra Aberta"},{"id_canal":"1682","st_titulo":"documentario_sesc_tv","dh_inicio":"2025-08-13T08:00Z","id_cidade":"1","dh_fim":"2025-08-13T09:00Z","id_programa":"1340642","titulo":"Documentário Sesc TV"},{"id_canal":"1682","st_titulo":"reapresentacao_de_comissao","dh_inicio":"2025-08-13T09:00Z","id_cidade":"1","dh_fim":"2025-08-13T11:30Z","id_programa":"241044","titulo":"Reapresentação de Comissão"},{"id_canal":"1682","st_titulo":"elas_pautam","dh_inicio":"2025-08-13T11:30Z","id_cidade":"1","dh_fim":"2025-08-13T12:00Z","id_programa":"868184","titulo":"Elas Pautam"},{"id_canal":"1682","st_titulo":"bora_entender","dh_inicio":"2025-08-13T12:00Z","id_cidade":"1","dh_fim":"2025-08-13T13:00Z","id_programa":"1135897","titulo":"Bora Entender?"},{"id_canal":"1682","st_titulo":"ponto_de_vista","dh_inicio":"2025-08-13T13:00Z","id_cidade":"1","dh_fim":"2025-08-13T13:30Z","id_programa":"163320","titulo":"Ponto de Vista"},{"id_canal":"1682","st_titulo":"reapresentacao_de_comissao","dh_inicio":"2025-08-13T13:30Z","id_cidade":"1","dh_fim":"2025-08-13T16:30Z","id_programa":"241044","titulo":"Reapresentação de Comissão"},{"id_canal":"1682","st_titulo":"documentario_tv_camara_serie_acessibilidade","dh_inicio":"2025-08-13T16:30Z","id_cidade":"1","dh_fim":"2025-08-13T16:45Z","id_programa":"1262921","titulo":"Documentário TV Câmara: Série Acessibilidade"},{"id_canal":"1682","st_titulo":"documentario_tv_camara","dh_inicio":"2025-08-13T16:45Z","id_cidade":"1","dh_fim":"2025-08-13T17:00Z","id_programa":"1234586","titulo":"Documentário TV Câmara"},{"id_canal":"1682","st_titulo":"camara_debate","dh_inicio":"2025-08-13T17:00Z","id_cidade":"1","dh_fim":"2025-08-13T17:30Z","id_programa":"521830","titulo":"Câmara Debate"},{"id_canal":"1682","st_titulo":"ciencia_sem_limites","dh_inicio":"2025-08-13T17:30Z","id_cidade":"1","dh_fim":"2025-08-13T18:00Z","id_programa":"433576","titulo":"Ciência Sem Limites"},{"id_canal":"1682","st_titulo":"reapresentacao_de_comissao","dh_inicio":"2025-08-13T18:00Z","id_cidade":"1","dh_fim":"2025-08-13T20:00Z","id_programa":"241044","titulo":"Reapresentação de Comissão"},{"id_canal":"1682","st_titulo":"documentario_fiocruz","dh_inicio":"2025-08-13T20:00Z","id_cidade":"1","dh_fim":"2025-08-13T20:30Z","id_programa":"1354540","titulo":"Documentário Fiocruz"},{"id_canal":"1682","st_titulo":"elas_pautam","dh_inicio":"2025-08-13T20:30Z","id_cidade":"1","dh_fim":"2025-08-13T21:00Z","id_programa":"868184","titulo":"Elas Pautam"},{"id_canal":"1682","st_titulo":"palavra_aberta","dh_inicio":"2025-08-13T21:00Z","id_cidade":"1","dh_fim":"2025-08-13T21:30Z","id_programa":"944547","titulo":"Palavra Aberta"},{"id_canal":"1682","st_titulo":"ponto_de_vista","dh_inicio":"2025-08-13T21:30Z","id_cidade":"1","dh_fim":"2025-08-13T22:00Z","id_programa":"163320","titulo":"Ponto de Vista"},{"id_canal":"1682","st_titulo":"documentario_sesc_tv","dh_inicio":"2025-08-13T22:00Z","id_cidade":"1","dh_fim":"2025-08-13T23:00Z","id_programa":"1340642","titulo":"Documentário Sesc TV"},{"id_canal":"1682","st_titulo":"camara_debate","dh_inicio":"2025-08-13T23:00Z","id_cidade":"1","dh_fim":"2025-08-13T23:30Z","id_programa":"521830","titulo":"Câmara Debate"},{"id_canal":"1682","st_titulo":"palavra_aberta","dh_inicio":"2025-08-13T23:30Z","id_cidade":"1","dh_fim":"2025-08-14T00:00Z","id_programa":"944547","titulo":"Palavra Aberta"}],"numFound":23,"start":0},"responseHeader":{"QTime":35,"params":{"q":"id_revel:(1_1682 ) AND id_cidade:1","fl":"dh_fim dh_inicio st_titulo titulo id_programa id_canal id_cidade","start":"0","sort":"id_canal asc,dh_inicio asc","fq":"dh_inicio:[2025-8-13T00:00:00Z TO 2025-8-13T23:59:00Z]","rows":"100000","wt":"json"},"status":0}} \ No newline at end of file From bab7afbd38139af446772a0fc39011ccb23b1a1e Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:22:30 +0300 Subject: [PATCH 2/6] Create no_content.json --- sites/claro.com.br/__data__/no_content.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 sites/claro.com.br/__data__/no_content.json diff --git a/sites/claro.com.br/__data__/no_content.json b/sites/claro.com.br/__data__/no_content.json new file mode 100644 index 00000000..ebf11a5f --- /dev/null +++ b/sites/claro.com.br/__data__/no_content.json @@ -0,0 +1 @@ +{"response":{"docs":[],"numFound":0,"start":0},"responseHeader":{"QTime":35,"params":{"q":"id_revel:(1_1689) AND id_cidade:1","fl":"dh_fim dh_inicio st_titulo titulo id_programa id_canal id_cidade","start":"0","sort":"id_canal asc,dh_inicio asc","fq":"dh_inicio:[2025-8-13T00:00:00Z TO 2025-8-13T23:59:00Z]","rows":"100000","wt":"json"},"status":0}} \ No newline at end of file From c02e93210c35b43f8eb07483de5eb7aca3c20ec6 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:26:22 +0300 Subject: [PATCH 3/6] Create claro.com.br.test.js --- sites/claro.com.br/claro.com.br.test.js | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 sites/claro.com.br/claro.com.br.test.js diff --git a/sites/claro.com.br/claro.com.br.test.js b/sites/claro.com.br/claro.com.br.test.js new file mode 100644 index 00000000..9ef6e864 --- /dev/null +++ b/sites/claro.com.br/claro.com.br.test.js @@ -0,0 +1,47 @@ +const { parser, url } = require('./claro.com.br.config.js') +const fs = require('fs') +const path = require('path') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const customParseFormat = require('dayjs/plugin/customParseFormat') +dayjs.extend(customParseFormat) +dayjs.extend(utc) + +const date = dayjs.utc('2025-08-13', 'YYYY-MM-DD').startOf('d') +const channel = { site_id: '1_1682' } + +it('can generate valid url', () => { + expect(url({ channel, date })).toBe( + 'https://programacao.claro.com.br/gatekeeper/exibicao/select?q=id_revel:(1_1682)+AND+id_cidade:1&wt=json&rows=100000&start=0&sort=id_canal+asc,dh_inicio+asc&fl=dh_fim+dh_inicio+st_titulo+titulo+id_programa+id_canal+id_cidade&fq=dh_inicio:[2025-8-13T00:00:00Z+TO+2025-8-13T23:59:00Z]' + ) +}) + +it('can parse response', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json')) + let results = parser({ content }) + results = results.map(p => { + p.start = p.start.toJSON() + p.stop = p.stop.toJSON() + + return p + }) + + expect(results.length).toBe(23) + expect(results[0]).toMatchObject({ + title: 'Encontro Com a Autora', + start: '2025-08-13T03:00:00.000Z', + stop: '2025-08-13T04:00:00.000Z' + }) + expect(results[22]).toMatchObject({ + title: 'Palavra Aberta', + start: '2025-08-14T02:30:00.000Z', + stop: '2025-08-14T03:00:00.000Z' + }) +}) + +it('can handle empty guide', () => { + const content = fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json')) + const results = parser({ content }) + + expect(results).toMatchObject([]) +}) From 9922ed7536cf4b585d7a729b2650856466fc5407 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:26:31 +0300 Subject: [PATCH 4/6] Create claro.com.br.config.js --- sites/claro.com.br/claro.com.br.config.js | 59 +++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 sites/claro.com.br/claro.com.br.config.js diff --git a/sites/claro.com.br/claro.com.br.config.js b/sites/claro.com.br/claro.com.br.config.js new file mode 100644 index 00000000..1047ece9 --- /dev/null +++ b/sites/claro.com.br/claro.com.br.config.js @@ -0,0 +1,59 @@ +const dayjs = require('dayjs') +const timezone = require('dayjs/plugin/timezone') +const customParseFormat = require('dayjs/plugin/customParseFormat') +const axios = require('axios') + +dayjs.extend(timezone) +dayjs.extend(customParseFormat) + +module.exports = { + site: 'claro.com.br', + url({ channel, date }) { + return `https://programacao.claro.com.br/gatekeeper/exibicao/select?q=id_revel:(${ + channel.site_id + })+AND+id_cidade:1&wt=json&rows=100000&start=0&sort=id_canal+asc,dh_inicio+asc&fl=dh_fim+dh_inicio+st_titulo+titulo+id_programa+id_canal+id_cidade&fq=dh_inicio:[${date.format( + 'YYYY-M-D[T]HH:mm:ss[Z]' + )}+TO+${date.add(1, 'd').subtract(1, 'm').format('YYYY-M-D[T]HH:mm:ss[Z]')}]` + }, + parser({ content }) { + const items = parseItems(content) + + return items.map(item => { + return { + title: item.titulo, + start: parseTime(item.dh_inicio), + stop: parseTime(item.dh_fim) + } + }) + }, + async channels() { + const data = await axios + .get( + 'https://programacao.claro.com.br/gatekeeper/canal/select?q=id_cidade:1&rows=300&wt=json&sort=cn_canal+asc&fl=id_canal+st_canal+cn_canal+nome+url_imagem+id_cidade&fq=nome:*&fq=id_categoria:*' + ) + .then(r => r.data) + .catch(console.error) + + return data.response.docs.map(channel => { + return { + site_id: `${channel.id_cidade}_${channel.id_canal}`, + name: channel.nome, + lang: 'pt' + } + }) + } +} + +function parseTime(time) { + return dayjs.tz(time, 'YYYY-M-D[T]HH:mm[Z]', 'America/Sao_Paulo') +} + +function parseItems(content) { + try { + const data = JSON.parse(content) + if (!data || !data.response || !Array.isArray(data.response.docs)) return [] + return data.response.docs + } catch { + return [] + } +} From a5a6e7ad23da0b2f89f4e0eca724a413d78b6c4b Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:26:38 +0300 Subject: [PATCH 5/6] Create claro.com.br.channels.xml --- sites/claro.com.br/claro.com.br.channels.xml | 276 +++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 sites/claro.com.br/claro.com.br.channels.xml diff --git a/sites/claro.com.br/claro.com.br.channels.xml b/sites/claro.com.br/claro.com.br.channels.xml new file mode 100644 index 00000000..5bfe1943 --- /dev/null +++ b/sites/claro.com.br/claro.com.br.channels.xml @@ -0,0 +1,276 @@ + + + Animal Planet + BBC World News + cartoonito + Canal Brasil + CNN International + Discovery Turbo + Discovery Kids + Discovery Channel + Discovery Science + E! + ESPN + ESPN 2 + Futura + Gazeta + GloboNews + GNT + Globo + HBO 2 + HBO + Discovery Home & Health + HBO Family + HBO Signature + Sexy Hot + HBO Xtreme + Hbo Mundi + Multishow + Hbo Pop + MTV + A&E + Shoptime + NHK World Premium + Nickelodeon + Playboy TV + Record + Canal Rural + SBT + SporTV 2 + SporTV + National Geographic + Telecine Premium + Telecine Action + Telecine Touch + Telecine Pipoca + Telecine Cult + TNT + ID + TV5 Monde + AXN + Universal TV + Rede Vida + Combate + Disney Channel + FX + Cinecanal + Canal do Boi + TCM + Venus + Syfy + Lifetime + Megapix + Modo viagem HD + Band HD + Canal de Vendas NET + Globo HD + MTV HD ³ + Record News + Rede 21 + TV Korea + Studio Universal + Premiere 7 + Sextreme + Nick Jr. + Mega TV + Telecine Premium HD ³ + Terra Viva + HBO HD ³ + SBT HD + BIS HD ³ + Telecine Pipoca HD ³ + Viva + TNT HD ³ + Space HD ³ + Discovery Theater HD ³ + Megapix HD ³ + TLC HD ³ + RIT TV + Space + Telecine Action HD ³ + Telecine Fun + E! HD + Animal Planet HD + Lifetime HD + Baby Tv + FOOD NETWORK HD + Cinecanal HD + Food Network + Band News HD + Record HD + Sony HD ³ + History 2 HD + Mosaico Multijogos + AXN HD ³ + Telecine Fun HD ³ + Telecine Touch HD ³ + Off HD ³ + Band Sports + Band News + SporTV 3 + Tnt novelas + Combate HD + Espn 4 + ESPN 4 HD + Disney Channel HD ³ + Cinemax + Gloob + Gloob HD ³ + Cultura HD + SporTV 2 HD ³ + ESPN HD ³ + GNT HD ³ + Curta! + Modo viagem + BIS + Off + Play TV + Woohoo + ID HD ³ + Discovery HD ³ + Discovery Home & Health HD ³ + Multishow HD ³ + SporTV HD ³ + Premiere HD 2 + GloboNews HD ³ + Prime Box Brazil + Music Box Brazil + Arte 1 + Discovery Kids HD ³ + HBO Signature HD ³ + Comedy Central + ESPN 6 HD + Polishop + Band Sports HD ³ + Cinemax HD ³ + HBO Family HD ³ + Telecine Cult HD ³ + Star Channel + FX HD ³ + Viva HD + Canal Brasil HD ³ + Discovery Turbo HD ³ + SporTV 3 HD ³ + Discovery world HD ³ + Cultura + Rede TV + PREMIERE HD 3 ³ + PREMIERE HD 4 ³ + PREMIERE HD 5 ³ + Tv Aparecida + Canal 2 + A&E HD + FISH TV + TNT SÉRIES HD + Bloomberg TV + Boa Vontade TV + Cartoon Network + DW-TV + Gazeta HD + HBO HD 2 ³ + Jogos Interativos Cartoon + National Geographic HD ³ + Premiere 2 + Premiere 3 + Premiere 4 + Premiere 5 + Premiere 6 + Premiere Clubes + Premiere Clubes HD + RAI International + Rede TV HD + SIC International + Sony + TLC + TV Climatempo + TV Rá Tim Bum + TVE International + Nickelodeon HD + Music Box Brazil HD ³ + Tnt novelas HD + AMC + AMC HD + Prime Box Brazil HD ³ + Rede Vida HD + Canal Universitário + TV Câmara + TV Brasil + Canal Legislativo + TV Escola + TV Justiça + TV Senado + Canal Comunitário + Rede Gospel + Arte 1 HD + Syfy HD + Studio Universal HD + Mega TV HD + Rede Gospel HD + Premiere HD 6 + Nick Jr HD ³ + Comedy Central HD + Curta! HD + Cartoonito HD + TV Rá Tim Bum HD ³ + Discovery Science HD ³ + Premiere HD 7 + Futura HD + ZooMoo + ZooMoo HD + Woohoo HD + TV Brasil HD + LIKE HD + Film&Arts HD + Film&Arts + ESPN 5 HD + MTV Live HD + Universal TV HD + FISH TV HD + Band + ESPN 3 HD + The History Channel + Fashion TV HD + Travel Box Brasil HD + TV Pai Eterno + Playboy HD + DogTV HD + TV Pai Eterno HD + TV Brasil 2 + Eurochannel HD + HGTV + HGTV HD + HBO + + HBO + HD + CNN Brasil + CNN Brasil HD + HBO Xtreme HD + Agro Mais + HBO MUNDI HD + CGTN + Agro Mais HD + History Hd + Trace Brazuca HD + HBO POP HD + TV Aparecida (espelho) + CONMEBOL TV 4 HD + Gloobinho + Gloobinho HD + Paramount Network + Paramount Network HD + STAR CHANNEL HD + JP News HD + Canal do Boi HD + ESPN 2 HD + Sabor & Arte HD + Shoptime TV + Polishop TV + Música + France 24 HD + Warner Channel + Canal do cliente + France 24 + Portal do Futebol + Warner Channel HD + Cartoon Network HD + CANAL DO CLIENTE HD + From 14f697fc4c2cf8014589159e0dc075a34852001e Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Tue, 12 Aug 2025 08:26:46 +0300 Subject: [PATCH 6/6] Create readme.md --- sites/claro.com.br/readme.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 sites/claro.com.br/readme.md diff --git a/sites/claro.com.br/readme.md b/sites/claro.com.br/readme.md new file mode 100644 index 00000000..5dbc44ae --- /dev/null +++ b/sites/claro.com.br/readme.md @@ -0,0 +1,21 @@ +# claro.com.br + +https://www.claro.com.br/tv-por-assinatura/programacao/grade + +### Download the guide + +```sh +npm run grab --- --site=claro.com.br +``` + +### Update channel list + +```sh +npm run channels:parse --- --config=./sites/claro.com.br/claro.com.br.config.js --output=./sites/claro.com.br/claro.com.br.channels.xml +``` + +### Test + +```sh +npm test --- claro.com.br +```