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.