Skip to content

12/2025 Part 2 | Fixes & Updates#2957

Open
BellezaEmporium wants to merge 41 commits intomasterfrom
be-fixes
Open

12/2025 Part 2 | Fixes & Updates#2957
BellezaEmporium wants to merge 41 commits intomasterfrom
be-fixes

Conversation

@BellezaEmporium
Copy link
Contributor

@BellezaEmporium BellezaEmporium commented Dec 14, 2025

Why ?

Like the last time, this PR aims to fix some scrapers & update dependencies.

Concerned scrapers

sky.co.nz: rewrite
canalplus.com: rewrite, add Tim Italia & alternate Madagascar path & channels
winplay.co: rewrite

Provider changes

siba.com.co: changed service to add more channels, add channels parse, add geo disclaimer
scripts\commands\channels\parse.ts: return an error message if the targeted configuration doesn't contain a "channels" function.
stod2.is => syn.is
france.tv: new provider
tv.sfr.fr: corrected a small issue involving images
tivu.tv : simplify configuration

Modifications

Multiple channel updates.

Concerned issues

Closes #2853
Closes #2878
Closes #2998
Closes #3002
Closes #3003

@BellezaEmporium BellezaEmporium marked this pull request as draft December 14, 2025 23:47
@BellezaEmporium
Copy link
Contributor Author

This PR isn't dead, i'm currently on too many projects right now.

@BellezaEmporium
Copy link
Contributor Author

All the files are CRLF and yet the Actions worker think it isn't. Hmm.

@BellezaEmporium BellezaEmporium marked this pull request as ready for review February 19, 2026 16:53
@StrangeDrVN StrangeDrVN mentioned this pull request Feb 20, 2026
@freearhey
Copy link
Collaborator

incorrect EOL in only 4 files: france.tv/france.tv.config.js, france.tv/france.tv.test.js, syn.is/syn.is.config.js, syn.is/syn.is.test.js

npm run lint

> lint
> npx eslint "{scripts,tests,sites}/**/*.{ts,mts,js}"


/epg/sites/france.tv/france.tv.config.js
    1:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    2:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    3:40   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    4:50   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    5:68   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    6:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    7:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    8:23   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
    9:32   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   10:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   11:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   12:86   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   13:102  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   14:19   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   15:21   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   16:11   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   17:38   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   18:112  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   19:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   20:56   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   21:24   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   22:19   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   23:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   24:65   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   25:111  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   26:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   27:10   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   28:63   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   29:64   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   30:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   31:89   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   32:79   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   33:49   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   34:47   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   35:57   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   36:28   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   37:52   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   38:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   39:26   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   40:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   41:12   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   42:11   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   43:8    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   44:14   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   45:69   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   46:6    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   47:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   48:83   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   49:74   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   50:10   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   51:56   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   52:44   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   53:42   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   54:57   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   55:28   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   56:52   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   57:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   58:27   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   59:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   60:12   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   61:11   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   62:8    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   63:14   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   64:22   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   65:6    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   66:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   67:28   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   68:56   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   69:54   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   70:104  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   71:40   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   72:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   73:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   74:24   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   75:25   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   76:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   77:69   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   78:21   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   79:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   80:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   81:92   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   82:8    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   83:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   84:116  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   85:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   86:22   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   87:24   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   88:45   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   89:32   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   90:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   91:13   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   92:12   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   93:22   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   94:24   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   95:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   96:9    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   97:7    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   98:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   99:20   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  100:4    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  101:2    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  102:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  103:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  104:49   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  105:48   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  106:88   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  107:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  108:62   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  109:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  110:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  111:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  112:28   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  113:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  114:46   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  115:53   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  116:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  117:35   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  118:67   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  119:44   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  120:65   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  121:42   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  122:60   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  123:8    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  124:6    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  125:4    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  126:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  127:97   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  128:54   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  129:25   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  130:2    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  131:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  132:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  133:42   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  134:13   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  135:2    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style

/epg/sites/france.tv/france.tv.test.js
   1:57   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   2:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   3:25   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   4:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   5:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   6:40   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   7:68   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   8:32   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   9:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  10:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  11:19   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  12:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  13:64   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  14:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  15:23   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  16:28   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  17:2    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  18:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  19:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  20:112  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  21:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  22:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  23:39   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  24:44   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  25:84   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  26:72   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  27:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  28:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  29:13   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  30:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  31:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  32:34   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  33:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  34:61   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  35:178  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  36:149  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  37:39   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  38:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  39:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  40:38   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  41:58   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  42:371  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  43:126  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  44:39   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  45:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  46:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  47:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  48:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  49:43   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  50:44   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  51:63   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  52:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  53:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  54:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style

/epg/sites/syn.is/syn.is.config.js
   1:31  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   2:40  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   3:31  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   4:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   5:18  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   6:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   7:19  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   8:18  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   9:11  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  10:13  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  11:13  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  12:36  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  13:6   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  14:5   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  15:27  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  16:88  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  17:5   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  18:35  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  19:13  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  20:10  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  21:33  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  22:22  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  23:50  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  24:16  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  25:6   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  26:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  27:24  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  28:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  29:39  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  30:29  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  31:26  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  32:45  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  33:48  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  34:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  35:24  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  36:33  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  37:39  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  38:36  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  39:37  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  40:38  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  41:17  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  42:15  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  43:11  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  44:9   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  45:6   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  46:1   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  47:20  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  48:5   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  49:21  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  50:10  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  51:70  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  52:61  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  53:55  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  54:18  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  55:8   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  56:41  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  57:17  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  58:22  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  59:24  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  60:10  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  61:9   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  62:22  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  63:55  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  64:16  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  65:6   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  66:4   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  67:2   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style

/epg/sites/syn.is/syn.is.test.js
   1:56   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   2:25   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   3:29   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   4:31   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   5:40   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   6:68   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   7:50   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   8:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
   9:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  10:32   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  11:23   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  12:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  13:66   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  14:59   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  15:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  16:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  17:46   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  18:75   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  19:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  20:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  21:33   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  22:84   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  23:48   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  24:36   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  25:34   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  26:13   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  27:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  28:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  29:33   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  30:6    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  31:25   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  32:41   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  33:19   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  34:282  error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  35:18   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  36:21   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  37:41   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  38:39   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  39:6    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  40:5    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  41:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  42:1    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  43:37   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  44:43   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  45:35   error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style
  46:3    error  Expected linebreaks to be 'CRLF' but found 'LF'  @stylistic/linebreak-style

✖ 302 problems (302 errors, 0 warnings)
  302 errors and 0 warnings potentially fixable with the `--fix` option.

@BellezaEmporium
Copy link
Contributor Author

I've tested the new canalplus grabber. It works good with the "fr" country code but for "rw" no program is found. I have refreshed the channel list but no luck.

I'm aware of it, and it's due to multiple token endpoints. Correcting it ASAP.

@freearhey
Copy link
Collaborator

canalplus.com: Cannot read properties of undefined (reading 'token')

Log
npm run grab --- --site=canalplus.com --proxy=socks://127.0.0.1:1086

> grab
> tsx scripts/commands/epg/grab.ts --site=canalplus.com --proxy=socks://127.0.0.1:1086

info starting...
info loading channels...
info found 13783 channel(s)
info loading api data...
info creating queue...
info run:
AxiosError: Request failed with status code 401
    at settle (/Users/Arhey/Code/iptv-org/epg/node_modules/axios/lib/core/settle.js:19:12)
    at IncomingMessage.handleStreamEnd (/Users/Arhey/Code/iptv-org/epg/node_modules/axios/lib/adapters/http.js:798:11)
    at IncomingMessage.emit (node:events:536:35)
    at endReadableNT (node:internal/streams/readable:1698:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21)
    at Axios.request (/Users/Arhey/Code/iptv-org/epg/node_modules/axios/lib/core/Axios.js:46:41)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async parseToken (/Users/Arhey/Code/iptv-org/epg/sites/canalplus.com/canalplus.com.config.js:196:21)
    at async Object.url (/Users/Arhey/Code/iptv-org/epg/sites/canalplus.com/canalplus.com.config.js:32:42)
    at async getRequestUrl (/Users/Arhey/Code/iptv-org/epg/node_modules/epg-grabber/dist/index-Bnw63KMN.js:697:18)
    at async Function.buildRequest (/Users/Arhey/Code/iptv-org/epg/node_modules/epg-grabber/dist/index-Bnw63KMN.js:705:19)
    at async EPGGrabber.grab (/Users/Arhey/Code/iptv-org/epg/node_modules/epg-grabber/dist/index-Bnw63KMN.js:766:23)
    at async <anonymous> (/Users/Arhey/Code/iptv-org/epg/scripts/commands/epg/grab.ts:239:31) {
  isAxiosError: true,
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false,
      legacyInterceptorReqResOrdering: true
    },
    adapter: [ 'xhr', 'http', 'fetch' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 5000,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: Object [AxiosHeaders] {
      Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8',
      'Content-Type': undefined,
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
      'Accept-Language': 'fr-FR,fr;q=0.6',
      'Accept-Encoding': 'gzip, deflate, br',
      Pragma: 'no-cache',
      Priority: 'u=0, i',
      'Sec-CH-UA': '"Not:A-Brand";v="99", "Brave";v="145", "Chromium";v="145"',
      'sec-ch-ua-mobile': '?0',
      'sec-ch-ua-platform': '"Windows"',
      'sec-fetch-dest': 'document',
      'sec-fetch-mode': 'navigate',
      'sec-fetch-site': 'none',
      'sec-fetch-user': '?1',
      'sec-gpc': '1',
      'upgrade-insecure-requests': '1'
    },
    method: 'get',
    url: 'https://hodor.canalplus.pro/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
    allowAbsoluteUrls: true,
    data: undefined
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      connect: [Function (anonymous)],
      error: [Function (anonymous)],
      socket: [Function (anonymous)],
      timeout: [Function (anonymous)],
      finish: [Function: requestOnFinish]
    },
    _eventsCount: 7,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: true,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: true,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: true,
    _header: 'GET /api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1 HTTP/1.1\r\n' +
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8\r\n' +
      'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36\r\n' +
      'Accept-Language: fr-FR,fr;q=0.6\r\n' +
      'Accept-Encoding: gzip, deflate, br\r\n' +
      'Pragma: no-cache\r\n' +
      'Priority: u=0, i\r\n' +
      'Sec-CH-UA: "Not:A-Brand";v="99", "Brave";v="145", "Chromium";v="145"\r\n' +
      'sec-ch-ua-mobile: ?0\r\n' +
      'sec-ch-ua-platform: "Windows"\r\n' +
      'sec-fetch-dest: document\r\n' +
      'sec-fetch-mode: navigate\r\n' +
      'sec-fetch-site: none\r\n' +
      'sec-fetch-user: ?1\r\n' +
      'sec-gpc: 1\r\n' +
      'upgrade-insecure-requests: 1\r\n' +
      'Host: hodor.canalplus.pro\r\n' +
      'Connection: keep-alive\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: nop],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype] {},
      freeSockets: [Object: null prototype],
      keepAliveMsecs: 1000,
      keepAlive: true,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
    _ended: true,
    res: IncomingMessage {
      _events: [Object],
      _readableState: [ReadableState],
      _maxListeners: undefined,
      socket: null,
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      rawHeaders: [Array],
      rawTrailers: [],
      joinDuplicateHeaders: undefined,
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 401,
      statusMessage: 'Unauthorized',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      _eventsCount: 4,
      responseUrl: 'https://hodor.canalplus.pro/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
      redirects: [],
      [Symbol(shapeMode)]: true,
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 24,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'hodor.canalplus.pro',
    protocol: 'https:',
    _redirectable: Writable {
      _events: [Object],
      _writableState: [WritableState],
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 0,
      _requestBodyBuffers: [],
      _eventsCount: 3,
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://hodor.canalplus.pro/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
      _timeout: null,
      [Symbol(shapeMode)]: true,
      [Symbol(kCapture)]: false
    },
    [Symbol(shapeMode)]: false,
    [Symbol(kCapture)]: false,
    [Symbol(kBytesWritten)]: 0,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kChunkedBuffer)]: [],
    [Symbol(kChunkedLength)]: 0,
    [Symbol(kSocket)]: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'hodor.canalplus.pro',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 9,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'hodor.canalplus.pro',
      _closeAfterHandlingError: false,
      _readableState: [ReadableState],
      _writableState: [WritableState],
      allowHalfOpen: false,
      _maxListeners: undefined,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      timeout: 5000,
      parser: null,
      _httpMessage: null,
      autoSelectFamilyAttemptedAddresses: [Array],
      [Symbol(alpncallback)]: null,
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: -1,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: Timeout {
        _idleTimeout: 5000,
        _idlePrev: [TimersList],
        _idleNext: [TimersList],
        _idleStart: 14181,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 27922,
        [Symbol(triggerId)]: 27920,
        [Symbol(kAsyncContextFrame)]: undefined
      },
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(shapeMode)]: true,
      [Symbol(kCapture)]: false,
      [Symbol(kSetNoDelay)]: false,
      [Symbol(kSetKeepAlive)]: true,
      [Symbol(kSetKeepAliveInitialDelay)]: 1,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object]
    },
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'user-agent': [Array],
      'accept-language': [Array],
      'accept-encoding': [Array],
      pragma: [Array],
      priority: [Array],
      'sec-ch-ua': [Array],
      'sec-ch-ua-mobile': [Array],
      'sec-ch-ua-platform': [Array],
      'sec-fetch-dest': [Array],
      'sec-fetch-mode': [Array],
      'sec-fetch-site': [Array],
      'sec-fetch-user': [Array],
      'sec-gpc': [Array],
      'upgrade-insecure-requests': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 65536,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 401,
    statusText: 'Unauthorized',
    headers: Object [AxiosHeaders] {
      'content-type': 'application/json; charset=utf-8',
      'content-length': '749',
      'x-frame-options': 'SAMEORIGIN',
      'referrer-policy': 'origin',
      'x-content-type-options': 'nosniff',
      'access-control-allow-origin': '*',
      'access-control-allow-credentials': 'true',
      'x-unique-id': '3a4b8e17-7abb-4d45-a54d-8b105b547588',
      date: 'Mon, 23 Feb 2026 15:44:05 GMT',
      connection: 'keep-alive',
      'alt-svc': 'h3=":443"; ma=93600',
      'set-cookie': [Array]
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 5000,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [Object [AxiosHeaders]],
      method: 'get',
      url: 'https://hodor.canalplus.pro/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
      allowAbsoluteUrls: true,
      data: undefined
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: true,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: true,
      _header: 'GET /api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1 HTTP/1.1\r\n' +
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8\r\n' +
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36\r\n' +
        'Accept-Language: fr-FR,fr;q=0.6\r\n' +
        'Accept-Encoding: gzip, deflate, br\r\n' +
        'Pragma: no-cache\r\n' +
        'Priority: u=0, i\r\n' +
        'Sec-CH-UA: "Not:A-Brand";v="99", "Brave";v="145", "Chromium";v="145"\r\n' +
        'sec-ch-ua-mobile: ?0\r\n' +
        'sec-ch-ua-platform: "Windows"\r\n' +
        'sec-fetch-dest: document\r\n' +
        'sec-fetch-mode: navigate\r\n' +
        'sec-fetch-site: none\r\n' +
        'sec-fetch-user: ?1\r\n' +
        'sec-gpc: 1\r\n' +
        'upgrade-insecure-requests: 1\r\n' +
        'Host: hodor.canalplus.pro\r\n' +
        'Connection: keep-alive\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/api/v2/oneshopafr/authenticate.json/webapp/2.0?language=fr&offerLocation=AD&offerZone=cpafr&v=1',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'hodor.canalplus.pro',
      protocol: 'https:',
      _redirectable: [Writable],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kChunkedBuffer)]: [],
      [Symbol(kChunkedLength)]: 0,
      [Symbol(kSocket)]: [TLSSocket],
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kHighWaterMark)]: 65536,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null
    },
    data: {
      currentPage: [Object],
      title: 'Accès non autorisé',
      text: "Vous n'êtes pas autorisé à accéder à cette page. Si le problème persiste, vous pouvez contacter l'assistance.",
      code: 401,
      tracking: [Object]
    }
  },
  status: 401
}
info   [1/27566] canalplus.com (fr) - ad#180001 - Feb 23, 2026 (0 programs)
info     ERR: Cannot read properties of undefined (reading 'token')

@BellezaEmporium
Copy link
Contributor Author

BellezaEmporium commented Feb 23, 2026

canalplus.com: Cannot read properties of undefined (reading 'token')

Log

Forgot to deindex the changes off that one. The commit was supposed to be for syn.is only.

AD is one bummer. It's written as "Andorra" yet is pointing to Canal+ Afrique offer zone. It's for another country or set of countries, but i don't know what.

Canal + Afrique does NOT have any reference whatsoever of "ad". So it's quite weird. But it does return something when being pointed to Canal+ France...

Such a mystery, that I do not even have all the answers for.

EDIT3: If we read Canal + Afrique's JSON data, it replies with this :

bf: "Burkina Faso"
bi: "Burundi"
bj: "Bénin"
cd: "RDC"
cf: "République Centrafricaine"
cg: "Congo"
ci: "Côte d’Ivoire"
cm: "Cameroun"
dj: "Djibouti"
ga: "Gabon"
gh: "Ghana"
gm: "Gambie"
gn: "Guinée"
gq: "Guinée Équatoriale"
gw: "Guinée Bissau"
mg: "Madagascar"
ml: "Mali"
mr: "Mauritanie"
ne: "Niger"
rw: "Rwanda"
sl: "Sierra Leone"
sn: "Sénégal"
td: "Tchad"
tg: "Togo"

@StrangeDrVN
Copy link
Contributor

StrangeDrVN commented Feb 24, 2026

  • epgshare01.online takes a lot of time currently. Should it take that long?
NODE_OPTIONS=--max-old-space-size=6000 npm run grab --- --channels=sites/epgshare01.online/epgshare01.online_RAKUTEN1.channels.xml --output=epgshare_rakuten.xml

> grab
> tsx scripts/commands/epg/grab.ts --channels=sites/epgshare01.online/epgshare01.online_RAKUTEN1.channels.xml --output=epgshare_rakuten.xml

info starting...
info loading channels...
info found 1417 channel(s)
info loading api data...
info creating queue...
info run:
info   [1/2834] epgshare01.online (en) - RAKUTEN1#DE:.21.Jump.Street.be - Feb 24, 2026 (29 programs)
info   [2/2834] epgshare01.online (en) - RAKUTEN1#DE:.21.Jump.Street.be - Feb 25, 2026 (28 programs)
info   [3/2834] epgshare01.online (en) - RAKUTEN1#DE:.Abschnitt.40.be - Feb 24, 2026 (29 programs)
...
...
info   [2831/2834] epgshare01.online (en) - RAKUTEN1#SE:.Baby.Shark.TV.be - Feb 24, 2026 (47 programs)
info   [2832/2834] epgshare01.online (en) - RAKUTEN1#NO:.Rakuten.VIKI.be - Feb 25, 2026 (29 programs)
info   [2833/2834] epgshare01.online (en) - RAKUTEN1#SE:.World.of.Love.Island.be - Feb 25, 2026 (25 programs)
info   [2834/2834] epgshare01.online (en) - RAKUTEN1#NO:.Rakuten.VIKI.be - Feb 24, 2026 (23 programs)
info   saving to "epgshare_rakuten.xml"...
success   done in 00h 07m 31s
  • Also, time zone of RAKUTEN1 seems to be off, ~2 hours early. This might be an issue for few others too. From what i have checked, IN seems to be having correct time zone. Could add a flag for correcting time zones for affected ones.

@freearhey
Copy link
Collaborator

canalplus.com: AxiosError: read ETIMEDOUT

npm run grab --- --site=canalplus.com --proxy=socks://127.0.0.1:1086

> grab
> tsx scripts/commands/epg/grab.ts --site=canalplus.com --proxy=socks://127.0.0.1:1086

info starting...
info loading channels...
info found 13799 channel(s)
info loading api data...
info creating queue...
info run:
AxiosError: read ETIMEDOUT
...
info   [1/27598] canalplus.com (fr) - ad#19 - Feb 24, 2026 (19 programs)
...

@BellezaEmporium
Copy link
Contributor Author

  • epgshare01.online takes a lot of time currently. Should it take that long?
NODE_OPTIONS=--max-old-space-size=6000 npm run grab --- --channels=sites/epgshare01.online/epgshare01.online_RAKUTEN1.channels.xml --output=epgshare_rakuten.xml

> grab
> tsx scripts/commands/epg/grab.ts --channels=sites/epgshare01.online/epgshare01.online_RAKUTEN1.channels.xml --output=epgshare_rakuten.xml

info starting...
info loading channels...
info found 1417 channel(s)
info loading api data...
info creating queue...
info run:
info   [1/2834] epgshare01.online (en) - RAKUTEN1#DE:.21.Jump.Street.be - Feb 24, 2026 (29 programs)
info   [2/2834] epgshare01.online (en) - RAKUTEN1#DE:.21.Jump.Street.be - Feb 25, 2026 (28 programs)
info   [3/2834] epgshare01.online (en) - RAKUTEN1#DE:.Abschnitt.40.be - Feb 24, 2026 (29 programs)
...
...
info   [2831/2834] epgshare01.online (en) - RAKUTEN1#SE:.Baby.Shark.TV.be - Feb 24, 2026 (47 programs)
info   [2832/2834] epgshare01.online (en) - RAKUTEN1#NO:.Rakuten.VIKI.be - Feb 25, 2026 (29 programs)
info   [2833/2834] epgshare01.online (en) - RAKUTEN1#SE:.World.of.Love.Island.be - Feb 25, 2026 (25 programs)
info   [2834/2834] epgshare01.online (en) - RAKUTEN1#NO:.Rakuten.VIKI.be - Feb 24, 2026 (23 programs)
info   saving to "epgshare_rakuten.xml"...
success   done in 00h 07m 31s
  • Also, time zone of RAKUTEN1 seems to be off, ~2 hours early. This might be an issue for few others too. From what i have checked, IN seems to be having correct time zone. Could add a flag for correcting time zones for affected ones.

It's a large database, and needs to unzip the full XML file for all channels, this might explain the large amount of time.

@BellezaEmporium
Copy link
Contributor Author

BellezaEmporium commented Feb 24, 2026

canalplus.com: AxiosError: read ETIMEDOUT

npm run grab --- --site=canalplus.com --proxy=socks://127.0.0.1:1086

> grab
> tsx scripts/commands/epg/grab.ts --site=canalplus.com --proxy=socks://127.0.0.1:1086

info starting...
info loading channels...
info found 13799 channel(s)
info loading api data...
info creating queue...
info run:
AxiosError: read ETIMEDOUT
...
info   [1/27598] canalplus.com (fr) - ad#19 - Feb 24, 2026 (19 programs)
...

Haven't encountered that in my tests, interesting. Most certainly because it tried pinging for the token in all countries ?

@Soprano89
Copy link

works fine with canalplus france , tested in local French server but not working for other country for example mg

@BellezaEmporium
Copy link
Contributor Author

BellezaEmporium commented Feb 25, 2026

works fine with canalplus france , tested in local French server but not working for other country for example mg

From the data I see, cpafr/mg doesn't seem to be properly used. cpmdg however (found in the data mapping) seems to answer something, but it's a blank result. Will need a follow-up.

EDIT : mg_alt should work properly. Please try that one out. It seems that "mg" was kept up for compatibility purposes, but isn't used at all nowadays. cpmdg & mg works fine on my part.
I've added /mg to mg_alt to fix the token grab.

> tsx scripts/commands/epg/grab.ts --channels=sites/canalplus.com/canalplus.com_mg_alt.channels.xml

ℹ starting...                                                                                                   16:36:26
ℹ loading channels...                                                                                           16:36:26
ℹ found 226 channel(s)                                                                                          16:36:26
ℹ loading api data...                                                                                           16:36:26
ℹ creating queue...                                                                                             16:36:27
ℹ run:                                                                                                          16:36:27
ℹ   [1/452] canalplus.com (fr) - mg_alt#160000 - Feb 25, 2026 (40 programs)                                     16:36:34
ℹ   [2/452] canalplus.com (fr) - mg_alt#160000 - Feb 26, 2026 (50 programs)                                     16:36:40
ℹ   [3/452] canalplus.com (fr) - mg_alt#161374 - Feb 26, 2026 (14 programs)                                     16:36:42
ℹ   [4/452] canalplus.com (fr) - mg_alt#161374 - Feb 25, 2026 (13 programs)                                     16:36:44
ℹ   [5/452] canalplus.com (fr) - mg_alt#161152 - Feb 26, 2026 (5 programs)                                      16:36:45
ℹ   [6/452] canalplus.com (fr) - mg_alt#161152 - Feb 25, 2026 (5 programs)                                      16:36:46
ℹ   [7/452] canalplus.com (fr) - mg_alt#161151 - Feb 26, 2026 (5 programs)                                      16:36:47
ℹ   [8/452] canalplus.com (fr) - mg_alt#161151 - Feb 25, 2026 (5 programs)                                      16:36:48
ℹ   [9/452] canalplus.com (fr) - mg_alt#161150 - Feb 26, 2026 (7 programs)                                      16:36:49
ℹ   [10/452] canalplus.com (fr) - mg_alt#161150 - Feb 25, 2026 (5 programs)                                     16:36:49
ℹ   [11/452] canalplus.com (fr) - mg_alt#161149 - Feb 26, 2026 (7 programs)                                     16:36:50
ℹ   [12/452] canalplus.com (fr) - mg_alt#161149 - Feb 25, 2026 (5 programs)                                     16:36:51
ℹ   [13/452] canalplus.com (fr) - mg_alt#161148 - Feb 26, 2026 (7 programs)                                     16:36:52
ℹ   [14/452] canalplus.com (fr) - mg_alt#161148 - Feb 25, 2026 (5 programs)                                     16:36:53
ℹ   [15/452] canalplus.com (fr) - mg_alt#161147 - Feb 26, 2026 (7 programs)                                     16:36:54
ℹ   [16/452] canalplus.com (fr) - mg_alt#161147 - Feb 25, 2026 (5 programs)                                     16:36:55

@MagicOneFr
Copy link

Everything looks good on my side for canalplus (country code rw). Great work!

@Soprano89
Copy link

Soprano89 commented Feb 26, 2026

Hello
Sorry i edited my comment multiple time
yes works fine with mg_alt
Thank you
But why not working anymore if i make two different country in same xml ? like this
CANAL+LIVE 3
CANAL+ SPORT 1 HD

I got this

npx tsx scripts/commands/epg/grab.ts --channels=./sites/canalplus.com/canalplus.com_mg_alt.channels.xml

starting...
config:
output: guide.xml
maxConnections: 1
gzip: false
channels: ./sites/canalplus.com/canalplus.com_mg_alt.channels.xml
loading channels...
found 2 channel(s)
run #1:
[1/4] canalplus.com (fr) - Canalsat CANAL+LIVE 3 - Feb 26, 2026 (8 programs)
[2/4] canalplus.com (fr) - Canalsat CANAL+LIVE 3 - Feb 27, 2026 (7 programs)
[3/4] canalplus.com (fr) - mg_alt#160022 - Feb 27, 2026 (0 programs)
[4/4] canalplus.com (fr) - mg_alt#160022 - Feb 26, 2026 (0 programs)
saving to "guide.xml"...
done in 00h 00m 01s

@MagicOneFr
Copy link

Yes I just realized, like @Soprano89, that mixing several contries in the same channel xml doesn't work anymore. No error but 0 program found for the second one.

@BellezaEmporium
Copy link
Contributor Author

Hello Sorry i edited my comment multiple time yes works fine with mg_alt Thank you But why not working anymore if i make two different country in same xml ? like this CANAL+LIVE 3 CANAL+ SPORT 1 HD

I got this

npx tsx scripts/commands/epg/grab.ts --channels=./sites/canalplus.com/canalplus.com_mg_alt.channels.xml

starting... config: output: guide.xml maxConnections: 1 gzip: false channels: ./sites/canalplus.com/canalplus.com_mg_alt.channels.xml loading channels... found 2 channel(s) run #1: [1/4] canalplus.com (fr) - Canalsat CANAL+LIVE 3 - Feb 26, 2026 (8 programs) [2/4] canalplus.com (fr) - Canalsat CANAL+LIVE 3 - Feb 27, 2026 (7 programs) [3/4] canalplus.com (fr) - mg_alt#160022 - Feb 27, 2026 (0 programs) [4/4] canalplus.com (fr) - mg_alt#160022 - Feb 26, 2026 (0 programs) saving to "guide.xml"... done in 00h 00m 01s

Sounds like it keeps the same token, even when the country changes. I would need to check each time if the country is respected before switching, then.

@MagicOneFr
Copy link

MagicOneFr commented Mar 1, 2026

It doesn't work for me. The grab fails for all the fr channels and it almost works for the rw channels.
I got:

grab
tsx scripts/commands/epg/grab.ts --channels=custom/custom.channels.xml --days=4 --timeout=2000 --output=guides/fr/canalplus.com.xml

info starting...
info loading channels...
info found 229 channel(s)
info loading api data...
info creating queue...
info run:
info [1/916] canalplus.com (fr) - canalplus.fr - Mar 1, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')
info [2/916] canalplus.com (fr) - canalplus.fr - Mar 2, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')
...
info [432/916] canalplus.com (fr) - |FR| EUROSPORT 360 18 HD - Mar 4, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')
info [433/916] canalplus.com (fr) - |FR| EUROSPORT 360 18 HD - Mar 3, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')
info [434/916] canalplus.com (fr) - canalplussport3.af - Mar 1, 2026 (25 programs)
info [435/916] canalplus.com (fr) - canalplusellesouest.af - Mar 3, 2026 (0 programs)
info [436/916] canalplus.com (fr) - canalplusellesouest.af - Mar 2, 2026 (0 programs)
info [437/916] canalplus.com (fr) - canalplusellesouest.af - Mar 1, 2026 (0 programs)
info [438/916] canalplus.com (fr) - canalplussport2.af - Mar 1, 2026 (23 programs)
info [439/916] canalplus.com (fr) - canalpluscinemaouest.af - Mar 4, 2026 (14 programs)

My custom xml begins with fr channels and then rw channels:

<channels> <channel site="canalplus.com" lang="fr" xmltv_id="canalplus.fr" site_id="#301">CANAL+</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplusboxoffice.fr" site_id="#1074">CANAL+BOX OFFICE</channel>
...
<channel site="canalplus.com" lang="fr" xmltv_id="cpluslive19.fr" site_id="#1153" logo="https://thumb.canalplus.pro/http/unsafe/204x152/filters:quality(80)/canalplus-cdn.canal-plus.io/p1/channel/1153/canal-ouah/CHN43FN/CHN43FN_1153_20240910-GuM-">CANAL+LIVE 19</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplussport1.af" site_id="rw#180625">CANAL+ SPORT 1</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplussport2.af" site_id="rw#180124">CANAL+ SPORT 2</channel>

@eldepor
Copy link

eldepor commented Mar 7, 2026

It doesn't work for me. The grab fails for all the fr channels and it almost works for the rw channels. I got:

grab
tsx scripts/commands/epg/grab.ts --channels=custom/custom.channels.xml --days=4 --timeout=2000 --output=guides/fr/canalplus.com.xml

info starting... info loading channels... info found 229 channel(s) info loading api data... info creating queue... info run: info [1/916] canalplus.com (fr) - canalplus.fr - Mar 1, 2026 (0 programs) info ERR: Cannot read properties of undefined (reading 'token') info [2/916] canalplus.com (fr) - canalplus.fr - Mar 2, 2026 (0 programs) info ERR: Cannot read properties of undefined (reading 'token') ... info [432/916] canalplus.com (fr) - |FR| EUROSPORT 360 18 HD - Mar 4, 2026 (0 programs) info ERR: Cannot read properties of undefined (reading 'token') info [433/916] canalplus.com (fr) - |FR| EUROSPORT 360 18 HD - Mar 3, 2026 (0 programs) info ERR: Cannot read properties of undefined (reading 'token') info [434/916] canalplus.com (fr) - canalplussport3.af - Mar 1, 2026 (25 programs) info [435/916] canalplus.com (fr) - canalplusellesouest.af - Mar 3, 2026 (0 programs) info [436/916] canalplus.com (fr) - canalplusellesouest.af - Mar 2, 2026 (0 programs) info [437/916] canalplus.com (fr) - canalplusellesouest.af - Mar 1, 2026 (0 programs) info [438/916] canalplus.com (fr) - canalplussport2.af - Mar 1, 2026 (23 programs) info [439/916] canalplus.com (fr) - canalpluscinemaouest.af - Mar 4, 2026 (14 programs)

My custom xml begins with fr channels and then rw channels:

<channels> <channel site="canalplus.com" lang="fr" xmltv_id="canalplus.fr" site_id="#301">CANAL+</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplusboxoffice.fr" site_id="#1074">CANAL+BOX OFFICE</channel> ... <channel site="canalplus.com" lang="fr" xmltv_id="cpluslive19.fr" site_id="#1153" logo="https://thumb.canalplus.pro/http/unsafe/204x152/filters:quality(80)/canalplus-cdn.canal-plus.io/p1/channel/1153/canal-ouah/CHN43FN/CHN43FN_1153_20240910-GuM-">CANAL+LIVE 19</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplussport1.af" site_id="rw#180625">CANAL+ SPORT 1</channel> <channel site="canalplus.com" lang="fr" xmltv_id="canalplussport2.af" site_id="rw#180124">CANAL+ SPORT 2</channel>

having exactly same issue, with poland channels

@MagicOneFr
Copy link

No change on my side : I still have the same error on fr channels.

info [1/916] canalplus.com (fr) - canalplus.fr - Mar 8, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')

@BellezaEmporium
Copy link
Contributor Author

No change on my side : I still have the same error on fr channels.

info [1/916] canalplus.com (fr) - canalplus.fr - Mar 8, 2026 (0 programs)
info ERR: Cannot read properties of undefined (reading 'token')

Then I don't know, everything works on my side...

}).then(r => r.data).catch(console.error)

canalToken = { country: country, token: tokenData.token }
return tokenData.token

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why don't you simply return { country: country, token: tokenData.token } ?
It's working better for me.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would mean doing getToken all the time, it's to prevent spamming requests, hence why i'm doing this. Maybe the mistake I've made is above, not properly checking canalToken.

Copy link

@MagicOneFr MagicOneFr Mar 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In my test, I've removed this line, relying on the line 82 to fill canalToken.

@BellezaEmporium BellezaEmporium changed the title 12/2025 Part 2 : Fixes 12/2025 Part 2 | Fixes & Updates Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

winplay.co Error 401 canalplus.com : token request failed: 403 Sky Sport Canal+ Live channels [tv.sfr.fr] Some channels return errors

6 participants