diff --git a/SITES.md b/SITES.md
index 37db4bac6..caa199cea 100644
--- a/SITES.md
+++ b/SITES.md
@@ -119,7 +119,7 @@
| nhl.com | 1 | 🟢 | |
| nostv.pt | 161 | 🟢 | |
| novasports.gr | 16 | 🟢 | |
- | nowplayer.now.com | 140 | 🟢 | |
+ | nowplayer.now.com | 130 | 🟢 | |
| nuevosiglo.com.uy | 173 | 🟢 | |
| nzxmltv.com | 532 | 🟢 | |
| ontvtonight.com | 17478 | 🟢 | |
@@ -171,7 +171,7 @@
| syn.is | 9 | 🟢 | |
| taiwanplus.com | 1 | 🟢 | |
| tapdmv.com | 39 | 🟢 | |
- | tataplay.com | 905 | 🟢 | https://github.com/iptv-org/epg/issues/3210 |
+ | tataplay.com | 905 | 🟢 | |
| telebilbao.es | 1 | 🟢 | |
| teleboy.ch | 325 | 🟢 | |
| telenet.tv | 260 | 🟢 | |
diff --git a/sites/nowplayer.now.com/__data__/content.json b/sites/nowplayer.now.com/__data__/content.json
index eafb20207..9444e0fe9 100644
--- a/sites/nowplayer.now.com/__data__/content.json
+++ b/sites/nowplayer.now.com/__data__/content.json
@@ -1 +1,1033 @@
-[[{"key":"key_202111174524739","vimProgramId":"202111174524739","name":"ViuTVsix Station Closing","start":1637690400000,"end":1637715600000,"date":"20211124","startTime":"02:00AM","endTime":"09:00AM","duration":420,"recordable":false,"restartTv":false,"npvrProg":false,"npvrStartTime":0,"npvrEndTime":0,"cid":"viutvsix station closing","cc":"","isInWatchlist":false}]]
\ No newline at end of file
+[
+ [
+ {
+ "key": "key_202606244351477",
+ "vimProgramId": "202606244351477",
+ "name": "Ragna Crimson S1E2 -The Beginning Of The Story",
+ "start": 1783785600000,
+ "end": 1783787400000,
+ "date": "20260712",
+ "startTime": "12:00AM",
+ "endTime": "12:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783787400000,
+ "npvrStartTime": 1783785600000,
+ "cid": "ragna crimsons1e2the beginning of the story",
+ "sid": "ragna crimsons1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351478",
+ "vimProgramId": "202606244351478",
+ "name": "Ragna Crimson S1E3 -Instigation",
+ "start": 1783787400000,
+ "end": 1783789200000,
+ "date": "20260712",
+ "startTime": "12:30AM",
+ "endTime": "01:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783789200000,
+ "npvrStartTime": 1783787400000,
+ "cid": "ragna crimsons1e3instigation",
+ "sid": "ragna crimsons1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351479",
+ "vimProgramId": "202606244351479",
+ "name": "Ragna Crimson S1E4 -Carrying Out The Plan",
+ "start": 1783789200000,
+ "end": 1783791000000,
+ "date": "20260712",
+ "startTime": "01:00AM",
+ "endTime": "01:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783791000000,
+ "npvrStartTime": 1783789200000,
+ "cid": "ragna crimsons1e4carrying out the plan",
+ "sid": "ragna crimsons1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351480",
+ "vimProgramId": "202606244351480",
+ "name": "Ragna Crimson S1E5 -Wing",
+ "start": 1783791000000,
+ "end": 1783792800000,
+ "date": "20260712",
+ "startTime": "01:30AM",
+ "endTime": "02:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783792800000,
+ "npvrStartTime": 1783791000000,
+ "cid": "ragna crimsons1e5wing",
+ "sid": "ragna crimsons1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351481",
+ "vimProgramId": "202606244351481",
+ "name": "Black Clover S1E10 -To Protect Someone",
+ "start": 1783792800000,
+ "end": 1783794600000,
+ "date": "20260712",
+ "startTime": "02:00AM",
+ "endTime": "02:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783794600000,
+ "npvrStartTime": 1783792800000,
+ "cid": "black clovers1e10to protect someone",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351482",
+ "vimProgramId": "202606244351482",
+ "name": "Black Clover S1E11 -What Happened One Day In The Castle Town",
+ "start": 1783794600000,
+ "end": 1783796400000,
+ "date": "20260712",
+ "startTime": "02:30AM",
+ "endTime": "03:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783796400000,
+ "npvrStartTime": 1783794600000,
+ "cid": "black clovers1e11what happened one day in the castle town",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351483",
+ "vimProgramId": "202606244351483",
+ "name": "Black Clover S1E12 -The Wizard King Saw",
+ "start": 1783796400000,
+ "end": 1783798200000,
+ "date": "20260712",
+ "startTime": "03:00AM",
+ "endTime": "03:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783798200000,
+ "npvrStartTime": 1783796400000,
+ "cid": "black clovers1e12the wizard king saw",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351484",
+ "vimProgramId": "202606244351484",
+ "name": "Oshi No Ko S1E3 -Manga-Based TV Drama",
+ "start": 1783798200000,
+ "end": 1783800000000,
+ "date": "20260712",
+ "startTime": "03:30AM",
+ "endTime": "04:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783800000000,
+ "npvrStartTime": 1783798200000,
+ "cid": "oshi no kos1e3manga-based tv drama",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351485",
+ "vimProgramId": "202606244351485",
+ "name": "Oshi No Ko S1E4 -Actors",
+ "start": 1783800000000,
+ "end": 1783801800000,
+ "date": "20260712",
+ "startTime": "04:00AM",
+ "endTime": "04:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783801800000,
+ "npvrStartTime": 1783800000000,
+ "cid": "oshi no kos1e4actors",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351486",
+ "vimProgramId": "202606244351486",
+ "name": "Unnamed Memory S2E13 -From A Blank Page Anew",
+ "start": 1783801800000,
+ "end": 1783803600000,
+ "date": "20260712",
+ "startTime": "04:30AM",
+ "endTime": "05:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783803600000,
+ "npvrStartTime": 1783801800000,
+ "cid": "unnamed memorys2e13from a blank page anew",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351487",
+ "vimProgramId": "202606244351487",
+ "name": "Unnamed Memory S2E14 -Emerging From A Glass Cocoon",
+ "start": 1783803600000,
+ "end": 1783805400000,
+ "date": "20260712",
+ "startTime": "05:00AM",
+ "endTime": "05:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783805400000,
+ "npvrStartTime": 1783803600000,
+ "cid": "unnamed memorys2e14emerging from a glass cocoon",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351488",
+ "vimProgramId": "202606244351488",
+ "name": "Unnamed Memory S2E15 -Unanswered Prayer",
+ "start": 1783805400000,
+ "end": 1783807200000,
+ "date": "20260712",
+ "startTime": "05:30AM",
+ "endTime": "06:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783807200000,
+ "npvrStartTime": 1783805400000,
+ "cid": "unnamed memorys2e15unanswered prayer",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351489",
+ "vimProgramId": "202606244351489",
+ "name": "Fruits Basket S2E23 -It's Cinderella-Ish",
+ "start": 1783807200000,
+ "end": 1783809000000,
+ "date": "20260712",
+ "startTime": "06:00AM",
+ "endTime": "06:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783809000000,
+ "npvrStartTime": 1783807200000,
+ "cid": "fruits baskets2e23it's cinderella-ish",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351490",
+ "vimProgramId": "202606244351490",
+ "name": "Fruits Basket S2E24 -Here You Are",
+ "start": 1783809000000,
+ "end": 1783810800000,
+ "date": "20260712",
+ "startTime": "06:30AM",
+ "endTime": "07:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783810800000,
+ "npvrStartTime": 1783809000000,
+ "cid": "fruits baskets2e24here you are",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351491",
+ "vimProgramId": "202606244351491",
+ "name": "Fruits Basket S2E25 -I'm Different Now",
+ "start": 1783810800000,
+ "end": 1783812600000,
+ "date": "20260712",
+ "startTime": "07:00AM",
+ "endTime": "07:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783812600000,
+ "npvrStartTime": 1783810800000,
+ "cid": "fruits baskets2e25i'm different now",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351492",
+ "vimProgramId": "202606244351492",
+ "name": "Black Clover S1E10 -To Protect Someone",
+ "start": 1783812600000,
+ "end": 1783814400000,
+ "date": "20260712",
+ "startTime": "07:30AM",
+ "endTime": "08:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783814400000,
+ "npvrStartTime": 1783812600000,
+ "cid": "black clovers1e10to protect someone",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351493",
+ "vimProgramId": "202606244351493",
+ "name": "Black Clover S1E11 -What Happened One Day In The Castle Town",
+ "start": 1783814400000,
+ "end": 1783816200000,
+ "date": "20260712",
+ "startTime": "08:00AM",
+ "endTime": "08:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783816200000,
+ "npvrStartTime": 1783814400000,
+ "cid": "black clovers1e11what happened one day in the castle town",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351494",
+ "vimProgramId": "202606244351494",
+ "name": "Black Clover S1E12 -The Wizard King Saw",
+ "start": 1783816200000,
+ "end": 1783818000000,
+ "date": "20260712",
+ "startTime": "08:30AM",
+ "endTime": "09:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783818000000,
+ "npvrStartTime": 1783816200000,
+ "cid": "black clovers1e12the wizard king saw",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351495",
+ "vimProgramId": "202606244351495",
+ "name": "One Piece: Marineford Arc S1E3 -The Beginning Of The War! Ace And Whitebeard's Past!",
+ "start": 1783818000000,
+ "end": 1783819800000,
+ "date": "20260712",
+ "startTime": "09:00AM",
+ "endTime": "09:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783819800000,
+ "npvrStartTime": 1783818000000,
+ "cid": "one piece: marineford arcs1e3the beginning of the war! ace and whitebeard's past!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351496",
+ "vimProgramId": "202606244351496",
+ "name": "One Piece: Marineford Arc S1E4 -The Force That Could Destroy The World! The Power Of The Tremor-Tremor Frui",
+ "start": 1783819800000,
+ "end": 1783821600000,
+ "date": "20260712",
+ "startTime": "09:30AM",
+ "endTime": "10:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783821600000,
+ "npvrStartTime": 1783819800000,
+ "cid": "one piece: marineford arcs1e4the force that could destroy the world! the power of the tremor-tremor frui",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351497",
+ "vimProgramId": "202606244351497",
+ "name": "One Piece: Marineford Arc S1E5 -An All-Encompassing Inferno!! Admiral Akainu's Power!",
+ "start": 1783821600000,
+ "end": 1783823400000,
+ "date": "20260712",
+ "startTime": "10:00AM",
+ "endTime": "10:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783823400000,
+ "npvrStartTime": 1783821600000,
+ "cid": "one piece: marineford arcs1e5an all-encompassing inferno!! admiral akainu's power!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351498",
+ "vimProgramId": "202606244351498",
+ "name": "One Piece: Marineford Arc S1E6 -A Descendant Of The Beast! Little Oars Jr. Full Speed Ahead!",
+ "start": 1783823400000,
+ "end": 1783825200000,
+ "date": "20260712",
+ "startTime": "10:30AM",
+ "endTime": "11:00AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783825200000,
+ "npvrStartTime": 1783823400000,
+ "cid": "one piece: marineford arcs1e6a descendant of the beast! little oars jr. full speed ahead!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351499",
+ "vimProgramId": "202606244351499",
+ "name": "Oshi No Ko S1E3 -Manga-Based TV Drama",
+ "start": 1783825200000,
+ "end": 1783827000000,
+ "date": "20260712",
+ "startTime": "11:00AM",
+ "endTime": "11:30AM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783827000000,
+ "npvrStartTime": 1783825200000,
+ "cid": "oshi no kos1e3manga-based tv drama",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351500",
+ "vimProgramId": "202606244351500",
+ "name": "Oshi No Ko S1E4 -Actors",
+ "start": 1783827000000,
+ "end": 1783828800000,
+ "date": "20260712",
+ "startTime": "11:30AM",
+ "endTime": "12:00PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783828800000,
+ "npvrStartTime": 1783827000000,
+ "cid": "oshi no kos1e4actors",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351501",
+ "vimProgramId": "202606244351501",
+ "name": "Unnamed Memory S2E13 -From A Blank Page Anew",
+ "start": 1783828800000,
+ "end": 1783830600000,
+ "date": "20260712",
+ "startTime": "12:00PM",
+ "endTime": "12:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783830600000,
+ "npvrStartTime": 1783828800000,
+ "cid": "unnamed memorys2e13from a blank page anew",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351502",
+ "vimProgramId": "202606244351502",
+ "name": "Unnamed Memory S2E14 -Emerging From A Glass Cocoon",
+ "start": 1783830600000,
+ "end": 1783832400000,
+ "date": "20260712",
+ "startTime": "12:30PM",
+ "endTime": "01:00PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783832400000,
+ "npvrStartTime": 1783830600000,
+ "cid": "unnamed memorys2e14emerging from a glass cocoon",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351503",
+ "vimProgramId": "202606244351503",
+ "name": "Unnamed Memory S2E15 -Unanswered Prayer",
+ "start": 1783832400000,
+ "end": 1783834200000,
+ "date": "20260712",
+ "startTime": "01:00PM",
+ "endTime": "01:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783834200000,
+ "npvrStartTime": 1783832400000,
+ "cid": "unnamed memorys2e15unanswered prayer",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351504",
+ "vimProgramId": "202606244351504",
+ "name": "One Piece: Marineford Arc S1E3 -The Beginning Of The War! Ace And Whitebeard's Past!",
+ "start": 1783834200000,
+ "end": 1783836000000,
+ "date": "20260712",
+ "startTime": "01:30PM",
+ "endTime": "02:00PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783836000000,
+ "npvrStartTime": 1783834200000,
+ "cid": "one piece: marineford arcs1e3the beginning of the war! ace and whitebeard's past!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351505",
+ "vimProgramId": "202606244351505",
+ "name": "One Piece: Marineford Arc S1E4 -The Force That Could Destroy The World! The Power Of The Tremor-Tremor Frui",
+ "start": 1783836000000,
+ "end": 1783837800000,
+ "date": "20260712",
+ "startTime": "02:00PM",
+ "endTime": "02:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783837800000,
+ "npvrStartTime": 1783836000000,
+ "cid": "one piece: marineford arcs1e4the force that could destroy the world! the power of the tremor-tremor frui",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351506",
+ "vimProgramId": "202606244351506",
+ "name": "One Piece: Marineford Arc S1E5 -An All-Encompassing Inferno!! Admiral Akainu's Power!",
+ "start": 1783837800000,
+ "end": 1783839600000,
+ "date": "20260712",
+ "startTime": "02:30PM",
+ "endTime": "03:00PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783839600000,
+ "npvrStartTime": 1783837800000,
+ "cid": "one piece: marineford arcs1e5an all-encompassing inferno!! admiral akainu's power!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351507",
+ "vimProgramId": "202606244351507",
+ "name": "One Piece: Marineford Arc S1E6 -A Descendant Of The Beast! Little Oars Jr. Full Speed Ahead!",
+ "start": 1783839600000,
+ "end": 1783841400000,
+ "date": "20260712",
+ "startTime": "03:00PM",
+ "endTime": "03:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783841400000,
+ "npvrStartTime": 1783839600000,
+ "cid": "one piece: marineford arcs1e6a descendant of the beast! little oars jr. full speed ahead!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351508",
+ "vimProgramId": "202606244351508",
+ "name": "Black Clover S1E10 -To Protect Someone",
+ "start": 1783841400000,
+ "end": 1783843080000,
+ "date": "20260712",
+ "startTime": "03:30PM",
+ "endTime": "03:58PM",
+ "duration": 28,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783843080000,
+ "npvrStartTime": 1783841400000,
+ "cid": "black clovers1e10to protect someone",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351509",
+ "vimProgramId": "202606244351509",
+ "name": "Black Clover S1E11 -What Happened One Day In The Castle Town",
+ "start": 1783843080000,
+ "end": 1783844880000,
+ "date": "20260712",
+ "startTime": "03:58PM",
+ "endTime": "04:28PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783844880000,
+ "npvrStartTime": 1783843080000,
+ "cid": "black clovers1e11what happened one day in the castle town",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351510",
+ "vimProgramId": "202606244351510",
+ "name": "Black Clover S1E12 -The Wizard King Saw",
+ "start": 1783844880000,
+ "end": 1783846800000,
+ "date": "20260712",
+ "startTime": "04:28PM",
+ "endTime": "05:00PM",
+ "duration": 32,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783846800000,
+ "npvrStartTime": 1783844880000,
+ "cid": "black clovers1e12the wizard king saw",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351511",
+ "vimProgramId": "202606244351511",
+ "name": "Oshi No Ko S1E3 -Manga-Based TV Drama",
+ "start": 1783846800000,
+ "end": 1783848600000,
+ "date": "20260712",
+ "startTime": "05:00PM",
+ "endTime": "05:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783848600000,
+ "npvrStartTime": 1783846800000,
+ "cid": "oshi no kos1e3manga-based tv drama",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351512",
+ "vimProgramId": "202606244351512",
+ "name": "Oshi No Ko S1E4 -Actors",
+ "start": 1783848600000,
+ "end": 1783850400000,
+ "date": "20260712",
+ "startTime": "05:30PM",
+ "endTime": "06:00PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783850400000,
+ "npvrStartTime": 1783848600000,
+ "cid": "oshi no kos1e4actors",
+ "sid": "oshi no kos1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351513",
+ "vimProgramId": "202606244351513",
+ "name": "Unnamed Memory S2E13 -From A Blank Page Anew",
+ "start": 1783850400000,
+ "end": 1783852080000,
+ "date": "20260712",
+ "startTime": "06:00PM",
+ "endTime": "06:28PM",
+ "duration": 28,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783852080000,
+ "npvrStartTime": 1783850400000,
+ "cid": "unnamed memorys2e13from a blank page anew",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351514",
+ "vimProgramId": "202606244351514",
+ "name": "Unnamed Memory S2E14 -Emerging From A Glass Cocoon",
+ "start": 1783852080000,
+ "end": 1783853880000,
+ "date": "20260712",
+ "startTime": "06:28PM",
+ "endTime": "06:58PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783853880000,
+ "npvrStartTime": 1783852080000,
+ "cid": "unnamed memorys2e14emerging from a glass cocoon",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351515",
+ "vimProgramId": "202606244351515",
+ "name": "Unnamed Memory S2E15 -Unanswered Prayer",
+ "start": 1783853880000,
+ "end": 1783855800000,
+ "date": "20260712",
+ "startTime": "06:58PM",
+ "endTime": "07:30PM",
+ "duration": 32,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783855800000,
+ "npvrStartTime": 1783853880000,
+ "cid": "unnamed memorys2e15unanswered prayer",
+ "sid": "unnamed memorys2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351516",
+ "vimProgramId": "202606244351516",
+ "name": "Black Clover S1E10 -To Protect Someone",
+ "start": 1783855800000,
+ "end": 1783857480000,
+ "date": "20260712",
+ "startTime": "07:30PM",
+ "endTime": "07:58PM",
+ "duration": 28,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783857480000,
+ "npvrStartTime": 1783855800000,
+ "cid": "black clovers1e10to protect someone",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351517",
+ "vimProgramId": "202606244351517",
+ "name": "Black Clover S1E11 -What Happened One Day In The Castle Town",
+ "start": 1783857480000,
+ "end": 1783859280000,
+ "date": "20260712",
+ "startTime": "07:58PM",
+ "endTime": "08:28PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783859280000,
+ "npvrStartTime": 1783857480000,
+ "cid": "black clovers1e11what happened one day in the castle town",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351518",
+ "vimProgramId": "202606244351518",
+ "name": "Black Clover S1E12 -The Wizard King Saw",
+ "start": 1783859280000,
+ "end": 1783861200000,
+ "date": "20260712",
+ "startTime": "08:28PM",
+ "endTime": "09:00PM",
+ "duration": 32,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783861200000,
+ "npvrStartTime": 1783859280000,
+ "cid": "black clovers1e12the wizard king saw",
+ "sid": "black clovers1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351519",
+ "vimProgramId": "202606244351519",
+ "name": "One Piece: Marineford Arc S1E3 -The Beginning Of The War! Ace And Whitebeard's Past!",
+ "start": 1783861200000,
+ "end": 1783863000000,
+ "date": "20260712",
+ "startTime": "09:00PM",
+ "endTime": "09:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783863000000,
+ "npvrStartTime": 1783861200000,
+ "cid": "one piece: marineford arcs1e3the beginning of the war! ace and whitebeard's past!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351520",
+ "vimProgramId": "202606244351520",
+ "name": "One Piece: Marineford Arc S1E4 -The Force That Could Destroy The World! The Power Of The Tremor-Tremor Frui",
+ "start": 1783863000000,
+ "end": 1783864680000,
+ "date": "20260712",
+ "startTime": "09:30PM",
+ "endTime": "09:58PM",
+ "duration": 28,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783864680000,
+ "npvrStartTime": 1783863000000,
+ "cid": "one piece: marineford arcs1e4the force that could destroy the world! the power of the tremor-tremor frui",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351521",
+ "vimProgramId": "202606244351521",
+ "name": "One Piece: Marineford Arc S1E5 -An All-Encompassing Inferno!! Admiral Akainu's Power!",
+ "start": 1783864680000,
+ "end": 1783866480000,
+ "date": "20260712",
+ "startTime": "09:58PM",
+ "endTime": "10:28PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783866480000,
+ "npvrStartTime": 1783864680000,
+ "cid": "one piece: marineford arcs1e5an all-encompassing inferno!! admiral akainu's power!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351522",
+ "vimProgramId": "202606244351522",
+ "name": "One Piece: Marineford Arc S1E6 -A Descendant Of The Beast! Little Oars Jr. Full Speed Ahead!",
+ "start": 1783866480000,
+ "end": 1783868400000,
+ "date": "20260712",
+ "startTime": "10:28PM",
+ "endTime": "11:00PM",
+ "duration": 32,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783868400000,
+ "npvrStartTime": 1783866480000,
+ "cid": "one piece: marineford arcs1e6a descendant of the beast! little oars jr. full speed ahead!",
+ "sid": "one piece: marineford arcs1",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351523",
+ "vimProgramId": "202606244351523",
+ "name": "Fruits Basket S2E23 -It's Cinderella-Ish",
+ "start": 1783868400000,
+ "end": 1783870200000,
+ "date": "20260712",
+ "startTime": "11:00PM",
+ "endTime": "11:30PM",
+ "duration": 30,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783870200000,
+ "npvrStartTime": 1783868400000,
+ "cid": "fruits baskets2e23it's cinderella-ish",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351524",
+ "vimProgramId": "202606244351524",
+ "name": "Fruits Basket S2E24 -Here You Are",
+ "start": 1783870200000,
+ "end": 1783871880000,
+ "date": "20260712",
+ "startTime": "11:30PM",
+ "endTime": "11:58PM",
+ "duration": 28,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783871880000,
+ "npvrStartTime": 1783870200000,
+ "cid": "fruits baskets2e24here you are",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ },
+ {
+ "key": "key_202606244351525",
+ "vimProgramId": "202606244351525",
+ "name": "Fruits Basket S2E25 -I'm Different Now",
+ "start": 1783871880000,
+ "end": 1783873800000,
+ "date": "20260712",
+ "startTime": "11:58PM",
+ "endTime": "12:30AM",
+ "duration": 32,
+ "recordable": true,
+ "restartTv": false,
+ "restartOtt": false,
+ "npvrProg": true,
+ "npvrEndTime": 1783873800000,
+ "npvrStartTime": 1783871880000,
+ "cid": "fruits baskets2e25i'm different now",
+ "sid": "fruits baskets2",
+ "cc": "",
+ "isInWatchlist": false
+ }
+ ]
+]
\ No newline at end of file
diff --git a/sites/nowplayer.now.com/__data__/program01.json b/sites/nowplayer.now.com/__data__/program01.json
new file mode 100644
index 000000000..d9d7cb661
--- /dev/null
+++ b/sites/nowplayer.now.com/__data__/program01.json
@@ -0,0 +1,55 @@
+{
+ "actualStartTime": 1783785600000,
+ "programDateTimeForMobile": "Tomorrow 12 Jul\u003Cbr /\u003E12:00 AM-12:30 AM",
+ "autoProgName": "第2集 - The Beginning Of The Story",
+ "autoSeriesName": "克拉龍人拉格納",
+ "autoSynopsis": "翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。",
+ "channelAutoName": "Animax",
+ "channelChiName": "Animax",
+ "channelEngName": "Animax",
+ "channelId": "150",
+ "channelKey": "201507200000414",
+ "chiProgName": "第2集 - The Beginning Of The Story",
+ "chiSeriesName": "克拉龍人拉格納",
+ "chiSynopsis": "翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。",
+ "cid": "ragna crimsons1e2the beginning of the story",
+ "createdBy": "keith.sk.hung@pccw.com",
+ "createdDate": "2026-06-24 12:13:00.0",
+ "director": "Ken Takakura",
+ "duration": 30,
+ "effectiveDay": 7,
+ "endTime": 1783787400000,
+ "engProgName": "E2 - The Beginning Of The Story",
+ "engSeriesName": "Ragna Crimson",
+ "engSynopsis": "Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.",
+ "episodeName": "Ragna Crimson S1E2 -The Beginning Of The Story",
+ "episodeNum": 2,
+ "episodic": "Y",
+ "expirationDay": 10,
+ "firstReleaseYear": 2023,
+ "genre": "Anime",
+ "hasOtherNonAdult": false,
+ "hasOtherTime": false,
+ "isDeleted": "N",
+ "isKolWatchParty": "N",
+ "isLive": "N",
+ "isNpvrOnair": "N",
+ "isNpvrProg": "Y",
+ "isRestartTv": "N",
+ "isRestartOtt": "N",
+ "modifiedBy": "Npvr Postcut Assetloader",
+ "modifiedDate": "2026-07-05 00:00:27.0",
+ "originalLanguage": "Japanese",
+ "portraitImage": "",
+ "premier": 0,
+ "progName": "Ragna Crimson S1E2 -The Beginning Of The Story",
+ "programId": "202606244351477",
+ "recordable": "Y",
+ "seriesName": "Ragna Crimson",
+ "sid": "ragna crimsons1",
+ "synopsis": "Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.",
+ "watchPartyPlatform": [],
+ "withImageTitle": "N",
+ "isAdultContent": false,
+ "isInWatchlist": false
+}
\ No newline at end of file
diff --git a/sites/nowplayer.now.com/__data__/program02.json b/sites/nowplayer.now.com/__data__/program02.json
new file mode 100644
index 000000000..50c4041a7
--- /dev/null
+++ b/sites/nowplayer.now.com/__data__/program02.json
@@ -0,0 +1,55 @@
+{
+ "actualStartTime": 1783871880000,
+ "programDateTimeForMobile": "Tomorrow 12 Jul\u003Cbr /\u003E11:58 PM-12:30 AM",
+ "autoProgName": "第25集 - I'm Different Now",
+ "autoSeriesName": "魔法水果籃",
+ "autoSynopsis": "紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。",
+ "channelAutoName": "Animax",
+ "channelChiName": "Animax",
+ "channelEngName": "Animax",
+ "channelId": "150",
+ "channelKey": "201507200000414",
+ "chiProgName": "第25集 - I'm Different Now",
+ "chiSeriesName": "魔法水果籃",
+ "chiSynopsis": "紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。",
+ "cid": "fruits baskets2e25i'm different now",
+ "createdBy": "keith.sk.hung@pccw.com",
+ "createdDate": "2026-06-24 12:13:00.0",
+ "director": "Yoshihide Ibata",
+ "duration": 32,
+ "effectiveDay": 7,
+ "endTime": 1783873800000,
+ "engProgName": "E25 - I'm Different Now",
+ "engSeriesName": "Fruits Basket",
+ "engSynopsis": "Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa's feelings for him.",
+ "episodeName": "Fruits Basket S2E25 -I'm Different Now",
+ "episodeNum": 25,
+ "episodic": "Y",
+ "expirationDay": 10,
+ "firstReleaseYear": 2020,
+ "genre": "Anime",
+ "hasOtherNonAdult": true,
+ "hasOtherTime": true,
+ "isDeleted": "N",
+ "isKolWatchParty": "N",
+ "isLive": "N",
+ "isNpvrOnair": "N",
+ "isNpvrProg": "Y",
+ "isRestartTv": "N",
+ "isRestartOtt": "N",
+ "modifiedBy": "Npvr Postcut Assetloader",
+ "modifiedDate": "2026-07-06 00:00:24.0",
+ "originalLanguage": "Japanese",
+ "portraitImage": "",
+ "premier": 0,
+ "progName": "Fruits Basket S2E25 -I'm Different Now",
+ "programId": "202606244351525",
+ "recordable": "Y",
+ "seriesName": "Fruits Basket",
+ "sid": "fruits baskets2",
+ "synopsis": "Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa's feelings for him.",
+ "watchPartyPlatform": [],
+ "withImageTitle": "N",
+ "isAdultContent": false,
+ "isInWatchlist": false
+}
\ No newline at end of file
diff --git a/sites/nowplayer.now.com/nowplayer.now.com.config.js b/sites/nowplayer.now.com/nowplayer.now.com.config.js
index 14697d29c..1301f8dda 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com.config.js
+++ b/sites/nowplayer.now.com/nowplayer.now.com.config.js
@@ -2,34 +2,81 @@ const axios = require('axios')
const cheerio = require('cheerio')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
+const doFetch = require('@ntlab/sfetch')
dayjs.extend(utc)
+const eventIds = {}
+const cookies = {}
+const caches = {}
+
module.exports = {
site: 'nowplayer.now.com',
days: 2,
- url: function ({ channel, date }) {
+ url({ channel, date }) {
const diff = date.diff(dayjs.utc().startOf('d'), 'd') + 1
return `https://nowplayer.now.com/tvguide/epglist?channelIdList[]=${channel.site_id}&day=${diff}`
},
request: {
+ cache: {
+ ttl: 24 * 60 * 60 * 1000 // 1 day
+ },
headers({ channel }) {
return {
- Cookie: `LANG=${channel.lang}; Expires=null; Path=/; Domain=nowplayer.now.com`
+ 'user-agent':
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 OPR/132.0.0.0',
+ 'cookie': Object.entries({ ...cookies, LANG: channel.lang})
+ .map(a => `${a[0]}=${a[1]}`)
+ .join('; ')
}
}
},
- parser: function ({ content }) {
- let programs = []
+ async parser({ content, channel, headers }) {
+ const programs = []
+ parseCookies(headers)
const items = parseItems(content)
- items.forEach(item => {
- programs.push({
- title: item.name,
- start: parseStart(item),
- stop: parseStop(item)
+ if (items.length) {
+ if (eventIds[channel.lang] === undefined) {
+ eventIds[channel.lang] = []
+ }
+ const queues = items
+ .filter(item => item.vimProgramId && !eventIds[channel.lang].includes(item.vimProgramId))
+ .map(item => {
+ const url = `https://nowplayer.now.com/tvguide/epgprogramdetail?programId=${item.vimProgramId}`
+ if (caches[url] !== undefined) {
+ item.detail = caches[url]
+ } else {
+ return {
+ url,
+ params: { headers: module.exports.request.headers({ channel }) },
+ item
+ }
+ }
+ })
+ .filter(Boolean)
+ const worker = process.env.EPG_DETAILED_GUIDE_WORKER || 10
+ const delay = process.env.EPG_DETAILED_GUIDE_DELAY || 500
+ await doFetch(queues, { worker }, async (queue, res, headers) => {
+ parseCookies(headers)
+ queue.item.detail = res
+ caches[queue.url] = res
+ await new Promise(resolve => setTimeout(resolve, delay))
})
- })
+ items.forEach(item => {
+ eventIds[channel.lang].push(item.vimProgramId)
+ programs.push({
+ title: (channel.lang === 'zh' ? item.detail?.chiProgName : item.detail?.progName) || item.name,
+ description: channel.lang === 'zh' ? item.detail?.chiSynopsis : item.detail?.synopsis,
+ categories: [item.detail?.genre, item.detail?.subGenre].filter(Boolean),
+ actor: item.detail?.actor?.split(',').map(a => a.trim()),
+ director: item.detail?.director?.split(',').map(a => a.trim()),
+ year: item.detail?.firstReleaseYear?.toString(),
+ start: getDate(item.start),
+ stop: getDate(item.end)
+ })
+ })
+ }
return programs
},
@@ -39,7 +86,7 @@ module.exports = {
.then(r => r.data)
.catch(console.log)
- let channels = []
+ const channels = []
const $ = cheerio.load(html)
$('body > div.container > .tv-guide-s-g > div > div').each((i, el) => {
@@ -54,17 +101,27 @@ module.exports = {
}
}
-function parseStart(item) {
- return dayjs(item.start)
-}
-
-function parseStop(item) {
- return dayjs(item.end)
-}
-
function parseItems(content) {
const data = JSON.parse(content)
if (!data || !Array.isArray(data)) return []
return Array.isArray(data[0]) ? data[0] : []
}
+
+function parseCookies(headers) {
+ if (headers && Array.isArray(headers['set-cookie'])) {
+ headers['set-cookie']
+ .map(cookie => cookie.split(';')[0].trim())
+ .forEach(cookie => {
+ const [k, v] = [
+ cookie.substr(0, cookie.indexOf('=')),
+ cookie.substr(cookie.indexOf('=') + 1),
+ ]
+ cookies[k] = v
+ })
+ }
+}
+
+function getDate(dt) {
+ return dayjs.utc(dt)
+}
diff --git a/sites/nowplayer.now.com/nowplayer.now.com.test.js b/sites/nowplayer.now.com/nowplayer.now.com.test.js
index 39e90077a..e90346a51 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com.test.js
+++ b/sites/nowplayer.now.com/nowplayer.now.com.test.js
@@ -1,57 +1,119 @@
const { parser, url, request } = require('./nowplayer.now.com.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')
+
+process.env.EPG_DETAILED_GUIDE_DELAY = 0
+
dayjs.extend(customParseFormat)
dayjs.extend(utc)
+jest.mock('axios')
+
+const date = dayjs.utc().startOf('d')
const channel = {
- lang: 'zh',
- site_id: '096',
- xmltv_id: 'ViuTVsix.hk'
+ lang: 'en',
+ site_id: '150',
+ xmltv_id: 'AnimaxAsia.sg@SD'
}
+axios.get.mockImplementation(url => {
+ const urls = {
+ 'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1': 'content.json',
+ 'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351477': 'program01.json',
+ 'https://nowplayer.now.com/tvguide/epgprogramdetail?programId=202606244351525': 'program02.json'
+ }
+ let data = ''
+ if (urls[url] !== undefined) {
+ data = JSON.parse(fs.readFileSync(path.join(__dirname, '__data__', urls[url])))
+ }
+ return Promise.resolve({ data })
+})
+
+
it('can generate valid url for today', () => {
- const date = dayjs.utc().startOf('d')
expect(url({ channel, date })).toBe(
- 'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=096&day=1'
+ 'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=1'
)
})
it('can generate valid url for tomorrow', () => {
- const date = dayjs.utc().startOf('d').add(1, 'd')
- expect(url({ channel, date })).toBe(
- 'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=096&day=2'
+ expect(url({ channel, date: date.add(1, 'd') })).toBe(
+ 'https://nowplayer.now.com/tvguide/epglist?channelIdList[]=150&day=2'
)
})
it('can generate valid request headers', () => {
expect(request.headers({ channel })).toMatchObject({
- Cookie: 'LANG=zh; Expires=null; Path=/; Domain=nowplayer.now.com'
+ cookie: 'LANG=en'
})
})
-it('can parse response', () => {
+it('can parse en response', async () => {
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
- const result = parser({ content }).map(p => {
- p.start = p.start.toJSON()
- p.stop = p.stop.toJSON()
- return p
- })
+ const result = (await parser({ content, channel, date }))
+ .map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
- expect(result).toMatchObject([
- {
- start: '2021-11-23T18:00:00.000Z',
- stop: '2021-11-24T01:00:00.000Z',
- title: 'ViuTVsix Station Closing'
- }
- ])
+ expect(result.length).toBe(49)
+ expect(result[0]).toMatchObject({
+ start: '2026-07-11T16:00:00.000Z',
+ stop: '2026-07-11T16:30:00.000Z',
+ title: 'Ragna Crimson S1E2 -The Beginning Of The Story',
+ description:
+ 'Ragna uses his newly gained power to hunt dragons and makes a resolution to avoid the miserable future that awaits him.',
+ categories: ['Anime'],
+ year: '2023'
+ })
+ expect(result[48]).toMatchObject({
+ start: '2026-07-12T15:58:00.000Z',
+ stop: '2026-07-12T16:30:00.000Z',
+ title: 'Fruits Basket S2E25 -I\'m Different Now',
+ description:
+ 'Kureno watches a copy of the Cinderella-ish play which Tohru prepared, hoping that he will realize Arisa\'s feelings for him.',
+ categories: ['Anime'],
+ year: '2020'
+ })
})
-it('can handle empty guide', () => {
- const result = parser({
+it('can parse zh response', async () => {
+ const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
+ const result = (await parser({ content, channel: { ...channel, lang: 'zh' }, date }))
+ .map(p => {
+ p.start = p.start.toJSON()
+ p.stop = p.stop.toJSON()
+ return p
+ })
+
+ expect(result.length).toBe(49)
+ expect(result[0]).toMatchObject({
+ start: '2026-07-11T16:00:00.000Z',
+ stop: '2026-07-11T16:30:00.000Z',
+ title: '第2集 - The Beginning Of The Story',
+ description:
+ '翼之血族在各地發動全面進攻, 拉格納運用獲得的力量與新出現的上級龍梅古卜帝戰鬥, 而他在此時所遇見的少女又是何許人物?未來與現在的記憶混亂不清, 為了迴避自己曾經歷過的淒慘未來, 拉格納決定投入與龍族的戰鬥, 並下定決心與某人道別。',
+ categories: ['Anime'],
+ year: '2023'
+ })
+ expect(result[48]).toMatchObject({
+ start: '2026-07-12T15:58:00.000Z',
+ stop: '2026-07-12T16:30:00.000Z',
+ title: '第25集 - I\'m Different Now',
+ description:
+ '紅野看了小透準備的一個類似灰姑娘的故事, 並希望他能知道亞里紗對自己的感覺。',
+ categories: ['Anime'],
+ year: '2020'
+ })
+})
+
+it('can handle empty guide', async () => {
+ const result = await parser({
content: '[[]]'
})
expect(result).toMatchObject([])
diff --git a/sites/nowplayer.now.com/nowplayer.now.com_en.channels.xml b/sites/nowplayer.now.com/nowplayer.now.com_en.channels.xml
index c4538e3ab..4901204fd 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com_en.channels.xml
+++ b/sites/nowplayer.now.com/nowplayer.now.com_en.channels.xml
@@ -1,16 +1,13 @@
- MOOV Concert/MV
- Watch N Learn
- Netflix
- Sports Schedule Highlights
Now Sports 4K 3
+ Now Sports 615
Now Sports Premier League 7
Now Sports 641
Now Sports 647
Now Sports 651
Now Sports 652
- Adult Promotional Channel
+ Lucky 688
ABC Australia
Al Jazeera English
Animal Planet
@@ -34,7 +31,6 @@
CCTV-4
CCTV-13
CGTN
- Channel Adult
CINEMAX
Channel NewsAsia
CNBC
@@ -42,7 +38,6 @@
COLORS
Crime + Investigation
CTI Asia Channel
- Da Vinci
Discovery Asia
Discovery Channel
Discovery Science
@@ -63,7 +58,6 @@
HISTORY
HITS
HITS MOVIES
- Ice Fire
Panda TV
KBS World
Lifetime
@@ -102,7 +96,6 @@
Now Sports 7
Now Sports 618
Now Sports 619
- Now Sports 650
Now Sports Plus
Now Sports Premier League 1
Now Sports Premier League 2
@@ -112,7 +105,6 @@
Now Sports Premier League 6
Now Sports Premier League TV
Now Sports Prime
- Now Video Express
Outdoor Channel
Phoenix Chinese Channel
Phoenix InfoNews Channel
@@ -135,8 +127,6 @@
tvN
GBA Satellite TV
Viu channel
- ViuTV
- ViuTVsix
Zee Cinema International
Zee News
Zee TV
diff --git a/sites/nowplayer.now.com/nowplayer.now.com_zh.channels.xml b/sites/nowplayer.now.com/nowplayer.now.com_zh.channels.xml
index 065b20d65..63a13e1d9 100644
--- a/sites/nowplayer.now.com/nowplayer.now.com_zh.channels.xml
+++ b/sites/nowplayer.now.com/nowplayer.now.com_zh.channels.xml
@@ -1,16 +1,13 @@
- MOOV Concert/MV
- Watch N Learn
- Netflix
- Sports Schedule Highlights
Now Sports 4K 3
+ Now Sports 615
Now Sports Premier League 7
Now Sports 641
Now Sports 647
Now Sports 651
Now Sports 652
- Adult Promotional Channel
+ Lucky 688
ABC Australia
Al Jazeera English
Animal Planet
@@ -34,7 +31,6 @@
CCTV-4
CCTV-13
CGTN
- Channel Adult
CINEMAX
Channel NewsAsia
CNBC
@@ -42,7 +38,6 @@
COLORS
Crime + Investigation
CTI Asia Channel
- Da Vinci
Discovery Asia
Discovery Channel
Discovery Science
@@ -63,7 +58,6 @@
HISTORY
HITS
HITS MOVIES
- Ice Fire
Panda TV
KBS World
Lifetime
@@ -102,7 +96,6 @@
Now Sports 7
Now Sports 618
Now Sports 619
- Now Sports 650
Now Sports Plus
Now Sports Premier League 1
Now Sports Premier League 2
@@ -112,7 +105,6 @@
Now Sports Premier League 6
Now Sports Premier League TV
Now Sports Prime
- Now Video Express
Outdoor Channel
Phoenix Chinese Channel
Phoenix InfoNews Channel
@@ -135,8 +127,6 @@
tvN
GBA Satellite TV
Viu channel
- ViuTV
- ViuTVsix
Zee Cinema International
Zee News
Zee TV