From f2fd02454c630189beac2910460a4fb772a3f0cf Mon Sep 17 00:00:00 2001
From: RevGear <95308545+RevGear@users.noreply.github.com>
Date: Tue, 20 Sep 2022 12:11:26 +0100
Subject: [PATCH] tvtv.us re-write
---
sites/tvtv.us/tvtv.us.config.js | 136 ++------------------
sites/tvtv.us/tvtv.us.test.js | 33 ++---
sites/tvtv.us/tvtv.us_ca.channels.xml | 2 +-
sites/tvtv.us/tvtv.us_us-local.channels.xml | 34 ++---
4 files changed, 40 insertions(+), 165 deletions(-)
diff --git a/sites/tvtv.us/tvtv.us.config.js b/sites/tvtv.us/tvtv.us.config.js
index 76fe54b6..6997e4f9 100644
--- a/sites/tvtv.us/tvtv.us.config.js
+++ b/sites/tvtv.us/tvtv.us.config.js
@@ -1,4 +1,3 @@
-const axios = require('axios')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
@@ -7,144 +6,31 @@ dayjs.extend(utc)
module.exports = {
site: 'tvtv.us',
url: function ({ date, channel }) {
- return `https://www.tvtv.us/gn/d/v1.1/stations/${
- channel.site_id
- }/airings?startDateTime=${date.format()}&endDateTime=${date.add(1, 'd').format()}`
+ return `https://www.tvtv.us/api/v1/lineup/USA-NY71652-DEFAULT/grid/${date.toJSON()}/${date.add(1, 'd').toJSON()}/${channel.site_id}`
},
parser: function ({ content }) {
let programs = []
const items = parseItems(content)
items.forEach(item => {
- programs.push({
- title: parseTitle(item),
- sub_title: parseSubtitle(item),
- description: parseDescription(item),
- category: parseCategory(item),
- season: parseSeason(item),
- episode: parseEpisode(item),
- directors: parseDirectors(item),
- actors: parseActors(item),
- date: parseDate(item),
- start: parseStart(item),
- stop: parseStop(item),
- icon: parseIcon(item)
+ const start = dayjs.utc(item.startTime)
+ const stop = start.add(item.runTime, 'm')
+ programs.push({
+ title: item.title,
+ description: item.subtitle,
+ start,
+ stop
})
})
return programs
- },
- async channels({ country }) {
- const channels = []
-
- const data = await axios
- .get(`https://www.tvtv.${country}/api/stations`)
- .then(r => r.data)
- .catch(console.log)
-
- const stations = data.data.filter(i => !['Radio Station'].includes(i.type))
- for (const station of stations) {
- const stationData = await axios
- .get(`https://www.tvtv.us/gn/d/v1.1/stations/${station.id}`)
- .then(r => r.data[0] || {})
- .catch(console.log)
- if (!stationData) continue
-
- let channel
- switch (stationData.type) {
- case 'Low Power Broadcast':
- case 'Full Power Broadcast':
- channel = {
- site_id: station.id,
- name: stationData.name,
- xmltv_id: parseChannelId(stationData),
- logo: parseChannelIcon(item)
- }
- break
- default:
- channel = {
- site_id: station.id,
- name: stationData.name,
- logo: parseChannelIcon(item)
- }
- break
- }
-
- if (channel) {
- channels.push(channel)
- }
- }
-
- return channels
}
}
-function parseChannelId(data) {
- if (!data.callSign) return null
- if (/^((CB|C[F-K]|V[A-G]|VO|VX|VY|X[J-O])[0-9A-Z-]+)/.test(data.callSign))
- return `${data.callSign}.ca`
- if (/^((XH|XE)[0-9A-Z-]+)/.test(data.callSign)) return `${data.callSign}.mx`
- if (/^((K|N|W)[0-9A-Z-]+)/.test(data.callSign)) return `${data.callSign}.us`
-
- return null
-}
function parseItems(content) {
- return JSON.parse(content)
+ const json = JSON.parse(content)
+ if (!json.length) return []
+ return json[0]
}
-function parseStart(item) {
- return dayjs(item.startTime)
-}
-
-function parseStop(item) {
- return dayjs(item.endTime)
-}
-
-function parseTitle(item) {
- return item.program.title
-}
-
-function parseSubtitle(item) {
- return item.program.episodeTitle
-}
-
-function parseDescription(item) {
- return item.program.longDescription
-}
-
-function parseCategory(item) {
- return item.program.genres || []
-}
-
-function parseSeason(item) {
- return item.program.seasonNum || null
-}
-
-function parseEpisode(item) {
- return item.program.episodeNum || null
-}
-
-function parseDirectors(item) {
- return item.program.directors || []
-}
-
-function parseDate(item) {
- return item.program.releaseDate
-}
-
-function parseActors(item) {
- return item.program.topCast || []
-}
-
-function parseIcon(item) {
- return item.program.preferredImage && item.program.preferredImage.uri
- ? `https://tvtv.us/gn/i/${item.program.preferredImage.uri}`
- : null
-}
-
-function parseChannelIcon(item) {
- return item.station.preferredImage && item.station.preferredImage.uri
- ? `https://tvtv.us/gn/i/${item.station.preferredImage.uri}`
- : null
-}
diff --git a/sites/tvtv.us/tvtv.us.test.js b/sites/tvtv.us/tvtv.us.test.js
index 8892b382..11a4261d 100644
--- a/sites/tvtv.us/tvtv.us.test.js
+++ b/sites/tvtv.us/tvtv.us.test.js
@@ -8,7 +8,7 @@ const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
-const date = dayjs.utc('2022-01-17', 'YYYY-MM-DD').startOf('d')
+const date = dayjs.utc('2022-09-20', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '62670',
xmltv_id: 'AMITV.ca',
@@ -17,12 +17,12 @@ const channel = {
it('can generate valid url', () => {
expect(url({ channel, date })).toBe(
- 'https://www.tvtv.us/gn/d/v1.1/stations/62670/airings?startDateTime=2022-01-17T00:00:00Z&endDateTime=2022-01-18T00:00:00Z'
+ 'https://www.tvtv.us/api/v1/lineup/USA-NY71652-DEFAULT/grid/2022-09-20T00:00:00.000Z/2022-09-21T00:00:00.000Z/62670'
)
})
it('can parse response', () => {
- const content = `[{"startTime":"2022-01-20T00:00Z","endTime":"2022-01-20T00:30Z","duration":30,"qualifiers":["CC","DVS"],"program":{"tmsId":"EP031727440006","rootId":"16777148","seriesId":"16640522","subType":"Series","title":"Reflect and Renew With Kevin Naidoo","episodeTitle":"Empowerment","releaseYear":2019,"releaseDate":"2019-04-20","origAirDate":"2019-04-20","titleLang":"en","descriptionLang":"en","entityType":"Episode","genres":["Health"],"longDescription":"Kevin demonstrates a meditation and yoga practice to reclaim his courage and confidence.","shortDescription":"Kevin demonstrates a meditation and yoga practice to reclaim his courage and confidence.","episodeNum":6,"seasonNum":1,"ratings":[{"body":"Régie du cinéma","code":"G"},{"body":"USA Parental Rating","code":"TVG"},{"body":"Canadian Parental Rating","code":"G"}],"preferredImage":{"width":"240","height":"360","uri":"assets/p16640522_b_v9_aa.jpg?w=240&h=360","category":"Banner-L2","text":"yes","primary":"true","tier":"Series"}},"station":{"stationId":"62670","callSign":"AMITV","videoQuality":{"signalType":"Digital","videoType":"SDTV"},"preferredImage":{"width":"360","height":"270","uri":"assets/s62670_ll_h15_ab.png?w=360&h=270","category":"Logo","primary":"true"}}},{"startTime":"2022-01-20T00:30Z","endTime":"2022-01-20T01:00Z","duration":30,"qualifiers":["CC","DVS"],"program":{"tmsId":"EP018574900040","rootId":"12448902","seriesId":"10464580","subType":"Series","title":"Four Senses","episodeTitle":"Sizzled & Seared","releaseYear":2016,"releaseDate":"2016-01-14","origAirDate":"2016-01-14","titleLang":"en","descriptionLang":"en","entityType":"Episode","genres":["House/garden"],"longDescription":"Everything is sizzled and seared as chef Corbin Tomaszeski joins Christine and Carl in the kitchen.","shortDescription":"Everything is sizzled and seared as chef Corbin Tomaszeski joins Christine and Carl in the kitchen.","topCast":["Carl Heinrich","Christine Ha"],"ratings":[{"body":"Canadian Parental Rating","code":"G"},{"body":"USA Parental Rating","code":"TVG"},{"body":"Régie du cinéma","code":"G"}],"preferredImage":{"width":"240","height":"360","uri":"assets/p10464580_b_v7_aa.jpg?w=240&h=360","category":"Banner-L1","text":"yes","primary":"true","tier":"Series"}},"station":{"stationId":"62670","callSign":"AMITV","videoQuality":{"signalType":"Digital","videoType":"SDTV"},"preferredImage":{"width":"360","height":"270","uri":"assets/s62670_ll_h15_ab.png?w=360&h=270","category":"Logo","primary":"true"}}}]`
+ const content = `[[{"programId":"EP039131940001","title":"Beyond the Field","subtitle":"Diversity in Sport","flags":["CC","DVS"],"type":"O","startTime":"2022-09-20T00:00Z","start":0,"duration":30,"runTime":30},{"programId":"EP032368970002","title":"IGotThis","subtitle":"Listen to Dis","flags":["CC","DVS"],"type":"O","startTime":"2022-09-20T00:30Z","start":120,"duration":30,"runTime":30}]]`
const result = parser({ content }).map(p => {
p.start = p.start.toJSON()
@@ -32,27 +32,16 @@ it('can parse response', () => {
expect(result).toMatchObject([
{
- start: '2022-01-20T00:00:00.000Z',
- stop: '2022-01-20T00:30:00.000Z',
- title: 'Reflect and Renew With Kevin Naidoo',
- sub_title: 'Empowerment',
- description: `Kevin demonstrates a meditation and yoga practice to reclaim his courage and confidence.`,
- category: ['Health'],
- season: 1,
- episode: 6,
- date: '2019-04-20',
- icon: 'https://tvtv.us/gn/i/assets/p16640522_b_v9_aa.jpg?w=240&h=360'
+ start: '2022-09-20T00:00:00.000Z',
+ stop: '2022-09-20T00:30:00.000Z',
+ title: 'Beyond the Field',
+ description: `Diversity in Sport`
},
{
- start: '2022-01-20T00:30:00.000Z',
- stop: '2022-01-20T01:00:00.000Z',
- title: 'Four Senses',
- sub_title: 'Sizzled & Seared',
- description: `Everything is sizzled and seared as chef Corbin Tomaszeski joins Christine and Carl in the kitchen.`,
- category: ['House/garden'],
- actors: ['Carl Heinrich','Christine Ha'],
- date: '2016-01-14',
- icon: 'https://tvtv.us/gn/i/assets/p10464580_b_v7_aa.jpg?w=240&h=360'
+ start: '2022-09-20T00:30:00.000Z',
+ stop: '2022-09-20T01:00:00.000Z',
+ title: 'IGotThis',
+ description: `Listen to Dis`
}
])
})
diff --git a/sites/tvtv.us/tvtv.us_ca.channels.xml b/sites/tvtv.us/tvtv.us_ca.channels.xml
index 9552aecc..bd137144 100644
--- a/sites/tvtv.us/tvtv.us_ca.channels.xml
+++ b/sites/tvtv.us/tvtv.us_ca.channels.xml
@@ -39,7 +39,7 @@
Frissons TV
Global News: BC1
History2 Canada
- History2 HD Canada
+ History2 HD Canada
Hollywood Suite 00s Movies
Hollywood Suite 70s Movies
Hollywood Suite 80s Movies
diff --git a/sites/tvtv.us/tvtv.us_us-local.channels.xml b/sites/tvtv.us/tvtv.us_us-local.channels.xml
index a2b6a05c..8ac46305 100644
--- a/sites/tvtv.us/tvtv.us_us-local.channels.xml
+++ b/sites/tvtv.us/tvtv.us_us-local.channels.xml
@@ -81,7 +81,7 @@
Infomercials (KAHC-LD7) Sacramento, CA
TCT (KAIL) Fresno, CA
The Grio (KAIL-DT2) Fresno, CA
- H&I (KAIL3) Fresno, CA
+ H&I (KAIL3) Fresno, CA
UniMas (KAKW-DT2) Austin, TX
Daystar (KAKZ-LD2) Palm Springs, CA
Azteca (KAKZ-LD3) Palm Springs, CA
@@ -104,7 +104,7 @@
CHARGE! (KAZT-CD4) Phoenix, AZ
MeTV (KAZT-DT2) Prescott, AZ
HSN (KAZT-DT3) Prescott, AZ
- CHARGE! (KAZT-DT4) Prescott, AZ
+ CHARGE! (KAZT-DT4) Prescott, AZ
PBS (KBAB-LD) Santa Barbara, CA
PBS Plus (KBAB-LD2) Santa Barbara, CA
Daystar (KBAB-LD3) Santa Barbara, CA
@@ -404,7 +404,7 @@
ABC (KITV) Honolulu, HI
MeTV (KITV-DT2) Honolulu, HI
Hawaii TV (KITV-DT3) Honolulu, HI
- ABC (KIVI-DT1) Boise, ID
+ ABC (KIVI-DT1) Boise, ID
PBS (KIXE) Redding, CA
Create (KIXE-TV2) Redding, CA
PBS World (KIXE-DT3) Redding, CA
@@ -441,7 +441,7 @@
PBS Kids (KLCS-DT2) Los Angeles, CA
Three Angels (KLFB-LD) Salinas, CA
3ABN Latino (KLFB-LD2) Salinas, CA
- 3ABN Proclaim (KLFB-LD3) Salinas, CA
+ 3ABN Proclaim (KLFB-LD3) Salinas, CA
ABC (KLKN-DT1) Lincoln, NE
Decades (KLPD-LD2) Denver, CO
Retro TV (KLRA-CD4) Little Rock, AR
@@ -679,7 +679,7 @@
LATV (KSEE-DT3) Fresno, CA
Mana (KSFV-CD2) Los Angeles, CA
Corner Store (KSFV-CD3) Los Angeles, CA
- ABC (KSFY-DT1) Sioux Falls, SD
+ ABC (KSFY-DT1) Sioux Falls, SD
beIN Sports Xtra (KSKJ-CD) Los Angeles, CA
SSTN (KSKJ-DT2) Los Angeles, CA
Infomercials (KSKJ-CD3) Los Angeles, CA
@@ -775,7 +775,7 @@
FOX (KTVI-DT1) St Louis, MO
Antenna TV (KTVI-DT2) St Louis, MO
Ion Mystery (KTVI-DT3) St Louis, MO
- Dabl (KTVI-DT4) St Louis, MO
+ Dabl (KTVI-DT4) St Louis, MO
NBC (KTVM-DT1) Butte, MT
ABC (KTVO-DT1) Kirskville, MO
Shop LC (KTVP-LD3) Phoenix, AZ
@@ -871,7 +871,7 @@
Create (KVPT3) Fresno, CA
PBS World (KVPT-DT4) Fresno, CA
UniMás (KVSN-DT2) Colorado Springs, CO
- ABC (KVUE-DT1) Austin, TX
+ ABC (KVUE-DT1) Austin, TX
Azteca (KVVG-LD) Porterville, CA
CW (KWGN-DT1) Denver, CO
Canal 22 (KWHY-TV) Los Angeles, CA
@@ -879,8 +879,8 @@
KWHY-DT3 (KWHY-DT3) Los Angeles, CA
Majestadtv (KWHY-DT5) Los Angeles, CA
Infomercials (KWMO-LD2) Hot Springs, AR
- ABC (KWYB-DT1) Butte, MT
- NBC (KXAN-DT1) Austin, TX
+ ABC (KWYB-DT1) Butte, MT
+ NBC (KXAN-DT1) Austin, TX
NBC (KXAS-DT1) Dallas TX
Cozi TV (KXAS-DT2) Dallas TX
NBCLX (KXAS-DT3) Dallas TX
@@ -1017,7 +1017,7 @@
MeTV Plus (WCIU-DT5) Chicago, IL
Decades (WCIU-DT6) Chicago, IL
PBS (WCMU-TV) Mount Pleasant, MI
- ABC (WCTI-DT1) New Bern, NC
+ ABC (WCTI-DT1) New Bern, NC
CBS (WCTV1) Tallahassee, FL
MeTV (WCTV2) Tallahassee, FL
Circle (WCTV3) Tallahassee, FL
@@ -1163,7 +1163,7 @@
CW (WJAC4) Altoona, PA
ABC (WJBF-DT1) Augusta, GA
FOX (WJBK-DT1) Detroit, MI
- ABC (WJLA-DT1) Washington, DC
+ ABC (WJLA-DT1) Washington, DC
MeTV (WJLP-DT1) New York, NY
Laff (WJLP-DT2) New York, NY
Grit (WJLP-DT3) New York, NY
@@ -1235,10 +1235,10 @@
Bounce (WMAR-DT3) Washington D.C.
Court TV Mystery (WMAR-DT4) Washington D.C.
Court TV (WMAR-DT5) Washington D.C.
- ABC (WMBB-DT1) Panama City, FL
- WMBC (WMBC-DT1) Newton, NJ
- Quest (WMBC-DT2) Newton, NJ
- TBD (WMBC-DT3) Newton, NJ
+ ABC (WMBB-DT1) Panama City, FL
+ WMBC (WMBC-DT1) Newton, NJ
+ Quest (WMBC-DT2) Newton, NJ
+ TBD (WMBC-DT3) Newton, NJ
SinoVision (WMBC-DT4) Newton, NJ
New Tang Dynasty (WMBC-DT5) Newton, NJ
Aliento Vision (WMBC-DT7) Newton, NJ
@@ -1327,7 +1327,7 @@
Charge (WPSG-DT2) Philadelphia, PA
Comet (WPSG-DT3) Philadelphia, PA
TBD (WPSG-DT4) Philadelphia, PA
- Circle (WPSG-DT5) Philadelphia, PA
+ Circle (WPSG-DT5) Philadelphia, PA
PBS (WPSU1) Altoona, PA
Create (WPSU2) Altoona, PA
PBS World (WPSU3) Altoona, PA
@@ -1428,7 +1428,7 @@
ABC (WTNH-DT1) Hartford, CT
Rewind TV (WTNH-DT2) Hartford, CT
FOX (WTNZ) KNOXVILLE
- ABC (WTOK-DT1) Meridian, MS
+ ABC (WTOK-DT1) Meridian, MS
CBS (WTOL) Toledo, OH
FOX (WTTG-DT1) Washington D.C.
Burzzr (WTTG-DT2) Washington D.C.