stream.ts 21 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. export interface StreamService {
  2. name: string,
  3. rules: string[],
  4. ip?: {
  5. v4: string[],
  6. v6: string[]
  7. }
  8. }
  9. const $4GTV: StreamService = {
  10. name: '4gtv',
  11. rules: [
  12. 'DOMAIN-SUFFIX,4gtv.tv',
  13. 'DOMAIN,4gtvfreepcvod-cds.cdn.hinet.net'
  14. ]
  15. };
  16. const ALL4: StreamService = {
  17. name: 'All4',
  18. rules: [
  19. 'DOMAIN-SUFFIX,c4assets.com',
  20. 'DOMAIN-SUFFIX,channel4.com',
  21. 'USER-AGENT,All4*'
  22. ]
  23. };
  24. const AMAZON_PRIME_VIDEO: StreamService = {
  25. name: 'Amazon Prime Video',
  26. rules: [
  27. 'DOMAIN,avodmp4s3ww-a.akamaihd.net',
  28. 'DOMAIN,d1v5ir2lpwr8os.cloudfront.net',
  29. 'DOMAIN,d22qjgkvxw22r6.cloudfront.net',
  30. 'DOMAIN,d25xi40x97liuc.cloudfront.net',
  31. 'DOMAIN,dmqdd6hw24ucf.cloudfront.net',
  32. 'DOMAIN,d27xxe7juh1us6.cloudfront.net',
  33. 'DOMAIN,d184dfn36gombl.cloudfront.net',
  34. 'DOMAIN,d1xfray82862hr.cloudfront.net',
  35. 'DOMAIN,d3196yreox78o9.cloudfront.net',
  36. 'DOMAIN-KEYWORD,avoddashs',
  37. 'DOMAIN-SUFFIX,aiv-cdn.net',
  38. 'DOMAIN-SUFFIX,aiv-delivery.net',
  39. 'DOMAIN-SUFFIX,amazonvideo.com',
  40. 'DOMAIN-SUFFIX,amazonvideo.cc',
  41. 'DOMAIN-SUFFIX,media-amazon.com',
  42. 'DOMAIN-SUFFIX,primevideo.com',
  43. 'DOMAIN-SUFFIX,prime-video.com',
  44. 'DOMAIN-SUFFIX,primevideo.cc',
  45. 'DOMAIN-SUFFIX,primevideo.info',
  46. 'DOMAIN-SUFFIX,primevideo.org',
  47. 'DOMAIN-SUFFIX,primevideo.tv',
  48. 'DOMAIN-SUFFIX,amazonvideodirect.cc',
  49. 'DOMAIN-SUFFIX,amazonprimevideos.com',
  50. 'DOMAIN-SUFFIX,atv-ps.amazon.com',
  51. 'DOMAIN-SUFFIX,avodmp4s3ww-a.akamaihd.net',
  52. 'DOMAIN-SUFFIX,fls-na.amazon.com',
  53. 'USER-AGENT,InstantVideo.US*',
  54. 'USER-AGENT,Prime Video*',
  55. 'PROCESS-NAME,com.amazon.avod.thirdpartyclient'
  56. ]
  57. };
  58. const ABEMA_TV: StreamService = {
  59. name: 'AbemaTV',
  60. rules: [
  61. // Pure Front-End detection https://ds-linear-abematv.akamaized.net/region check HTTP 200
  62. 'DOMAIN,ds-linear-abematv.akamaized.net',
  63. 'DOMAIN-SUFFIX,abema.io',
  64. 'DOMAIN-SUFFIX,abema.tv',
  65. 'DOMAIN-SUFFIX,ameba.jp',
  66. 'DOMAIN-SUFFIX,abema-tv.com',
  67. 'DOMAIN-SUFFIX,hayabusa.dev',
  68. 'DOMAIN-SUFFIX,hayabusa.io',
  69. 'DOMAIN-SUFFIX,hayabusa.media',
  70. 'DOMAIN-SUFFIX,amebame.com',
  71. 'DOMAIN-SUFFIX,amebaownd.com',
  72. 'DOMAIN-SUFFIX,amebaowndme.com',
  73. 'DOMAIN-SUFFIX,ameblo.jp',
  74. 'DOMAIN-SUFFIX,dokusho-ojikan.jp',
  75. 'DOMAIN-SUFFIX,winticket.jp',
  76. 'USER-AGENT,AbemaTV*'
  77. ]
  78. };
  79. const APPLE_TV: StreamService = {
  80. name: 'Apple TV',
  81. rules: [
  82. 'DOMAIN,ocvideo.apple.com',
  83. 'DOMAIN,linear.tv.apple.com',
  84. 'DOMAIN,play-edge.itunes.apple.com',
  85. 'DOMAIN,np-edge.itunes.apple.com',
  86. 'DOMAIN,uts-api.itunes.apple.com',
  87. 'DOMAIN,hls-amt.itunes.apple.com',
  88. 'DOMAIN,hls.itunes.apple.com',
  89. 'USER-AGENT,AppleTV*',
  90. 'USER-AGENT,com.apple.tv*',
  91. 'PROCESS-NAME,tv'
  92. ]
  93. };
  94. const APPLE_MUSIC_TV: StreamService = {
  95. name: 'Apple Music TV',
  96. rules: [
  97. 'DOMAIN-SUFFIX,applemusic.com',
  98. 'PROCESS-NAME,music'
  99. ]
  100. };
  101. const BAHAMUT: StreamService = {
  102. name: 'Bahamut',
  103. rules: [
  104. // 'DOMAIN,bahamut.akamaized.net', // Akamai based CDN, no geoblock at all
  105. 'DOMAIN,gamer-cds.cdn.hinet.net',
  106. 'DOMAIN,gamer2-cds.cdn.hinet.net',
  107. 'DOMAIN-SUFFIX,viblast.com',
  108. 'DOMAIN-SUFFIX,bahamut.com.tw',
  109. 'DOMAIN-SUFFIX,ani.gamer.com.tw',
  110. 'DOMAIN-SUFFIX,api.gamer.com.tw',
  111. 'USER-AGENT,Anime*'
  112. ]
  113. };
  114. const BBC: StreamService = {
  115. name: 'BBC',
  116. rules: [
  117. 'DOMAIN-SUFFIX,tvlicensing.co.uk',
  118. 'DOMAIN-KEYWORD,bbcfmt',
  119. 'DOMAIN-KEYWORD,uk-live',
  120. 'DOMAIN,bbc.mp-pxcdn.com', // CloudFront country blocking https://t.me/SURGEPRO/2669346
  121. 'DOMAIN-SUFFIX,bbc.co.uk',
  122. 'DOMAIN-SUFFIX,bbci.co.uk',
  123. 'USER-AGENT,BBCiPlayer*'
  124. ]
  125. };
  126. const BILIBILI_INTL: StreamService = {
  127. name: 'Bilibili International',
  128. rules: [
  129. 'DOMAIN-SUFFIX,biliintl.com',
  130. 'DOMAIN,apm-misaka.biliapi.net',
  131. 'DOMAIN,upos-bstar-mirrorakam.akamaized.net',
  132. 'DOMAIN,upos-bstar1-mirrorakam.akamaized.net', // geoblocking
  133. // upos-sz-mirroralibstar1.bilivideo.com, from domain bilivideo.com and without geoblocking
  134. 'DOMAIN-SUFFIX,bilibili.tv',
  135. 'PROCESS-NAME,com.bstar.intl'
  136. ]
  137. };
  138. export const CRACKLE = {
  139. name: 'Crackle',
  140. rules: [
  141. // 'DOMAIN,www.crackle.com', Hosted on S3, solely based on API to detect region
  142. 'DOMAIN,prod-api.crackle.com'
  143. ]
  144. };
  145. const DAZN: StreamService = {
  146. name: 'DAZN',
  147. rules: [
  148. 'DOMAIN,d151l6v8er5bdm.cloudfront.net',
  149. 'DOMAIN,d1sgwhnao7452x.cloudfront.net',
  150. 'DOMAIN-KEYWORD,voddazn',
  151. 'DOMAIN-SUFFIX,dazn-api.com',
  152. 'DOMAIN-SUFFIX,dazn.com',
  153. 'DOMAIN-SUFFIX,dazndn.com',
  154. 'DOMAIN-SUFFIX,indazn.com',
  155. 'DOMAIN-SUFFIX,indaznlab.com',
  156. 'DOMAIN-SUFFIX,dca-ll-livedazn-dznlivejp.s.llnwi.net',
  157. 'DOMAIN-SUFFIX,dcalivedazn.akamaized.net',
  158. 'DOMAIN-SUFFIX,dcblivedazn.akamaized.net',
  159. 'USER-AGENT,DAZN*'
  160. ]
  161. };
  162. const DEEZER: StreamService = {
  163. name: 'Deezer',
  164. rules: [
  165. 'DOMAIN-SUFFIX,deezer.com',
  166. 'DOMAIN-SUFFIX,dzcdn.net',
  167. 'USER-AGENT,Deezer*'
  168. ]
  169. };
  170. const DISNEY_PLUS: StreamService = {
  171. name: 'Disney+',
  172. rules: [
  173. 'DOMAIN,cdn.registerdisney.go.com',
  174. 'DOMAIN-SUFFIX,bamgrid.com',
  175. 'DOMAIN-SUFFIX,disney-plus.net',
  176. 'DOMAIN-SUFFIX,disneyplus.com',
  177. 'DOMAIN-SUFFIX,dssott.com',
  178. 'DOMAIN-SUFFIX,disneystreaming.com',
  179. 'USER-AGENT,Disney+*'
  180. ]
  181. };
  182. const DISCOVERY_PLUS: StreamService = {
  183. name: 'Discovery+',
  184. rules: [
  185. 'USER-AGENT,DPlus*',
  186. 'USER-AGENT,discovery+*',
  187. 'DOMAIN-SUFFIX,disco-api.com',
  188. 'DOMAIN-SUFFIX,discoveryplus.co.uk',
  189. 'DOMAIN-SUFFIX,discoveryplus.com',
  190. 'DOMAIN-SUFFIX,discoveryplus.in',
  191. 'DOMAIN-SUFFIX,dnitv.com'
  192. ]
  193. };
  194. const DMM: StreamService = {
  195. name: 'DMM',
  196. rules: [
  197. 'DOMAIN-SUFFIX,dmm.co.jp',
  198. 'DOMAIN-SUFFIX,dmm.com',
  199. 'DOMAIN-SUFFIX,dmm-extension.com'
  200. ]
  201. };
  202. const ENCORE_TVB: StreamService = {
  203. name: 'encoreTVB',
  204. rules: [
  205. 'DOMAIN,bcbolt446c5271-a.akamaihd.net',
  206. 'DOMAIN,edge.api.brightcove.com',
  207. 'DOMAIN-SUFFIX,encoretvb.com',
  208. 'USER-AGENT,encoreTVB*',
  209. 'USER-AGENT,TVer-Release*'
  210. ]
  211. };
  212. const ENCORE_TVB_JP_TVER: StreamService = {
  213. name: 'encoreTVB JP',
  214. rules: [
  215. 'DOMAIN-SUFFIX,tver.jp'
  216. ]
  217. };
  218. const FOX_NOW: StreamService = {
  219. name: 'Fox Now',
  220. rules: [
  221. 'DOMAIN-SUFFIX,fox.com',
  222. 'DOMAIN-SUFFIX,foxdcg.com',
  223. 'DOMAIN-SUFFIX,uplynk.com',
  224. 'USER-AGENT,FOX NOW*'
  225. ]
  226. };
  227. const FOX_PLUS: StreamService = {
  228. name: 'Fox+',
  229. rules: [
  230. 'DOMAIN,dashasiafox.akamaized.net',
  231. 'DOMAIN,staticasiafox.akamaized.net',
  232. 'DOMAIN-SUFFIX,foxplus.com',
  233. 'DOMAIN-SUFFIX,theplatform.com',
  234. 'USER-AGENT,FOXPlus*'
  235. ]
  236. };
  237. const HBO: StreamService = {
  238. name: 'HBO Go / HBO Now / HBO Max / Max',
  239. rules: [
  240. 'DOMAIN-SUFFIX,hbo.com',
  241. 'DOMAIN-SUFFIX,hbogo.com',
  242. 'DOMAIN-SUFFIX,hbonow.com',
  243. 'USER-AGENT,HBO NOW*',
  244. 'USER-AGENT,HBOMAX*',
  245. 'DOMAIN-SUFFIX,hbomax.com',
  246. 'DOMAIN-SUFFIX,hbomaxcdn.com',
  247. // 'PROCESS-NAME,com.wbd.stream',
  248. 'DOMAIN-SUFFIX,max.com',
  249. 'DOMAIN-SUFFIX,discomax.com'
  250. ]
  251. };
  252. const HBO_ASIA: StreamService = {
  253. name: 'HBO Asia',
  254. rules: [
  255. 'DOMAIN-SUFFIX,hboasia.com',
  256. 'DOMAIN-SUFFIX,hbogoasia.com',
  257. 'DOMAIN-SUFFIX,hbogoasia.hk',
  258. 'DOMAIN-SUFFIX,hbogoasia.id',
  259. 'DOMAIN-SUFFIX,hbogoasia.sg',
  260. 'DOMAIN-SUFFIX,hbogoasia.tw',
  261. 'DOMAIN-SUFFIX,hbogoasia.ph',
  262. 'DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com',
  263. // 'DOMAIN,bcbolthboa-a.akamaihd.net',
  264. // 'DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net',
  265. // 'DOMAIN,dai3fd1oh325y.cloudfront.net',
  266. // 'DOMAIN,hboasia1-i.akamaihd.net',
  267. // 'DOMAIN,hboasia2-i.akamaihd.net',
  268. // 'DOMAIN,hboasia3-i.akamaihd.net',
  269. // 'DOMAIN,hboasia4-i.akamaihd.net',
  270. // 'DOMAIN,hboasia5-i.akamaihd.net',
  271. // 'DOMAIN,hbogoprod-vod.akamaized.net',
  272. 'DOMAIN,manifest.prod.boltdns.net',
  273. 'DOMAIN,players.brightcove.net',
  274. // 'DOMAIN,hboasialive.akamaized.net',
  275. 'DOMAIN,hbounify-prod.evergent.com',
  276. 'DOMAIN,hbolb.onwardsmg.com'
  277. // 'USER-AGENT,HBO GO PROD HKG*',
  278. // 'USER-AGENT,HBO*'
  279. ]
  280. };
  281. const HIMALAYA_FM: StreamService = {
  282. name: 'Himalaya FM',
  283. rules: [
  284. 'USER-AGENT,Himalaya*',
  285. 'DOMAIN-SUFFIX,himalaya.com'
  286. ]
  287. };
  288. const HULU: StreamService = {
  289. name: 'Hulu',
  290. rules: [
  291. 'DOMAIN-SUFFIX,hulu.com',
  292. 'DOMAIN-SUFFIX,hulu.tv',
  293. 'DOMAIN-SUFFIX,hulu.us',
  294. 'DOMAIN-SUFFIX,huluim.com',
  295. 'DOMAIN-SUFFIX,hulustream.com',
  296. 'USER-AGENT,Hulu*',
  297. 'PROCESS-NAME,com.hulu.plus'
  298. ]
  299. };
  300. const HULU_JP: StreamService = {
  301. name: 'Hulu Japan',
  302. rules: [
  303. 'DOMAIN-SUFFIX,happyon.jp',
  304. 'DOMAIN-SUFFIX,hjholdings.jp',
  305. 'DOMAIN-SUFFIX,hulu.jp'
  306. ]
  307. };
  308. const HWTV: StreamService = {
  309. name: 'HWTV',
  310. rules: [
  311. 'USER-AGENT,HWTVMobile*',
  312. 'DOMAIN-SUFFIX,5itv.tv',
  313. 'DOMAIN-SUFFIX,ocnttv.com'
  314. ]
  315. };
  316. const ITV: StreamService = {
  317. name: 'ITV',
  318. rules: [
  319. 'DOMAIN,itvpnpmobile-a.akamaihd.net',
  320. 'DOMAIN-SUFFIX,itv.com',
  321. 'USER-AGENT,ITV_Player*'
  322. ]
  323. };
  324. const IQIYI_GLOBAL: StreamService = {
  325. name: 'iQiYi Global',
  326. rules: [
  327. 'DOMAIN-SUFFIX,iq.com',
  328. 'DOMAIN,cache.video.iqiyi.com',
  329. 'DOMAIN,cache-video.iq.com',
  330. 'DOMAIN,akmcdnoversea-tw.inter.ptqy.gitv.tv',
  331. 'DOMAIN,chuangcachecdnoversea-tw.inter.ptqy.gitv.tv',
  332. // 'DOMAIN-SUFFIX,inter.iqiyi.com', // matching domestic CDN lvbaiducdncmn.inter.iqiyi.com, baiducdnct.inter.iqiyi.com, etc.
  333. 'DOMAIN-SUFFIX,intl-rcd.iqiyi.com',
  334. 'DOMAIN-SUFFIX,intl-subscription.iqiyi.com',
  335. 'DOMAIN-SUFFIX,intl.iqiyi.com'
  336. ]
  337. };
  338. const JOOX: StreamService = {
  339. name: 'JOOX',
  340. rules: [
  341. 'DOMAIN-SUFFIX,joox.com',
  342. 'DOMAIN-KEYWORD,jooxweb-api',
  343. 'USER-AGENT,JOOX*',
  344. 'USER-AGENT,WeMusic*',
  345. 'PROCESS-NAME,com.tencent.ibg.joox'
  346. ]
  347. };
  348. const KKBOX: StreamService = {
  349. name: 'KKBOX',
  350. rules: [
  351. 'DOMAIN-SUFFIX,kfs.io',
  352. 'DOMAIN-SUFFIX,kkbox.com',
  353. 'DOMAIN-SUFFIX,kkbox.com.tw',
  354. 'DOMAIN-SUFFIX,kkbox-prime.com',
  355. 'DOMAIN-SUFFIX,kktix.com'
  356. ]
  357. };
  358. const KKTV: StreamService = {
  359. name: 'KKTV',
  360. rules: [
  361. 'DOMAIN-SUFFIX,kk.stream',
  362. 'DOMAIN-SUFFIX,kktv.com.tw',
  363. 'DOMAIN-SUFFIX,kktv.me',
  364. 'USER-AGENT,com.kktv.ios.kktv*',
  365. 'USER-AGENT,KKTV*'
  366. ]
  367. };
  368. const LINE_TV: StreamService = {
  369. name: 'Line TV',
  370. rules: [
  371. 'DOMAIN,d3c7rimkq79yfu.cloudfront.net',
  372. 'DOMAIN-SUFFIX,linetv.tw',
  373. 'USER-AGENT,LINE TV*',
  374. 'PROCESS-NAME,com.linecorp.linetv'
  375. ]
  376. };
  377. const LITV: StreamService = {
  378. name: 'LiTV',
  379. rules: [
  380. 'DOMAIN,litvfreemobile-hichannel.cdn.hinet.net',
  381. 'DOMAIN,ntdfreepc-tgc.cdn.hinet.net',
  382. 'DOMAIN,www.litv.tv',
  383. 'DOMAIN,cdi.ofiii.com' // Ofiii Free Movie
  384. ]
  385. };
  386. const MY5: StreamService = {
  387. name: 'My5',
  388. rules: [
  389. 'DOMAIN,d349g9zuie06uo.cloudfront.net',
  390. 'DOMAIN-SUFFIX,channel5.com',
  391. 'DOMAIN-SUFFIX,my5.tv',
  392. 'USER-AGENT,My5*'
  393. ]
  394. };
  395. const MYTV_SUPER: StreamService = {
  396. name: 'myTV Super',
  397. rules: [
  398. 'DOMAIN-SUFFIX,mytvsuper.com',
  399. 'DOMAIN-SUFFIX,tvb.com',
  400. 'DOMAIN-SUFFIX,psg.cdn.hgc.com.hk',
  401. 'USER-AGENT,mytv*',
  402. 'DOMAIN-KEYWORD,nowtv100',
  403. 'DOMAIN-KEYWORD,rthklive'
  404. ]
  405. };
  406. const NAVER_TV: StreamService = {
  407. name: 'Naver TV',
  408. rules: [
  409. 'USER-AGENT,Naver TV*',
  410. 'DOMAIN-SUFFIX,tv.naver.com',
  411. 'DOMAIN-SUFFIX,smartmediarep.com'
  412. ]
  413. };
  414. const NICONICO: StreamService = {
  415. name: 'niconico',
  416. rules: [
  417. 'DOMAIN-SUFFIX,dmc.nico',
  418. 'DOMAIN-SUFFIX,nicovideo.jp',
  419. 'DOMAIN-SUFFIX,asset.domand.nicovideo.jp',
  420. // 'DOMAIN-SUFFIX,nimg.jp',
  421. 'DOMAIN-SUFFIX,socdm.com',
  422. 'USER-AGENT,Niconico*'
  423. ]
  424. };
  425. const NETFLIX: StreamService = {
  426. name: 'Netflix',
  427. ip: {
  428. v4: [
  429. '23.246.18.0/23',
  430. '37.77.184.0/21',
  431. '45.57.0.0/17',
  432. '64.120.128.0/17',
  433. '66.197.128.0/17',
  434. '69.53.224.0/19',
  435. '108.175.32.0/20',
  436. '185.2.220.0/22',
  437. '185.9.188.0/22',
  438. '192.173.64.0/18',
  439. '198.38.96.0/19',
  440. '198.45.48.0/20',
  441. '208.75.76.0/22'
  442. ],
  443. v6: [
  444. '2607:fb10::/32',
  445. '2620:10c:7000::/44',
  446. '2a00:86c0::/32',
  447. '2a03:5640::/32'
  448. ]
  449. },
  450. rules: [
  451. 'DOMAIN-SUFFIX,netflix.ca',
  452. 'DOMAIN-SUFFIX,netflix.com',
  453. 'DOMAIN-SUFFIX,netflix.net',
  454. 'DOMAIN-SUFFIX,nflxext.com',
  455. 'DOMAIN-SUFFIX,nflximg.com',
  456. 'DOMAIN-SUFFIX,nflximg.net',
  457. 'DOMAIN-SUFFIX,nflxso.net',
  458. 'DOMAIN-SUFFIX,nflxvideo.net',
  459. 'DOMAIN-SUFFIX,nflxsearch.net',
  460. 'DOMAIN-SUFFIX,netflix.com.edgesuite.net',
  461. 'DOMAIN-KEYWORD,netflixdnstest',
  462. 'DOMAIN-KEYWORD,dualstack.apiproxy-',
  463. 'DOMAIN-KEYWORD,dualstack.ichnaea-web-',
  464. 'DOMAIN-KEYWORD,apiproxy-device-prod-nlb-',
  465. 'USER-AGENT,Argo*',
  466. 'PROCESS-NAME,com.netflix.mediaclient'
  467. ]
  468. };
  469. const NHK_PLUS: StreamService = {
  470. name: 'NHK Plus',
  471. rules: [
  472. // Pure Front-End detection just like AbemaTV: https://location-plus.nhk.jp/geoip/area.json
  473. 'DOMAIN-SUFFIX,location-plus.nhk.jp'
  474. ]
  475. };
  476. const NOW_E: StreamService = {
  477. name: 'Now E',
  478. rules: [
  479. 'DOMAIN-SUFFIX,nowe.com'
  480. ]
  481. };
  482. const OVERCAST_FM: StreamService = {
  483. name: 'Overcast FM',
  484. rules: [
  485. 'USER-AGENT,Overcast*',
  486. 'DOMAIN-SUFFIX,overcast.fm'
  487. ]
  488. };
  489. const PARAMOUNT: StreamService = {
  490. name: 'Paramount+',
  491. rules: [
  492. 'USER-AGENT,PPlus*',
  493. 'DOMAIN-SUFFIX,pluto.tv', // not paramount+, but does belong to the same company
  494. 'DOMAIN-SUFFIX,cbsi.com',
  495. 'DOMAIN-SUFFIX,cbsaavideo.com',
  496. 'DOMAIN-SUFFIX,cbsivideo.com',
  497. 'DOMAIN-SUFFIX,paramountplus.com',
  498. 'DOMAIN,cbsi.live.ott.irdeto.com',
  499. 'DOMAIN,cbsplaylistserver.aws.syncbak.com',
  500. 'DOMAIN,cbsservice.aws.syncbak.com',
  501. 'DOMAIN,link.theplatform.com'
  502. ]
  503. };
  504. const PBS: StreamService = {
  505. name: 'PBS',
  506. rules: [
  507. 'USER-AGENT,PBS*',
  508. 'DOMAIN-SUFFIX,pbs.org'
  509. ]
  510. };
  511. const PEACOCK: StreamService = {
  512. name: 'Peacock',
  513. rules: [
  514. 'USER-AGENT,PeacockMobile*',
  515. 'DOMAIN-SUFFIX,peacocktv.com'
  516. ]
  517. };
  518. const PANDORA: StreamService = {
  519. name: 'Pandora',
  520. rules: [
  521. 'DOMAIN-SUFFIX,pandora.com',
  522. 'USER-AGENT,Pandora*'
  523. ]
  524. };
  525. const PORNHUB: StreamService = {
  526. name: 'Pornhub',
  527. rules: [
  528. 'DOMAIN-SUFFIX,phprcdn.com',
  529. 'DOMAIN-SUFFIX,pornhub.com',
  530. 'DOMAIN-SUFFIX,pornhubpremium.com'
  531. ]
  532. };
  533. const SOUNDCLOUD: StreamService = {
  534. name: 'SoundCloud',
  535. rules: [
  536. // 'DOMAIN-SUFFIX,sndcdn.com',
  537. 'DOMAIN-SUFFIX,soundcloud.com',
  538. 'USER-AGENT,SoundCloud*'
  539. ]
  540. };
  541. const SPOTIFY: StreamService = {
  542. name: 'Spotify',
  543. ip: {
  544. v4: ['35.186.224.47/32'],
  545. v6: []
  546. },
  547. rules: [
  548. 'DOMAIN-KEYWORD,-spotify-com',
  549. 'DOMAIN-SUFFIX,pscdn.co',
  550. 'DOMAIN-SUFFIX,scdn.co',
  551. 'DOMAIN-SUFFIX,spoti.fi',
  552. 'DOMAIN-SUFFIX,spotify.com',
  553. 'DOMAIN-SUFFIX,byspotify.com',
  554. 'DOMAIN-SUFFIX,spotify-everywhere.com',
  555. 'DOMAIN-SUFFIX,spotify.design',
  556. 'DOMAIN-SUFFIX,spotifycdn.com',
  557. 'DOMAIN-SUFFIX,spotifycdn.net',
  558. 'DOMAIN-SUFFIX,spotifycharts.com',
  559. 'DOMAIN-SUFFIX,spotifycodes.com',
  560. 'DOMAIN-SUFFIX,spotifyforbrands.com',
  561. 'DOMAIN-SUFFIX,spotifyjobs.com',
  562. 'DOMAIN-SUFFIX,spotify-com.akamaized.net',
  563. 'DOMAIN-SUFFIX,spotifynewsroom.jp',
  564. 'DOMAIN-SUFFIX,spotilocal.com',
  565. 'DOMAIN-SUFFIX,tospotify.com',
  566. 'USER-AGENT,*Spotify*'
  567. ]
  568. };
  569. const TVB_ANYWHERE: StreamService = {
  570. name: 'TVB Anywhere',
  571. rules: [
  572. 'DOMAIN-KEYWORD,tvbanywhere'
  573. ]
  574. };
  575. const TAIWAN_GOOD: StreamService = {
  576. name: 'TaiwanGood',
  577. rules: [
  578. 'DOMAIN,hamifans.emome.net',
  579. 'DOMAIN-SUFFIX,skyking.com.tw',
  580. 'USER-AGENT,TaiwanGood*',
  581. 'PROCESS-NAME,com.twgood.android'
  582. ]
  583. };
  584. const TIDAL: StreamService = {
  585. name: 'TIDAL',
  586. rules: [
  587. 'USER-AGENT,TIDAL*',
  588. 'DOMAIN-SUFFIX,tidal.com',
  589. 'DOMAIN-SUFFIX,tidalhifi.com'
  590. ]
  591. };
  592. const TIKTOK: StreamService = {
  593. name: 'TikTok',
  594. rules: [
  595. 'DOMAIN-SUFFIX,byteoversea.com',
  596. 'DOMAIN-SUFFIX,ibytedtos.com',
  597. // 'DOMAIN-SUFFIX,ibyteimg.com', // We confirm that tiktokcdn DOES NOT have ANY geoblock
  598. 'DOMAIN-SUFFIX,ipstatp.com',
  599. 'DOMAIN-SUFFIX,isnssdk.com',
  600. 'DOMAIN-SUFFIX,muscdn.com',
  601. 'DOMAIN-SUFFIX,musical.ly',
  602. 'DOMAIN-SUFFIX,tiktok.com',
  603. 'DOMAIN-SUFFIX,tiktok.us',
  604. 'DOMAIN-SUFFIX,tiktokv.us',
  605. 'DOMAIN-SUFFIX,tik-tokapi.com',
  606. // 'DOMAIN-SUFFIX,tiktokcdn.com', // We confirm that tiktokcdn DOES NOT have ANY geoblock
  607. 'DOMAIN-SUFFIX,tiktokv.com',
  608. 'DOMAIN-SUFFIX,tiktokw.com',
  609. 'DOMAIN-KEYWORD,-tiktokcdn-com',
  610. 'USER-AGENT,TikTok*'
  611. ]
  612. };
  613. const TWITCH: StreamService = {
  614. name: 'Twitch',
  615. rules: [
  616. 'DOMAIN-SUFFIX,jtvnw.net',
  617. 'DOMAIN-SUFFIX,ttvnw.net',
  618. 'DOMAIN-SUFFIX,twitch.tv',
  619. 'DOMAIN-SUFFIX,twitchcdn.net',
  620. 'DOMAIN-SUFFIX,twitchsvc.net',
  621. 'DOMAIN-SUFFIX,ext-twitch.tv',
  622. 'PROCESS-NAME,tv.twitch.android.app'
  623. ]
  624. };
  625. const VIUTV: StreamService = {
  626. name: 'ViuTV',
  627. rules: [
  628. 'DOMAIN,api.viu.now.com',
  629. 'DOMAIN,d1k2us671qcoau.cloudfront.net',
  630. 'DOMAIN,d2anahhhmp1ffz.cloudfront.net',
  631. 'DOMAIN,dfp6rglgjqszk.cloudfront.net',
  632. 'DOMAIN-SUFFIX,viu.com',
  633. 'DOMAIN-SUFFIX,viu.now.com',
  634. 'DOMAIN-SUFFIX,viu.tv',
  635. 'PROCESS-NAME,com.viu.pad',
  636. 'PROCESS-NAME,com.viu.phone',
  637. 'PROCESS-NAME,com.vuclip.viu',
  638. 'PROCESS-NAME,com.hktve.viutv',
  639. 'USER-AGENT,Viu*'
  640. ]
  641. };
  642. const YOUTUBE: StreamService = {
  643. name: 'YouTube',
  644. rules: [
  645. 'DOMAIN,youtubei.googleapis.com',
  646. 'DOMAIN,youtube.googleapis.com',
  647. 'DOMAIN-SUFFIX,googlevideo.com',
  648. 'DOMAIN-SUFFIX,youtube.com',
  649. 'DOMAIN-SUFFIX,withyoutube.com',
  650. 'DOMAIN-SUFFIX,youtubeeducation.com',
  651. 'DOMAIN-SUFFIX,youtubegaming.com',
  652. 'DOMAIN-SUFFIX,youtubekids.com',
  653. 'DOMAIN-SUFFIX,youtube-nocookie.com',
  654. 'USER-AGENT,com.google.ios.youtube*',
  655. 'USER-AGENT,YouTube*'
  656. ]
  657. };
  658. const YOUTUBE_MUSIC: StreamService = {
  659. name: 'YouTube Music',
  660. rules: [
  661. 'USER-AGENT,com.google.ios.youtubemusic*',
  662. 'USER-AGENT,YouTubeMusic*'
  663. ]
  664. };
  665. const SHOWTIME: StreamService = {
  666. name: 'SHOWTIME',
  667. rules: [
  668. 'DOMAIN-SUFFIX,sho.com',
  669. 'DOMAIN-SUFFIX,showtime.com'
  670. ]
  671. };
  672. const WETV: StreamService = {
  673. name: 'WeTV',
  674. ip: {
  675. v4: ['150.109.28.51/32'],
  676. v6: []
  677. },
  678. rules: [
  679. 'USER-AGENT,WeTV*',
  680. 'DOMAIN-SUFFIX,wetv.vip',
  681. 'DOMAIN-SUFFIX,wetvinfo.com'
  682. ]
  683. };
  684. const VUDU: StreamService = {
  685. name: 'Vudu',
  686. rules: [
  687. 'DOMAIN-SUFFIX,vudu.com'
  688. ]
  689. };
  690. const FRIDAY_TW: StreamService = {
  691. name: 'Friday TW',
  692. rules: [
  693. // https://github.com/SukkaW/Surge/pull/74#issuecomment-3188450562
  694. 'DOMAIN,video.friday.tw',
  695. 'DOMAIN,ana.video.friday.tw' // Does't actually a detection, only a log report stuff and not actually being used anywhere
  696. ]
  697. };
  698. const MANGAFOX: StreamService = {
  699. name: 'MangaFox',
  700. rules: [
  701. 'DOMAIN-SUFFIX,mangafox.me',
  702. 'DOMAIN-SUFFIX,fanfox.net'
  703. ]
  704. };
  705. const TUBI_TV: StreamService = {
  706. name: 'Tubi TV',
  707. rules: [
  708. 'DOMAIN,tubi.tv',
  709. 'DOMAIN,www.tubi.tv',
  710. 'DOMAIN,tubitv.com',
  711. 'DOMAIN,www.tubitv.com',
  712. 'DOMAIN-SUFFIX,production-public.tubi.io'
  713. // mcdn.tubi.tv -- no geo block
  714. // canvas-lb.tubitv.com -- image CDN, also no geo blocking
  715. // tubi.video -- streaming CDN, also no geo blocking
  716. ]
  717. };
  718. export const ALL: StreamService[] = [
  719. $4GTV,
  720. ABEMA_TV, AMAZON_PRIME_VIDEO, ALL4, APPLE_TV, APPLE_MUSIC_TV,
  721. BAHAMUT, BBC, BILIBILI_INTL,
  722. CRACKLE,
  723. DAZN, DEEZER, DISNEY_PLUS, DISCOVERY_PLUS, DMM,
  724. ENCORE_TVB,
  725. ENCORE_TVB_JP_TVER,
  726. FRIDAY_TW, FOX_NOW, FOX_PLUS,
  727. HBO, HBO_ASIA, HIMALAYA_FM, HULU, HWTV,
  728. IQIYI_GLOBAL, ITV,
  729. JOOX,
  730. KKBOX,
  731. KKTV,
  732. LINE_TV,
  733. MANGAFOX, MY5, MYTV_SUPER,
  734. NETFLIX, NAVER_TV, NICONICO, NHK_PLUS, NOW_E,
  735. OVERCAST_FM,
  736. PARAMOUNT, PBS, PEACOCK, PANDORA, PORNHUB,
  737. SOUNDCLOUD, SHOWTIME, SPOTIFY,
  738. TAIWAN_GOOD, TIDAL, TIKTOK, TVB_ANYWHERE, TWITCH, TUBI_TV,
  739. VIUTV, VUDU,
  740. WETV,
  741. YOUTUBE, YOUTUBE_MUSIC
  742. ];
  743. export const NORTH_AMERICA: StreamService[] = [
  744. FOX_NOW,
  745. FOX_PLUS,
  746. HULU, // Hulu US
  747. HULU_JP,
  748. VUDU,
  749. // HBO,
  750. // www.nfl.com
  751. // epix.com
  752. // starz.com
  753. // www.philo.com
  754. // https://www.shudder.com/
  755. // https://www.britbox.com
  756. // crackle.com
  757. // www.cwtv.com
  758. // www.aetv.com
  759. // https://www.nba.com/watch/
  760. // fubo.tv
  761. // mola.tv
  762. // https://setantasports.com/
  763. // tubitv.com
  764. // SlingTV
  765. // PlutoTV
  766. // AcornTV
  767. SHOWTIME,
  768. ENCORE_TVB,
  769. // Funimation
  770. DISCOVERY_PLUS,
  771. PARAMOUNT,
  772. PEACOCK,
  773. CRACKLE,
  774. TUBI_TV
  775. // Popcornflix
  776. // Crunchyroll
  777. // ATTNOW
  778. // KBSAmerican
  779. // KOCOWA
  780. // MathsSpot
  781. // CBCGem
  782. // Crave
  783. ];
  784. export const EU: StreamService[] = [
  785. // RakutenTV
  786. // Funimation
  787. // SkyShowTime
  788. // HBO,
  789. // MathSpot
  790. // SkyGo
  791. // BritBox
  792. ITV, // ITVHUB
  793. // BBC Channel 4
  794. // BBC Channel 5
  795. BBC
  796. // Discovery+ UK discoveryplus.co.uk
  797. // Salto
  798. // CanalPlus
  799. // Molotov
  800. // Joyn
  801. // SKY_DE
  802. // ZDF
  803. // NLZIET
  804. // videoland
  805. // NPO_START_PLUS
  806. // HBO_Spain
  807. // Pantaya
  808. // RaiPlay
  809. // MegogoTV
  810. // Amediateka
  811. ];
  812. export const HK: StreamService[] = [
  813. NOW_E,
  814. VIUTV,
  815. MYTV_SUPER,
  816. HBO_ASIA,
  817. BILIBILI_INTL
  818. ];
  819. export const TW: StreamService[] = [
  820. KKTV,
  821. LITV,
  822. // MyVideo
  823. $4GTV,
  824. LINE_TV,
  825. // HamiVideo
  826. // CatchPlay
  827. HBO_ASIA,
  828. BAHAMUT,
  829. // elevensportstw,
  830. FRIDAY_TW,
  831. MANGAFOX
  832. ];
  833. export const JP: StreamService[] = [
  834. DMM,
  835. // DMMTV
  836. ABEMA_TV,
  837. NICONICO,
  838. // music.jp
  839. // Telasa
  840. // Paravi
  841. // unext
  842. HULU_JP,
  843. ENCORE_TVB_JP_TVER,
  844. NHK_PLUS
  845. // GYAO!
  846. // wowow
  847. // VideoMarket
  848. // FOD (Fuji TV)
  849. // Radiko
  850. // Karaoke@DAM
  851. // J:COM
  852. // Kancolle Japan
  853. // Pretty Derby Japan
  854. // Konosuba Fantastic Days
  855. ];
  856. export const AU = [
  857. // Stan
  858. // Binge
  859. // 7plus
  860. // Channel9
  861. // Channel10
  862. // ABCiView
  863. // OptusSports
  864. // SBSonDemand
  865. // NeonTV
  866. // SKyGONZ
  867. // ThreeNow
  868. // MaoriTV
  869. ];
  870. export const KR = [
  871. // WAVEE
  872. // Tving
  873. // CoupangPlay
  874. NAVER_TV
  875. // Afreeca
  876. // KBSDomestic
  877. // KOCOWA
  878. ];
  879. export const SOUTH_EAST_ASIA = [
  880. MANGAFOX
  881. // HBO
  882. // B-Global SouthEastAsia
  883. // MeWatch SG
  884. // AISPlay Thailand
  885. // B-Global Thailand
  886. // B-Global Indonesia
  887. // K_Plus VN
  888. // TV360 VN
  889. // B-Global VN
  890. ];