From 94b3ed19bf32854f8a159c253bc046b54715ea4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1s=20Afonso?=
<168651587+thomraider12@users.noreply.github.com>
Date: Sat, 6 Sep 2025 21:08:12 +0100
Subject: [PATCH 01/11] Create vodafone.pt.channels.xml
---
sites/vodafone.pt/vodafone.pt.channels.xml | 1 +
1 file changed, 1 insertion(+)
create mode 100644 sites/vodafone.pt/vodafone.pt.channels.xml
diff --git a/sites/vodafone.pt/vodafone.pt.channels.xml b/sites/vodafone.pt/vodafone.pt.channels.xml
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sites/vodafone.pt/vodafone.pt.channels.xml
@@ -0,0 +1 @@
+
From df03416b56fc4cfb5a75878d950022d0cc37a764 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1s=20Afonso?=
<168651587+thomraider12@users.noreply.github.com>
Date: Sat, 6 Sep 2025 21:09:03 +0100
Subject: [PATCH 02/11] Create vodafone.pt.config.js
---
sites/vodafone.pt/vodafone.pt.config.js | 1 +
1 file changed, 1 insertion(+)
create mode 100644 sites/vodafone.pt/vodafone.pt.config.js
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -0,0 +1 @@
+
From 2ea810532c7b3d03a894d067e7e36c9a7657b7c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1s=20Afonso?=
<168651587+thomraider12@users.noreply.github.com>
Date: Sat, 6 Sep 2025 21:09:21 +0100
Subject: [PATCH 03/11] Create vodafone.pt.test.js
---
sites/vodafone.pt/vodafone.pt.test.js | 1 +
1 file changed, 1 insertion(+)
create mode 100644 sites/vodafone.pt/vodafone.pt.test.js
diff --git a/sites/vodafone.pt/vodafone.pt.test.js b/sites/vodafone.pt/vodafone.pt.test.js
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/sites/vodafone.pt/vodafone.pt.test.js
@@ -0,0 +1 @@
+
From 7491809354abd11d4c40402f135e7cd9ab99dd91 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1s=20Afonso?=
<168651587+thomraider12@users.noreply.github.com>
Date: Sat, 6 Sep 2025 21:10:01 +0100
Subject: [PATCH 04/11] Create readme.md
---
sites/vodafone.pt/readme.md | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 sites/vodafone.pt/readme.md
diff --git a/sites/vodafone.pt/readme.md b/sites/vodafone.pt/readme.md
new file mode 100644
index 00000000..b5f697ae
--- /dev/null
+++ b/sites/vodafone.pt/readme.md
@@ -0,0 +1,19 @@
+# vodafone.pt
+
+### Download the guide
+
+```sh
+npm run grab --- --site=meo.pt
+```
+
+### Update channel list
+
+```sh
+npm run channels:parse --- --config=./sites/meo.pt/meo.pt.config.js --output=./sites/meo.pt/meo.pt.channels.xml
+```
+
+### Test
+
+```sh
+npm test --- meo.pt
+```
From 0ab1df34b6bfee6e7880862e1744cbb5fcfe4030 Mon Sep 17 00:00:00 2001
From: thomraider12 <168651587+thomraider12@users.noreply.github.com>
Date: Sun, 7 Sep 2025 18:45:17 +0100
Subject: [PATCH 05/11] Add vodafone.pt channels and try to make the config
file
---
sites/vodafone.pt/readme.md | 6 +-
sites/vodafone.pt/vodafone.pt.channels.xml | 164 ++++++++++++++++++++-
sites/vodafone.pt/vodafone.pt.config.js | 102 +++++++++++++
3 files changed, 268 insertions(+), 4 deletions(-)
diff --git a/sites/vodafone.pt/readme.md b/sites/vodafone.pt/readme.md
index b5f697ae..a015f0b1 100644
--- a/sites/vodafone.pt/readme.md
+++ b/sites/vodafone.pt/readme.md
@@ -3,17 +3,17 @@
### Download the guide
```sh
-npm run grab --- --site=meo.pt
+npm run grab --- --site=vodafone.pt
```
### Update channel list
```sh
-npm run channels:parse --- --config=./sites/meo.pt/meo.pt.config.js --output=./sites/meo.pt/meo.pt.channels.xml
+npm run channels:parse --- --config=./sites/vodafone.pt/vodafone.pt.config.js --output=./sites/vodafone.pt/vodafone.pt.channels.xml
```
### Test
```sh
-npm test --- meo.pt
+npm test --- vodafone.pt
```
diff --git a/sites/vodafone.pt/vodafone.pt.channels.xml b/sites/vodafone.pt/vodafone.pt.channels.xml
index 8b137891..240210bc 100644
--- a/sites/vodafone.pt/vodafone.pt.channels.xml
+++ b/sites/vodafone.pt/vodafone.pt.channels.xml
@@ -1 +1,163 @@
-
+
+
+ RTP1
+ RTP2
+ SIC
+ TVI
+ SIC Noticias
+ RTP3
+ CNN Portugal
+ CMTV
+ News Now
+ Globo
+ Canal 11
+ V+ TVI
+ Porto Canal
+ SIC Caras
+ SIC Radical
+ SIC Mulher
+ RTP Memória
+ SportTV+
+ SportTV1
+ SportTV2
+ SportTV3
+ SportTV4
+ SportTV5
+ SportTV6
+ SportTV7
+ Eurosport 1
+ Eurosport 2
+ A Bola TV
+ BTV
+ Sporting TV
+ DAZN 1
+ DAZN 2
+ DAZN 3
+ DAZN 4
+ DAZN 5
+ DAZN 6
+ W-Sport
+ Fight Network
+ FightBox
+ Nautical
+ Channel
+ Fuel TV
+ SportTV NBA
+ Disney Channel
+ Disney Jr.
+ Panda Kids
+ Cartoon Network
+ Canal Panda
+ BabyTV
+ SIC K
+ CARTOONITO
+ Nickelodeon
+ Super RTL
+ Biggs
+ Dizi
+ SIC Novelas
+ Canal
+ Hollywood
+ CineMundo
+ STAR Movies
+ STAR Channel
+ AXN
+ STAR Life
+ STAR Crime
+ STAR Comedy
+ AXN White
+ AXN Movies
+ SyFy
+ AMC
+ Eurochannel PT
+ Canal Q
+ MTV
+ MTV 00s
+ MCM Top
+ MCM Pop
+ CMusicTV
+ Mezzo
+ Afro Music
+ Trace Urban
+ Trace Toca
+ Mezzo Live
+ 24Kitchen
+ Casa e Cozinha
+ Food Network
+ Discovery
+ Channel
+ National
+ Geographic
+ Nat
+ Geo Wild
+ História
+ Odisseia
+ DocuBox
+ AMC Crime
+ Investigation
+ Discovery
+ Record Europa
+ AMC Break
+ TLC
+ E!
+ Travel Channel
+ Fashion
+ HGTV
+ M6
+ Fast & Fun Box
+ GINX ESports TV
+ Luxe.tv
+ InSight TV
+ My Zen TV
+ GameToon
+ ARTV
+ Record News
+ CNN
+ Euronews
+ PT
+ Euronews
+ Bloomberg
+ SkyNews
+ BBC World News
+ CNBC
+ AlJazeera
+ Rai News
+ 24h
+ DW
+ France 24
+ Français
+ France 24
+ English
+ TCV News
+ Phoenix
+ RTP Madeira
+ RTP Açores
+ Localvisão TV
+ RTP África
+ TPA
+ Canal 180
+ Galicia
+
+ TVE
+ TV5Monde
+ Rai 1
+ Vox
+ RTL
+ Pro TV
+ International
+ KBS World
+ Arirang
+ NHK World
+
+ Cubavisión
+ Freedom
+ Canção Nova
+ uniFÉ
+ Kuriakos TV
+ BenficaTV Multicam 1
+ BenficaTV Multicam 2
+ BenficaTV Multicam 3
+ BenficaTV Multicam 4
+ Conta Lá
+
\ No newline at end of file
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
index 8b137891..560bac56 100644
--- a/sites/vodafone.pt/vodafone.pt.config.js
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -1 +1,103 @@
+const { DateTime } = require('luxon')
+const fs = require('fs')
+const path = require('path')
+module.exports = {
+ site: 'vodafone.pt',
+ url: 'https://cdn.pt.vtv.vodafone.com/epg/',
+ days: 7,
+ periods: [
+ '06-12', '12-18', '18-00', '00-06',
+ ],
+
+ request: {
+ method: 'GET',
+ headers: {
+ Origin: 'https://www.vodafone.pt',
+ Referer: 'https://www.vodafone.pt/',
+ 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
+ Accept: 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
+ },
+ path: ({ channel, date, period }) => {
+ const raw = String(period || '')
+ let p = raw.trim()
+ const hasJsonSuffix = /\.json$/i.test(p)
+ p = p.replace(/\s+/g, '')
+ p = p.replace(/:/g, '-')
+ p = p.replace(/_/g, '-')
+ p = p.replace(/h$/i, '')
+ p = p.replace(/Z$/i, '')
+ p = p.replace(/(^|-)0+([0-9])/g, (m, a, b) => (a || '') + b)
+ p = p.replace(/[^0-9\-\.]/g, '')
+ if (hasJsonSuffix && !/\.json$/i.test(p)) p = p + '.json'
+ const year = date.toFormat('yyyy')
+ const month = date.toFormat('MM')
+ const day = date.toFormat('dd')
+ return `${channel}/${year}/${month}/${day}/${p}`
+ }
+ },
+
+ parser({ content }) {
+ if (!content) return []
+ let programs = []
+ let data
+ try {
+ data = JSON.parse(content)
+ } catch (err) {
+ return []
+ }
+ const items = data?.result?.objects || []
+ items.forEach(item => {
+ if (!item.startDate || !item.endDate) return
+ let start = DateTime.fromSeconds(item.startDate, { zone: 'UTC' }).toUTC()
+ let stop = DateTime.fromSeconds(item.endDate, { zone: 'UTC' }).toUTC()
+ if (stop < start) {
+ stop = stop.plus({ days: 1 })
+ }
+ const prog = {
+ title: item.name || 'Sem título',
+ start,
+ stop
+ }
+ if (item.description) prog.description = item.description
+ if (item.metas?.year?.value) prog.year = item.metas.year.value
+ if (item.tags?.genre?.objects) {
+ prog.category = item.tags.genre.objects.map(g => g.value)
+ }
+ programs.push(prog)
+ })
+ return programs
+ },
+
+ async channels() {
+ const channelListPath = path.join(__dirname, 'channel.list')
+ let content
+ try {
+ content = fs.readFileSync(channelListPath, 'utf8')
+ } catch (err) {
+ return []
+ }
+ const lines = content.split(/\r?\n/)
+ const channels = lines
+ .map(l => {
+ const line = l.replace(/^#.*$/, '').trim()
+ if (!line) return null
+ let parts = line.split('\t')
+ if (parts.length === 1) parts = line.split('|')
+ if (parts.length === 1) parts = line.split(/\s+/)
+ if (!parts[0]) return null
+ const id = parts[0].trim()
+ let name = parts[1] ? parts[1].replace(/"/g, '').trim() : id
+ const icon = parts[2] ? parts[2].trim() : undefined
+ return {
+ lang: 'pt',
+ site_id: id,
+ name,
+ icon
+ }
+ })
+ .filter(Boolean)
+ return channels
+ }
+}
From 3b3fac8ab71aa4cab91b0d5c557628fc9c330809 Mon Sep 17 00:00:00 2001
From: thomraider12 <168651587+thomraider12@users.noreply.github.com>
Date: Sun, 7 Sep 2025 18:52:51 +0100
Subject: [PATCH 06/11] delete config because it gives 400 errors
---
sites/vodafone.pt/vodafone.pt.config.js | 103 ------------------------
1 file changed, 103 deletions(-)
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
index 560bac56..e69de29b 100644
--- a/sites/vodafone.pt/vodafone.pt.config.js
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -1,103 +0,0 @@
-const { DateTime } = require('luxon')
-const fs = require('fs')
-const path = require('path')
-
-module.exports = {
- site: 'vodafone.pt',
- url: 'https://cdn.pt.vtv.vodafone.com/epg/',
- days: 7,
- periods: [
- '06-12', '12-18', '18-00', '00-06',
- ],
-
- request: {
- method: 'GET',
- headers: {
- Origin: 'https://www.vodafone.pt',
- Referer: 'https://www.vodafone.pt/',
- 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
- Accept: 'application/json, text/javascript, */*; q=0.01',
- 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
- },
- path: ({ channel, date, period }) => {
- const raw = String(period || '')
- let p = raw.trim()
- const hasJsonSuffix = /\.json$/i.test(p)
- p = p.replace(/\s+/g, '')
- p = p.replace(/:/g, '-')
- p = p.replace(/_/g, '-')
- p = p.replace(/h$/i, '')
- p = p.replace(/Z$/i, '')
- p = p.replace(/(^|-)0+([0-9])/g, (m, a, b) => (a || '') + b)
- p = p.replace(/[^0-9\-\.]/g, '')
- if (hasJsonSuffix && !/\.json$/i.test(p)) p = p + '.json'
- const year = date.toFormat('yyyy')
- const month = date.toFormat('MM')
- const day = date.toFormat('dd')
- return `${channel}/${year}/${month}/${day}/${p}`
- }
- },
-
- parser({ content }) {
- if (!content) return []
- let programs = []
- let data
- try {
- data = JSON.parse(content)
- } catch (err) {
- return []
- }
- const items = data?.result?.objects || []
- items.forEach(item => {
- if (!item.startDate || !item.endDate) return
- let start = DateTime.fromSeconds(item.startDate, { zone: 'UTC' }).toUTC()
- let stop = DateTime.fromSeconds(item.endDate, { zone: 'UTC' }).toUTC()
- if (stop < start) {
- stop = stop.plus({ days: 1 })
- }
- const prog = {
- title: item.name || 'Sem título',
- start,
- stop
- }
- if (item.description) prog.description = item.description
- if (item.metas?.year?.value) prog.year = item.metas.year.value
- if (item.tags?.genre?.objects) {
- prog.category = item.tags.genre.objects.map(g => g.value)
- }
- programs.push(prog)
- })
- return programs
- },
-
- async channels() {
- const channelListPath = path.join(__dirname, 'channel.list')
- let content
- try {
- content = fs.readFileSync(channelListPath, 'utf8')
- } catch (err) {
- return []
- }
- const lines = content.split(/\r?\n/)
- const channels = lines
- .map(l => {
- const line = l.replace(/^#.*$/, '').trim()
- if (!line) return null
- let parts = line.split('\t')
- if (parts.length === 1) parts = line.split('|')
- if (parts.length === 1) parts = line.split(/\s+/)
- if (!parts[0]) return null
- const id = parts[0].trim()
- let name = parts[1] ? parts[1].replace(/"/g, '').trim() : id
- const icon = parts[2] ? parts[2].trim() : undefined
- return {
- lang: 'pt',
- site_id: id,
- name,
- icon
- }
- })
- .filter(Boolean)
- return channels
- }
-}
From 9e4ac87d603aee94ac79d58dffa5b2d3feee2343 Mon Sep 17 00:00:00 2001
From: thomraider12 <168651587+thomraider12@users.noreply.github.com>
Date: Sun, 7 Sep 2025 19:00:47 +0100
Subject: [PATCH 07/11] correct xmltv_ids
---
sites/vodafone.pt/vodafone.pt.channels.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/sites/vodafone.pt/vodafone.pt.channels.xml b/sites/vodafone.pt/vodafone.pt.channels.xml
index 240210bc..05bf0cdd 100644
--- a/sites/vodafone.pt/vodafone.pt.channels.xml
+++ b/sites/vodafone.pt/vodafone.pt.channels.xml
@@ -8,7 +8,7 @@
RTP3
CNN Portugal
CMTV
- News Now
+ News Now
Globo
Canal 11
V+ TVI
@@ -59,17 +59,17 @@
SIC Novelas
Canal
Hollywood
- CineMundo
+ CineMundo
STAR Movies
STAR Channel
AXN
STAR Life
STAR Crime
STAR Comedy
- AXN White
+ AXN White
AXN Movies
SyFy
- AMC
+ AMC
Eurochannel PT
Canal Q
MTV
From 784487565bee380d6b0c28ba410831baaa6d862e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Isma=C3=ABl=20Moret?=
<30985701+BellezaEmporium@users.noreply.github.com>
Date: Thu, 25 Sep 2025 07:45:42 +0000
Subject: [PATCH 08/11] CRLF
---
.../__data__/Aneka 11 November 2021.pdf | Bin 204416 -> 204109 bytes
.../__data__/Sukmaindera 11 November 2021.pdf | Bin 183583 -> 183353 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/sites/rtb.gov.bn/__data__/Aneka 11 November 2021.pdf b/sites/rtb.gov.bn/__data__/Aneka 11 November 2021.pdf
index 9e8246859c2b38cc36ff3261602a223ece418c16..46175820e406029ca2d3b94b3fe4257851b46ae7 100644
GIT binary patch
delta 3202
zcmZuzTWDNG80MU{R8H4q3+<*!n(Wqgn++j4w=-wvB~)mGt*G^aFQv3mQ;8(8u2BRd
zo6;wXLX(3YP^fL*3WbWn9uY64_^2pSC?Z(3eK!yKC~@ZOT+W%@dD{KvzkT2T|FgUD
zP5H;K%GJj4!_$-SkuYd{Ax;46p#Iv6udWVG^arzxFN==>QqT*N2ErXEULHHO`p@qM
zCLK6AyY7!Zgb@v=rh+$?TC+0?8$115&Sh5pu>k*cju#Na?^}GqebD_@+{8G_nK#+4dyXPHyq4bEi(7w1fc+*}eRpQOQ
zMm#X|uD#IO$nt+0`qo}3b>hpzS1qUokk)sGhvG|nzqXfJ37KPUq-8I(6kF)g_?3sR
z+lxH$$=X}?!ZN>SKxA1D#E16pjqlc{CbT3-F%M4Ek>vX9$-24H+$(4}p4(^ZLYn)z
z1Ch<5dAr3T&3&^^rk}N`6>phZGR>#f%qyrKZynek|F{2jn@O`Tq_@n8@JNj{w(Jka
ze>axxh3&cHp?GgBj}gzBE7F~*M-VeR^_$HT4-QG$ic^oZB$D|GJY|?;C5d2;r3g9Z
z*>|yyaRsf}+**!2W2|M^Lblgf%kVG$wW%9Plmwa3%r=-P1u{zUP*~ObcAkeR551F>
zS~n@8)RDE5Kx?R|W-S4gFktS^)y>&ePRubF
z(c`-f39A_eoxEeK-iFPqrYR$n>{#=5o4n&|-uojvg8Ad8U)n~SpFMUiy>;FD{JHea
zl7BnsRgaQe)`LtvyOPU&{wFq{l3(VlB@6w&<$0msFY_MrKvZ+G63h8_GyUUnKk$0E
zgsOENRtJyymet{7{!_Iyp7ZxSkX~ExZ-QR#s>A7pOMYZ$IaEDNZ-44nb8xP8qh-XY
znecS{ia*}7KGix|A2xztTlYVl>Q#>FVRGtE|2Ly#s5|%MU;cL%RZUQ0al3Bm6Ziay
zp2ZYevT;AxlArJU0QRa#w?tG_O-Qx$yxAIRw+0hrw}$Gixlt`$(Ug$#1l-pW_NF!t2>RLr8bXi6r>T;yK3*tgi
z!CxGsB7;CzrVC>@6eC!)BFvSagb4E<8c4vGb0Nf!C0YOfDh^YKs$ftxTa#=#efI}Q29yuf-21JC<^w;u3j9e{*
z63Cfr0l6Jv7)Q!ro|-0TbXM$Y`IcQjnNtwcqfcAkH1xaQ~br@)e2
zhgR}`0om2^8~san#3hFAq+2?d5IRAXc(ZUCtmWy@N`Bm*9Q<*6ynBpvOrL=
z3W!F88r5NcYz#Uk5uv@rg%u+@op(YaO2>wkqdDkC6H;yzk))f5QKR|}tQfILIZ1Kp
z_4}(^{R=xUfm{ms)ci9wI0IC(31?uf+%aDhT3vp^fBD{D;L;k9I%wrSOa(k=ua6(v
zR_b`pXaukYXw1)-E&l<`04S;EfmOMnU$busvjYQ?{TVcTc~F$s%C5L<17LqsEx
zuh8H3#N)vEqwgazSrz#?V|DVV}{-Q%`|_uy13GfQLcz`#e)BA^F3Hs
z_o!9(n?4inc(c#!^*WCf(+vzq(N5g>P5O{&8J+VS-QX}UI6iIO4G^zRn+M8rQ`e4|
z#UA(;gieY>6@^yj+y
z)XoUZh!I&M2@MmjK8g~BF>%3;gR!9)8YZ5b-Xx}orM+WHGB6|xlAdv?Ice{L
zQa3#W4M82ADuNMVUTQ(9@pNaTCPWGvrp!$r1*v%=RTwjmyV76+8g>xEDc9J=Tzyou
zK?VnhBWTzqq;+WH<0&=HQd5P6aGmsigq*7MzJ*6nR&(6AeAsaEAR^Dwq-JA#)(?hRsARp%8Eud2NNU)Au$>?;%dyYV-P{G
z5%FLmKDG}nD?W2m4=X`t_YjHTMtof6CzS~OF-T06+~vBV4~|-(5PKg
zI2HI4ZDg)-bhtdwe`LH@pYuZ_=bHH~S#443XPQ*$-AvD-8l{dX%@*^)Z@FXYHdo-)
z+_b{HSna!}6AEXlc12JsJXpA4gA{_1I+jp62OXOm-
zwg&H;azShJpYzq83}~|1jX;@BHODnnqYarwwsOjeLz>SPxx>RHDbo_x!JWm8#@v1V4c!k~R$o&@marVeZCTQ5`dUl+o#=WV
zd|bORqLF_6%<>;8vnez~49ii}^V82now;asYq7o^M
zPjuC3kt7)r=fSQUlQggU!<-sCM2=1Ut``LvD2c|!K`5FPB7+0^U|nCmn)sc4o0`Y3
zoGGrWb%P8R4*fMbTb>Crlhd`TW!iq`m!RcgbVd8aH;-%8izbBI&T3Qj%76%(PlO##
zk7&!o_7UynLbWgQHhMyTR9g}Dj%xQ+h(rz`2o5)$)0BqFo^#sBvIb+YbI)mgN$Hd(JpEr^8iPe=!p~FsO?gi^_E;bDzn$IV<$(hRGAT8XTBc*$#5MsJ
z3q!7anL`S4A=VHO~$YTmJ?NsBAB5hWP6Z667sCH
z3dS5M-Pn0pFXad$#$Tz#L5wjo!9OgSBF4mpflfkp
zT0e$dQ{)V6Y8+l?R8*{l5fzus3WN=s^?i#C<5-sC`c8QP=+qrMvAGDAcz~qY~1Lgi_)cZ(|g~{y>s538R*?)a?U;H
z{Lk;4H*bD9-}&9woqhSyk=*%Y%
zO6yi$9Q&NFwJrb`Q?6gF*=Jnm*i?C<^s&3}w%yUSF-=>y=nB3Hm|uLUn_#qaXCvx-
z_xN+IqXHGxmHP%%50$x6@cCc4%fJ;WS6432mtXk;xMJn16kg{4_W!nCYET3)Qr_XA
zJpX9(dkpv#G-uqy64jof2fPZNvttJ@ZO-v^{h##!x2E{z))3k?!kU~r(5Gpw4*US^
znn$JZ2--Ce+4ZF@r=d?1sT2nIk)b|*V(<#|Yb?V
zx=~G7Dqk+H2g)B8U+=fvg~FM_aGQF13?jIj5Ga$M`~6{?C_S9{MFz^PEI#_PO@ta*
zvU1j1dLA^UW+J!BPae)#y~(Gu*3-$28EX{)rD{IOwOQ*Pbf^(<(Lqw3vq1mVyK~m;
z#y;1X96fN_esS>XYbVpshn@-s=G9ER{y5$pb
zygYHlb&$uzmmAW@3w)pYp7hiY7WC!ujy7ze0B_i^FUD-x7!x27nuftNL_%x!ViZSB
z31b`x4%vG#Lt^_3n;!`(hAkpc%y8ba1~kHuZ)y^@CTJ`cICP2{a27N9imj(jZ5W{-
zG-f7jQEW)U(}GZ7Y?YWTGq(>@>Qkd}VT-648(}J8WW+=`Fc%0%L|pOET6J-%T>4;g
zqUdOr)rO%xJ?5pevswgcxSiksAm$n4h)-lLH<4hL6jl!c20x-14M_3
A^#A|>
From f72c659246b43eb15e6fe88bb620d86945885739 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Isma=C3=ABl=20Moret?=
<30985701+BellezaEmporium@users.noreply.github.com>
Date: Thu, 25 Sep 2025 16:13:45 +0000
Subject: [PATCH 09/11] add config
---
sites/vodafone.pt/vodafone.pt.config.js | 78 +++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
index e69de29b..2726cb94 100644
--- a/sites/vodafone.pt/vodafone.pt.config.js
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -0,0 +1,78 @@
+const { DateTime } = require('luxon')
+const axios = require('axios')
+
+const API_ENDPOINT = 'https://cdn.pt.vtv.vodafone.com/epg'
+
+module.exports = {
+ site: 'vodafone.pt',
+ days: 2,
+ headers: {
+ Origin: 'https://www.vodafone.pt',
+ Referer: 'https://www.vodafone.pt/',
+ 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
+ Accept: 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
+ },
+ url: function ({ channel, date }) {
+ const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
+ const month = datetime.month
+ const formattedMonth = month < 10 ? `0${month}` : month
+ const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day
+ return `${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/00-06`
+ },
+ async parser({ content, date, channel }) {
+ let programs = []
+ let items = parseItems(content)
+ if (!items.length) return programs
+ const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
+ const month = datetime.month
+ const formattedMonth = month < 10 ? `0${month}` : month
+ const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day
+ // map all periods of time to promises in order to get a full schedule in one row
+ const promises = [
+ axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers: this.headers }),
+ axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers: this.headers }),
+ axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/18-24`, { headers: this.headers })
+ ]
+ await Promise.allSettled(promises).then(results => {
+ results.forEach(r => {
+ if (r.status === 'fulfilled') {
+ items = items.concat(parseItems(r.value.data))
+ }
+ })
+ })
+ for (let item of items) {
+ if (!item.startDate || !item.endDate) return
+ let start = DateTime.fromSeconds(item.startDate, { zone: 'UTC' }).toUTC()
+ let stop = DateTime.fromSeconds(item.endDate, { zone: 'UTC' }).toUTC()
+ if (stop < start) {
+ stop = stop.plus({ days: 1 })
+ }
+ const prog = {
+ title: item.name || 'Sem título',
+ start,
+ stop
+ }
+ if (item.description) prog.description = item.description
+ if (item.metas?.year?.value) prog.year = item.metas.year.value
+ if (item.tags?.genre?.objects) {
+ prog.category = item.tags.genre.objects.map(g => g.value)
+ }
+ programs.push(prog)
+ }
+ return programs
+ }
+}
+
+function parseItems(content) {
+ let json
+ try {
+ json = typeof content === 'string' ? JSON.parse(content) : content
+ } catch {
+ return []
+ }
+ if (!json || !json.result) return []
+ const { result } = json
+ if (!Array.isArray(result.objects)) return []
+ return result.objects
+}
\ No newline at end of file
From 09e5375a09857659c5fd55cc9616baf288ad56ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Isma=C3=ABl=20Moret?=
<30985701+BellezaEmporium@users.noreply.github.com>
Date: Thu, 25 Sep 2025 16:33:18 +0000
Subject: [PATCH 10/11] simplify
---
sites/vodafone.pt/vodafone.pt.config.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
index 2726cb94..dd4f47c1 100644
--- a/sites/vodafone.pt/vodafone.pt.config.js
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -15,8 +15,7 @@ module.exports = {
},
url: function ({ channel, date }) {
const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
- const month = datetime.month
- const formattedMonth = month < 10 ? `0${month}` : month
+ const formattedMonth = datetime.month < 10 ? `0${datetime.month}` : datetime.month
const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day
return `${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/00-06`
},
@@ -25,8 +24,7 @@ module.exports = {
let items = parseItems(content)
if (!items.length) return programs
const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
- const month = datetime.month
- const formattedMonth = month < 10 ? `0${month}` : month
+ const formattedMonth = datetime.month < 10 ? `0${datetime.month}` : datetime.month
const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day
// map all periods of time to promises in order to get a full schedule in one row
const promises = [
From f04802d3775f1a16168b5e3249cf3f0c48498b31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Isma=C3=ABl=20Moret?=
<30985701+BellezaEmporium@users.noreply.github.com>
Date: Thu, 25 Sep 2025 17:08:18 +0000
Subject: [PATCH 11/11] create test, tweak config, add data
---
sites/vodafone.pt/__data__/content_0006.json | 1094 ++++++++++++
sites/vodafone.pt/__data__/content_0612.json | 549 ++++++
sites/vodafone.pt/__data__/content_1218.json | 845 +++++++++
sites/vodafone.pt/__data__/content_1824.json | 1654 ++++++++++++++++++
sites/vodafone.pt/vodafone.pt.config.js | 32 +-
sites/vodafone.pt/vodafone.pt.test.js | 102 ++
6 files changed, 4264 insertions(+), 12 deletions(-)
create mode 100644 sites/vodafone.pt/__data__/content_0006.json
create mode 100644 sites/vodafone.pt/__data__/content_0612.json
create mode 100644 sites/vodafone.pt/__data__/content_1218.json
create mode 100644 sites/vodafone.pt/__data__/content_1824.json
diff --git a/sites/vodafone.pt/__data__/content_0006.json b/sites/vodafone.pt/__data__/content_0006.json
new file mode 100644
index 00000000..4b6cdc09
--- /dev/null
+++ b/sites/vodafone.pt/__data__/content_0006.json
@@ -0,0 +1,1094 @@
+{
+ "result": {
+ "objectType": "KalturaAssetListResponse",
+ "totalCount": 4,
+ "objects": [
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Taís decide contar à avó a verdade sobre a morte de Teresa. Catarina aumenta a chantagem com Arthur e pede-lhe um apartamento em Nova Iorque para continuar a encontrar-se com ele. Arthur aceita a proposta. Lígia conta a Eduardo que a conta bancária de Arthur tem levantamentos astronómicos.[S]",
+ "endDate": 1758676501,
+ "externalId": "223403622_imi:110_88370239",
+ "id": 201100895,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "0eb23fca81c0411eab54c1b144499bc9",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/0eb23fca81c0411eab54c1b144499bc9/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "3647ca57ed0442ed967f822c72295543",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/3647ca57ed0442ed967f822c72295543/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 00:19:18"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 01:15:01"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H55M43S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H55M43S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "episode num": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "72"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H_152908"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "223403622"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Balacobaco",
+ "relatedEntities": {},
+ "startDate": 1758673158,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Telenovela"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Filmes e séries"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1510"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Juliana Silveira"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Roger Gobeth"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Letícia Medina"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Bruno Ferrari"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Barbara Borges"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Roberta Gualda"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Victor Pecoraro"
+ }
+ ]
+ },
+ "director": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Edson Spinello"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "12"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BR"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "223403622",
+ "epgChannelId": 3028,
+ "epgId": "223403622_imi:110_88370239",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Pensado a partir da essência da apresentadora, Tânia Ribas de Oliveira, o programa \"A Nossa Tarde\" tem, por isso, um lado mais emocional, com base em histórias com final feliz, e um lado muito divertido, ou não fosse a nossa Tânia uma pessoa que gosta de dar umas belas e sonoras gargalhadas.",
+ "endDate": 1758683631,
+ "externalId": "588370241_imi:110_88370241",
+ "id": 201100896,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "def9b5a85bce4d089fec377039ddf0c5",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/def9b5a85bce4d089fec377039ddf0c5/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "5843e2a8b8ba420683bbbbdcacf07370",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/5843e2a8b8ba420683bbbbdcacf07370/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 01:15:01"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 03:13:51"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H58M50S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H58M50S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 02:15"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588370241"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "A Nossa Tarde",
+ "relatedEntities": {},
+ "startDate": 1758676501,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Talk Show"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Entretenimento"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "3300"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Tânia Ribas de Oliveira"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588370241",
+ "epgChannelId": 3028,
+ "epgId": "588370241_imi:110_88370241",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Todos os dias, um espaço dedicado a vendas por televisão, em que são feitas demonstrações dos produtos.",
+ "endDate": 1758689997,
+ "externalId": "588370245_imi:110_88370245",
+ "id": 201100897,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "b91a455ea5074c729908993637d6dbf2",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/b91a455ea5074c729908993637d6dbf2/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "30815462a65e459aae3c0378e88ed922",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/30815462a65e459aae3c0378e88ed922/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 03:13:51"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 04:59:57"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H46M06S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H46M06S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "235523"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "235523"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "235523_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 04:14"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588370245"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Televendas",
+ "relatedEntities": {},
+ "startDate": 1758683631,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Televendas"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "A600"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588370245",
+ "epgChannelId": 3028,
+ "epgId": "588370245_imi:110_88370245",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "O Bom Dia Portugal é um programa de informação apresentado por João Tomé de Carvalho e Carla Trafaria. Todos os dias, o Bom Dia Portugal dedica espaços específicos às notícias da atualidade nacional e internacional, desporto, meteorologia, trânsito e economia.[S]",
+ "endDate": 1758704284,
+ "externalId": "588376034_imi:110_88376034",
+ "id": 201100898,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "0657dffe77e54654a105a0003c7b612e",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/0657dffe77e54654a105a0003c7b612e/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "4d2e6a8c245b4fa89a1c37c01842342b",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/4d2e6a8c245b4fa89a1c37c01842342b/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 04:59:57"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 08:58:04"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT03H58M07S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT03H58M07S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326300"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326300"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326300_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 06:00"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376034"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Bom Dia Portugal",
+ "relatedEntities": {},
+ "startDate": 1758689997,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2000"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "João Tomé de Carvalho"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Carla Trafaria"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376034",
+ "epgChannelId": 3028,
+ "epgId": "588376034_imi:110_88376034",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/sites/vodafone.pt/__data__/content_0612.json b/sites/vodafone.pt/__data__/content_0612.json
new file mode 100644
index 00000000..2c136b40
--- /dev/null
+++ b/sites/vodafone.pt/__data__/content_0612.json
@@ -0,0 +1,549 @@
+{
+ "result": {
+ "objectType": "KalturaAssetListResponse",
+ "totalCount": 2,
+ "objects": [
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Jorge Gabriel e Sónia Araújo dão-lhe as boas vindas à Praça da Alegria! Porque sabemos que gosta da nossa companhia, oferecemos boa disposição até à hora de almoço! De segunda a sexta-feira, a Praça da Alegria leva até si a melhor música, as últimas tendências da moda e conselhos úteis.",
+ "endDate": 1758715145,
+ "externalId": "588376035_imi:110_88376035",
+ "id": 201100899,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "3001e4d3e5ef4fbdb702160fef74eea6",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/3001e4d3e5ef4fbdb702160fef74eea6/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "5c46aaaa49014c9c9c7dca2d1886031b",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/5c46aaaa49014c9c9c7dca2d1886031b/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 08:58:04"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 11:59:05"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT03H01M01S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT03H01M01S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "true"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23284266"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23284266"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23284266_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 10:00"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376035"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Praça da Alegria",
+ "relatedEntities": {},
+ "startDate": 1758704284,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Talk Show"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Entretenimento"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "3300"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Jorge Gabriel"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Sónia Araújo"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376035",
+ "epgChannelId": 3028,
+ "epgId": "588376035_imi:110_88376035",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Todos os dias, às 13 horas, a sua hora de almoço é completada com a atualização das notícias que marcam a atualidade nacional e mundial, desde a política, a economia, a sociedade e o desporto. Reportagens no local, entrevistas em direto e sempre a isenção e o respeito pela verdade.[S]",
+ "endDate": 1758720514,
+ "externalId": "588376037_imi:110_88376037",
+ "id": 201100900,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "b0b25552f0144f1782381c7fa6d56d72",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/b0b25552f0144f1782381c7fa6d56d72/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "d49334a417d945cf8f651cfb044cda6e",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/d49334a417d945cf8f651cfb044cda6e/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 11:59:05"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 13:28:34"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H29M29S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H29M29S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "true"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319459"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319459"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319459_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 12:59"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376037"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Jornal da Tarde",
+ "relatedEntities": {},
+ "startDate": 1758715145,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2000"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Carlos Daniel"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Hélder Silva"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Sandra Fernandes Pereira"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376037",
+ "epgChannelId": 3028,
+ "epgId": "588376037_imi:110_88376037",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/sites/vodafone.pt/__data__/content_1218.json b/sites/vodafone.pt/__data__/content_1218.json
new file mode 100644
index 00000000..117ad786
--- /dev/null
+++ b/sites/vodafone.pt/__data__/content_1218.json
@@ -0,0 +1,845 @@
+{
+ "result": {
+ "objectType": "KalturaAssetListResponse",
+ "totalCount": 3,
+ "objects": [
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Violeta garante a Plínio que vai descobrir identidade de Marcelona. Norberto exige que Diva minta e diga a Isabel que é cúmplice de Eduardo há muito tempo. Dóris não gosta do plano. Eduardo vai a casa de Abigail, acompanhado pela polícia e por um oficial de justiça, e exige ver a sua filha.[S]",
+ "endDate": 1758723797,
+ "externalId": "223404039_imi:110_88376039",
+ "id": 201100901,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "4b7924534a4d448d933dd91e5fed7378",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/4b7924534a4d448d933dd91e5fed7378/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "3647ca57ed0442ed967f822c72295543",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/3647ca57ed0442ed967f822c72295543/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 13:28:34"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 14:23:17"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H54M43S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H54M43S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "episode num": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "73"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS1099983H_152908"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "223404039"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Balacobaco",
+ "relatedEntities": {},
+ "startDate": 1758720514,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Telenovela"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Filmes e séries"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1510"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Juliana Silveira"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Roger Gobeth"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Letícia Medina"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Bruno Ferrari"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Barbara Borges"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Roberta Gualda"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Victor Pecoraro"
+ }
+ ]
+ },
+ "director": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Edson Spinello"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "12"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BR"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "223404039",
+ "epgChannelId": 3028,
+ "epgId": "223404039_imi:110_88376039",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Pensado a partir da essência da apresentadora, Tânia Ribas de Oliveira, o programa \"A Nossa Tarde\" tem, por isso, um lado mais emocional, com base em histórias com final feliz, e um lado muito divertido, ou não fosse a nossa Tânia uma pessoa que gosta de dar umas belas e sonoras gargalhadas.",
+ "endDate": 1758731404,
+ "externalId": "588376040_imi:110_88376040",
+ "id": 201100902,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "def9b5a85bce4d089fec377039ddf0c5",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/def9b5a85bce4d089fec377039ddf0c5/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "5843e2a8b8ba420683bbbbdcacf07370",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/5843e2a8b8ba420683bbbbdcacf07370/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 14:23:17"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 16:30:04"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT02H06M47S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT02H06M47S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "true"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23312925_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 15:22"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376040"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "A Nossa Tarde",
+ "relatedEntities": {},
+ "startDate": 1758723797,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Talk Show"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Entretenimento"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "3300"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Tânia Ribas de Oliveira"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376040",
+ "epgChannelId": 3028,
+ "epgId": "588376040_imi:110_88376040",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "A atualidade diária do nosso país. \"Portugal em Direto\" é um espaço de informação nacional apresentado pela jornalista Dina Aguiar, que aposta na atualidade nacional, sempre atenta aos problemas das populações, contando para isso com o empenhamento e colaboração dos centros regionais da RTP.[S]",
+ "endDate": 1758737231,
+ "externalId": "588376042_imi:110_88376042",
+ "id": 201100903,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "2c2cccad63a84a0ea7b00b5110d6cca9",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/2c2cccad63a84a0ea7b00b5110d6cca9/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "171c2d78bf14495f9221844320d263ad",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/171c2d78bf14495f9221844320d263ad/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 16:30:04"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 18:07:11"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H37M07S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H37M07S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "true"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326250"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326250"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326250_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 17:30"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376042"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Portugal em Direto",
+ "relatedEntities": {},
+ "startDate": 1758731404,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2000"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Dina Aguiar"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376042",
+ "epgChannelId": 3028,
+ "epgId": "588376042_imi:110_88376042",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/sites/vodafone.pt/__data__/content_1824.json b/sites/vodafone.pt/__data__/content_1824.json
new file mode 100644
index 00000000..9b242f00
--- /dev/null
+++ b/sites/vodafone.pt/__data__/content_1824.json
@@ -0,0 +1,1654 @@
+{
+ "result": {
+ "objectType": "KalturaAssetListResponse",
+ "totalCount": 6,
+ "objects": [
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "No \"Preço Certo\", as emoções são garantidas! Há mais de uma década em emissão na RTP1, \"O Preço Certo\" é o gameshow de maior longevidade da televisão mundial. Estreado pela primeira vez em 1956 nos Estados Unidos, já foi transmitido em mais de 30 países.",
+ "endDate": 1758740344,
+ "externalId": "588376044_imi:110_88376044",
+ "id": 201100904,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "9e8d517bd1d14b6091a42c6047d964b7",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/9e8d517bd1d14b6091a42c6047d964b7/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "728a26c719f14c4890632ed398075dae",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/728a26c719f14c4890632ed398075dae/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 18:07:11"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 18:59:04"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H51M53S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H51M53S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319449"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319449"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "23319449_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 19:06"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376044"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "O Preço Certo",
+ "relatedEntities": {},
+ "startDate": 1758737231,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Concurso"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Entretenimento"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "3100"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Fernando Mendes"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376044",
+ "epgChannelId": 3028,
+ "epgId": "588376044_imi:110_88376044",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "A mais rigorosa seleção de notícias, todos os dias às 20h00. De segunda a domingo, João Adelino Faria, José Rodrigues dos Santos e Ana Lourenço mostram-lhe o que de mais relevante se passou o país e no mundo. Se é importante está no Telejornal.[S]",
+ "endDate": 1758744101,
+ "externalId": "588376046_imi:110_88376046",
+ "id": 201100905,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "11d6de8e6a394dd0a10e45239d624e94",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/11d6de8e6a394dd0a10e45239d624e94/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "36b06f1ec73f4eb885e7d00869c34fc1",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/36b06f1ec73f4eb885e7d00869c34fc1/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 18:59:04"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 20:01:41"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H02M37S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H02M37S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "true"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326252"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326252"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2326252_1"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "qua 24-set, 19:59"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "588376046"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Telejornal",
+ "relatedEntities": {},
+ "startDate": 1758740344,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2000"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "João Adelino Faria"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "José Rodrigues dos Santos"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Ana Lourenço"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "588376046",
+ "epgChannelId": 3028,
+ "epgId": "588376046_imi:110_88376046",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Cada um de nós tem uma história para contar e para partilhar. Em cada uma destas reportagens ficaremos a conhecer a história de três pessoas: duas menos conhecidas do grande público e uma com elevada notoriedade que, por alguma razão, têm uma história interessante e surpreendente para contar.[S]",
+ "endDate": 1758746065,
+ "externalId": "223397390_imi:110_88275275",
+ "id": 201100906,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "89ec4967762740ba8ffc1f43cd214cd9",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/89ec4967762740ba8ffc1f43cd214cd9/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "3baecaf4d63946ad960dac69e146de2f",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/3baecaf4d63946ad960dac69e146de2f/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 20:01:41"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 20:34:25"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H32M44S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H32M44S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "episode num": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "11"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS284267H"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS284267H"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS284267H_146883"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "8"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "episode name": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Bafatá a Minha Casa; Minha Cozinha, Meu Laboratório"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "223397390"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Outras Histórias",
+ "relatedEntities": {},
+ "startDate": 1758744101,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Reportagem"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Sociedade e Economia"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "8122"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2000"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "223397390",
+ "epgChannelId": 3028,
+ "epgId": "223397390_imi:110_88275275",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Vasco Palmeirim apresenta o Joker, o concurso favorito dos portugueses. Um concorrente, com a ajuda de 7 Jokers e do Super Joker, responde a 12 perguntas com um só objetivo em mente: Conquistar os 50 000 euros do prémio máximo![S]",
+ "endDate": 1758749744,
+ "externalId": "223404042_imi:110_88376049",
+ "id": 201100907,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "2167919cfcef47278e3918b60fc6f3b7",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/2167919cfcef47278e3918b60fc6f3b7/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "fa3831457b144d1fbc076a1e41d7af07",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/fa3831457b144d1fbc076a1e41d7af07/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 20:34:25"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 21:35:44"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H01M19S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H01M19S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "episode num": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "142"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS277461H"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS277461H"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "IPS277461H_151406"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "9"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "223404042"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Joker",
+ "relatedEntities": {},
+ "startDate": 1758746065,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Concurso"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Entretenimento"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Série"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "3100"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF02"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Vasco Palmeirim"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "6"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "223404042",
+ "epgChannelId": 3028,
+ "epgId": "223404042_imi:110_88376049",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "Lucas, o cozinheiro, seduz América, a estrela de televisão e candidata presidencial. Ele entrará clandestinamente em casa dela para a seduzir com incríveis refeições, provocando o cruzamento improvável do destino do cozinheiro com o da Presidente.[S]",
+ "endDate": 1758756480,
+ "externalId": "21976385_imi:110_88376050",
+ "id": 201100908,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "bf9e0a2f84cb4d7d84f19e82f9603dac",
+ "imageTypeId": 92,
+ "imageTypeName": "ca",
+ "ratio": "ca",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/bf9e0a2f84cb4d7d84f19e82f9603dac/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "ed6c597dd203429a91c910c74f335b7c",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/ed6c597dd203429a91c910c74f335b7c/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "9e836e1f185a4307a32cebe368846b9d",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/9e836e1f185a4307a32cebe368846b9d/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 21:35:44"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 23:28:00"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H52M16S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT01H52M16S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2023"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "21976385"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "A Bela América",
+ "relatedEntities": {},
+ "startDate": 1758749744,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Comédia"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Filmes e séries"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Filme"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "1400"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "BF00"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "São José Correia"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Estêvão Antunes"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Custódia Gallego"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Daniela Claro"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "João Castro Gomes"
+ }
+ ]
+ },
+ "director": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "António Ferreira"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "12"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "21976385",
+ "epgChannelId": 3028,
+ "epgId": "21976385_imi:110_88376050",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ },
+ {
+ "objectType": "KalturaProgramAsset",
+ "createDate": 1758758403,
+ "description": "O Janela Indiscreta é o seu programa de cinema! Apresenta, em primeira mão, estreias cinematográficas e entrevistas exclusivas aos protagonistas das produções nacionais e internacionais, dando a conhecer curiosidades e histórias de bastidores.[S]",
+ "endDate": 1758759060,
+ "externalId": "223404043_imi:110_88376052",
+ "id": 201100909,
+ "images": [
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "250072dc6e5649eeba3b17a887baef5f",
+ "imageTypeId": 93,
+ "imageTypeName": "cc",
+ "ratio": "cc",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/250072dc6e5649eeba3b17a887baef5f/version/0",
+ "version": 0
+ },
+ {
+ "objectType": "KalturaMediaImage",
+ "id": "0c3796e1280f496a8cd5175aaf531107",
+ "imageTypeId": 91,
+ "imageTypeName": "bg",
+ "ratio": "bg",
+ "url": "https://3038.images-vfp2.ott.kaltura.com/Service.svc/GetImage/p/3038/entry_id/0c3796e1280f496a8cd5175aaf531107/version/0",
+ "version": 0
+ }
+ ],
+ "indexStatus": "Ok",
+ "metas": {
+ "onAir start time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/24/2025 23:28:00"
+ },
+ "onAir end time": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "09/25/2025 00:11:00"
+ },
+ "channel ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "110"
+ },
+ "display duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H43M00S"
+ },
+ "actual duration": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT00H43M00S"
+ },
+ "sign language available": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "false"
+ },
+ "episode num": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "39"
+ },
+ "series ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "26686"
+ },
+ "unifiedSeriesID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "26686"
+ },
+ "season ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "26686_146634"
+ },
+ "season number": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "17"
+ },
+ "year": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2025"
+ },
+ "program unique ID": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "223404043"
+ },
+ "catchupInHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "catchupOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "startOver": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "allowRecording": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "downloadable": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "liveTVOutOfHome": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ },
+ "timeShifting": {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "yes"
+ }
+ },
+ "name": "Janela Indiscreta",
+ "relatedEntities": {},
+ "startDate": 1758756480,
+ "tags": {
+ "genre": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Magazine de notícias"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Notícias"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Celebridades"
+ }
+ ]
+ },
+ "genre_desc": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2200"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "2010"
+ }
+ ]
+ },
+ "actors": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "Mário Augusto"
+ }
+ ]
+ },
+ "subtitles available": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "POR"
+ }
+ ]
+ },
+ "parental Rating": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "0"
+ }
+ ]
+ },
+ "country of production": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "PT"
+ }
+ ]
+ },
+ "contentTags": {
+ "objectType": "KalturaMultilingualStringValueArray",
+ "objects": [
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_rec=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "g_cu_rb=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "s_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_live_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_restart_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_catchup_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "m_npvr_ooh=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_en=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_live=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_restart=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_catchup=1"
+ },
+ {
+ "objectType": "KalturaMultilingualStringValue",
+ "value": "w_npvr=1"
+ }
+ ]
+ }
+ },
+ "type": 0,
+ "updateDate": 1758758403,
+ "enableCatchUp": true,
+ "enableCdvr": false,
+ "crid": "223404043",
+ "epgChannelId": 3028,
+ "epgId": "223404043_imi:110_88376052",
+ "externalOfferIds": "",
+ "linearAssetId": 636403,
+ "relatedMediaId": 0,
+ "enableStartOver": true,
+ "enableTrickPlay": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js
index dd4f47c1..ec7eee41 100644
--- a/sites/vodafone.pt/vodafone.pt.config.js
+++ b/sites/vodafone.pt/vodafone.pt.config.js
@@ -3,15 +3,19 @@ const axios = require('axios')
const API_ENDPOINT = 'https://cdn.pt.vtv.vodafone.com/epg'
+const headers = {
+ Origin: 'https://www.vodafone.pt',
+ Referer: 'https://www.vodafone.pt/',
+ 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
+ Accept: 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
+}
+
module.exports = {
site: 'vodafone.pt',
days: 2,
- headers: {
- Origin: 'https://www.vodafone.pt',
- Referer: 'https://www.vodafone.pt/',
- 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
- Accept: 'application/json, text/javascript, */*; q=0.01',
- 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
+ request: {
+ headers
},
url: function ({ channel, date }) {
const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
@@ -22,16 +26,19 @@ module.exports = {
async parser({ content, date, channel }) {
let programs = []
let items = parseItems(content)
- if (!items.length) return programs
+ if (items.length === 0) return programs
+
const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon')
const formattedMonth = datetime.month < 10 ? `0${datetime.month}` : datetime.month
const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day
- // map all periods of time to promises in order to get a full schedule in one row
+
+ // Fetch the remaining 3 periods to get a full day schedule
const promises = [
- axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers: this.headers }),
- axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers: this.headers }),
- axios.get(`${API_ENDPOINT}${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/18-24`, { headers: this.headers })
+ axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers }),
+ axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers }),
+ axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/18-00`, { headers })
]
+
await Promise.allSettled(promises).then(results => {
results.forEach(r => {
if (r.status === 'fulfilled') {
@@ -39,8 +46,9 @@ module.exports = {
}
})
})
+
for (let item of items) {
- if (!item.startDate || !item.endDate) return
+ if (!item.startDate || !item.endDate) continue
let start = DateTime.fromSeconds(item.startDate, { zone: 'UTC' }).toUTC()
let stop = DateTime.fromSeconds(item.endDate, { zone: 'UTC' }).toUTC()
if (stop < start) {
diff --git a/sites/vodafone.pt/vodafone.pt.test.js b/sites/vodafone.pt/vodafone.pt.test.js
index 8b137891..3f08e781 100644
--- a/sites/vodafone.pt/vodafone.pt.test.js
+++ b/sites/vodafone.pt/vodafone.pt.test.js
@@ -1 +1,103 @@
+import { parser, url, request } from './vodafone.pt.config.js'
+const axios = require('axios')
+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-09-24', 'YYYY-MM-DD').startOf('d')
+const channel = {
+ site_id: '3028',
+ xmltv_id: 'RTP1.pt'
+}
+
+const headers = {
+ Origin: 'https://www.vodafone.pt',
+ Referer: 'https://www.vodafone.pt/',
+ 'User-Agent': 'Mozilla/5.0 (compatible; tv_grab_pt_vodafone)',
+ Accept: 'application/json, text/javascript, */*; q=0.01',
+ 'Accept-Language': 'pt-PT,pt;q=0.9,en;q=0.8'
+}
+
+jest.mock('axios')
+
+it('can generate valid url', () => {
+ expect(url({ channel, date })).toBe(
+ 'https://cdn.pt.vtv.vodafone.com/epg/3028/2025/09/24/00-06'
+ )
+})
+
+it('can generate valid request headers', () => {
+ expect(request.headers).toMatchObject(headers)
+})
+
+it('can parse response', async () => {
+ const content = fs.readFileSync(path.resolve(__dirname, '__data__/content_0006.json'), 'utf8')
+
+ axios.get.mockImplementation((url, config) => {
+ if (
+ url ===
+ 'https://cdn.pt.vtv.vodafone.com/epg/3028/2025/09/24/06-12' &&
+ JSON.stringify(config.headers) === JSON.stringify(headers)
+ ) {
+ return Promise.resolve({
+ data: fs.readFileSync(path.resolve(__dirname, '__data__/content_0612.json'), 'utf8')
+ })
+ } else if (
+ url ===
+ 'https://cdn.pt.vtv.vodafone.com/epg/3028/2025/09/24/12-18' &&
+ JSON.stringify(config.headers) === JSON.stringify(headers)
+ ) {
+ return Promise.resolve({
+ data: fs.readFileSync(path.resolve(__dirname, '__data__/content_1218.json'), 'utf8')
+ })
+ } else if (
+ url ===
+ 'https://cdn.pt.vtv.vodafone.com/epg/3028/2025/09/24/18-00' &&
+ JSON.stringify(config.headers) === JSON.stringify(headers)
+ ) {
+ return Promise.resolve({
+ data: fs.readFileSync(path.resolve(__dirname, '__data__/content_1824.json'), 'utf8')
+ })
+ } else {
+ return Promise.resolve({ data: '' })
+ }
+ })
+
+ let results = await parser({ content, channel, date })
+ results = results.map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ // first set has 15 programs, check first and last
+ expect(results).toHaveLength(15)
+
+ expect(results[0]).toMatchObject({
+ start: '2025-09-24T00:19:18.000Z',
+ stop: '2025-09-24T01:15:01.000Z',
+ title: 'Balacobaco',
+ description:
+ 'Taís decide contar à avó a verdade sobre a morte de Teresa. Catarina aumenta a chantagem com Arthur e pede-lhe um apartamento em Nova Iorque para continuar a encontrar-se com ele. Arthur aceita a proposta. Lígia conta a Eduardo que a conta bancária de Arthur tem levantamentos astronómicos.[S]',
+ })
+
+ expect(results[14]).toMatchObject({
+ start: '2025-09-24T23:28:00.000Z',
+ stop: '2025-09-25T00:11:00.000Z',
+ title: 'Janela Indiscreta',
+ description: 'O Janela Indiscreta é o seu programa de cinema! Apresenta, em primeira mão, estreias cinematográficas e entrevistas exclusivas aos protagonistas das produções nacionais e internacionais, dando a conhecer curiosidades e histórias de bastidores.[S]',
+ })
+})
+
+it('can handle empty guide', done => {
+ parser({content:'{}', channel, date})
+ .then(result => {
+ expect(result).toMatchObject([])
+ done()
+ })
+ .catch(done)
+})