From 444cd3f7af8a60d44b2d1cdf4e576705041f7150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= <30985701+BellezaEmporium@users.noreply.github.com> Date: Wed, 1 Oct 2025 16:21:14 +0200 Subject: [PATCH 01/51] tr: Remove multiple non-working links --- streams/tr.m3u | 202 ++----------------------------------------------- 1 file changed, 5 insertions(+), 197 deletions(-) diff --git a/streams/tr.m3u b/streams/tr.m3u index f94dce41c3..53a52e2957 100644 --- a/streams/tr.m3u +++ b/streams/tr.m3u @@ -1,63 +1,25 @@ #EXTM3U #EXTINF:-1 tvg-id="4UTV.tr",4U TV (720p) https://hls.4utv.live/hls/stream.m3u8 -#EXTINF:-1 tvg-id="24TV.tr",24 TV (1080p) -http://185.234.111.229:8000/play/a059 #EXTINF:-1 tvg-id="24TV.tr" http-user-agent="Mozilla/5.0 Macintosh; Intel Mac OS X 10_14_5 AppleWebKit/537.36 KHTML, like Gecko Chrome/76.0.3809.25 Safari/537.36",24 TV (1080p) #EXTVLCOPT:http-user-agent=Mozilla/5.0 Macintosh; Intel Mac OS X 10_14_5 AppleWebKit/537.36 KHTML, like Gecko Chrome/76.0.3809.25 Safari/537.36 https://mn-nl.mncdn.com/kanal24/smil:kanal24.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="24TV.tr",24 TV (576p) -http://185.234.111.229:8000/play/a056 -#EXTINF:-1 tvg-id="360.tr",360 (1080p) -http://185.234.111.229:8000/play/a05a -#EXTINF:-1 tvg-id="360.tr",360 (576p) -http://185.234.111.229:8000/play/a057 #EXTINF:-1 tvg-id="360.tr",360 TV (720p) [Not 24/7] https://turkmedya-live.ercdn.net/tv360/tv360.m3u8 -#EXTINF:-1 tvg-id="A2TV.tr",A2TV (1080p) -http://185.234.111.229:8000/play/a01m #EXTINF:-1 tvg-id="A2TV.tr",A2TV https://trkvz-live.daioncdn.net/a2tv/a2tv.m3u8 -#EXTINF:-1 tvg-id="AHaber.tr",A Haber (576p) -http://185.234.111.229:8000/play/a019 -#EXTINF:-1 tvg-id="AHaber.tr",A Haber -https://c.fulltvizle.com/ahaber/index.m3u8 -#EXTINF:-1 tvg-id="AHaber.tr",A Haber -https://canlitvulusal.xyz/live/ahaber/index.m3u8 -#EXTINF:-1 tvg-id="ANews.tr",A News (1080p) -http://185.234.111.229:8000/play/a01k -#EXTINF:-1 tvg-id="APara.tr",A Para (1080p) -http://185.234.111.229:8000/play/a01l -#EXTINF:-1 tvg-id="ASpor.tr",A Spor (720p) -https://tgn.bozztv.com/dvrfl05/gin-aspor/index.m3u8 -#EXTINF:-1 tvg-id="ASpor.tr",A Spor (360p) [Not 24/7] -https://c.fulltvizle.com/aspor/index.m3u8 #EXTINF:-1 tvg-id="ASpor.tr",A Spor https://trkvz-live.daioncdn.net/aspor/aspor.m3u8 #EXTINF:-1 tvg-id="ATurk.tr",A Türk Izmir (360p) https://vdo.digitalbox.xyz:3807/stream/play.m3u8 #EXTINF:-1 tvg-id="AnadoluAgency.tr",AA Live (720p) [Not 24/7] https://mtulqxgomrllive.mediatriple.net/mtulqxgomrllive/broadcast_59f9c0c785b88.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="AdaTV.cy",ADA TV (720p) -https://yayin1.canlitv.day/live/kibrisadatv.stream/playlist.m3u8 #EXTINF:-1 tvg-id="AfroturkTV.tr",Afroturk TV (1080p) https://edge.socialsmart.tv/naturaltv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="AgroTV.tr",Agro TV (1080p) -http://185.234.111.229:8000/play/a011 -#EXTINF:-1 tvg-id="AgroTV.tr",Agro TV (1080p) -https://yayin30.haber100.com/live/agrotv/playlist.m3u8 -#EXTINF:-1 tvg-id="AhiTV.tr",Ahi TV Kirsehir (576p) -http://yayin3.canlitv.com:1935/canlitv/ahitv/playlist.m3u8 -#EXTINF:-1 tvg-id="AkitTV.tr",Akit TV (1080p) -http://185.234.111.229:8000/play/a05m #EXTINF:-1 tvg-id="AkitTV.tr",Akit TV (720p) https://akittv-live.ercdn.net/akittv/akittv.m3u8 #EXTINF:-1 tvg-id="AksuTV.tr",Aksu TV (720p) https://live.artidijitalmedya.com/artidijital_aksutv/aksutv/playlist.m3u8 -#EXTINF:-1 tvg-id="AksuTV.tr",Aksu TV (576p) -http://185.234.111.229:8000/play/a04g -#EXTINF:-1 tvg-id="AlZahraTVTurkic.tr",Al-Zahra TV Turkic (720p) -http://185.234.111.229:8000/play/a00t #EXTINF:-1 tvg-id="AlZahraTVTurkic.tr",Al-Zahra TV Turkic (720p) [Not 24/7] https://live.al-zahratv.com/live/playlist.m3u8 #EXTINF:-1 tvg-id="AlanyaPostaTV.tr",Alanya Posta TV (1080p) @@ -66,24 +28,20 @@ https://api-tv3.yayin.com.tr/postatv/postatv/playlist.m3u8 https://starmenajo.com/hls/almahriah/index.m3u8 #EXTINF:-1 tvg-id="AltasTV.tr",Altas TV (1080p) https://edge1.socialsmart.tv/altastv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="AnadoluDernekTV.tr",Anadolu Dernek TV (576p) -http://185.234.111.229:8000/play/a020 #EXTINF:-1 tvg-id="AnadoluNetTV.tr",Anadolu Net TV (1080p) https://live.artidijitalmedya.com/artidijital_anadolunet/anadolunet/playlist.m3u8 #EXTINF:-1 tvg-id="ArasTV.tr",ARAS TV (576p) [Not 24/7] http://1.rtmp.org/tv217/yayin.stream/playlist.m3u8 -#EXTINF:-1 tvg-id="ATV.tr",ATV (720p) -https://rnttwmjcin.turknet.ercdn.net/lcpmvefbyo/atv/atv.m3u8 +#EXTINF:-1 tvg-id="ATV.tr",ATV (360p) +http://rnttwmjcin.turknet.ercdn.net/lcpmvefbyo/atv/atv_360p.m3u8 #EXTINF:-1 tvg-id="ATV.tr",ATV -http://116.202.238.88/ATV_TR/tracks-v1a1/index.m3u8 +http://89.187.191.41/ATV-HD-TR/video.m3u8 +#EXTINF:-1 tvg-id="ATV.tr",ATV +http://116.202.238.88/ATV_TR/index.m3u8 #EXTINF:-1 tvg-id="ATVAlanya.tr",ATV Alanya (720p) [Not 24/7] http://stream2.taksimbilisim.com:1935/alanyatv/alanyatv.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="ATVAvrupa.tr",ATV Avrupa (576p) -http://185.234.111.229:8000/play/a018 #EXTINF:-1 tvg-id="ATVAvrupa.tr",ATV Avrupa (576p) [Not 24/7] https://streamer2.nexgen.bz/ATV/index.m3u8 -#EXTINF:-1 tvg-id="beINSportsHaber.tr",beIN Sports Haber -https://canlitvulusal3.xyz/live/beinsportshaber/index.m3u8 #EXTINF:-1 tvg-id="BenguturkTV.tr",Benguturk TV (1080p) http://185.234.111.229:8000/play/a05u #EXTINF:-1 tvg-id="BenguturkTV.tr",BENGÜTÜRK TV (720p) [Not 24/7] @@ -95,13 +53,9 @@ http://185.234.111.229:8000/play/a05g #EXTINF:-1 tvg-id="BesiktasWebTV.tr",Beşiktaş Web TV (360p) https://s01.vpis.io/besiktas/besiktas.m3u8 #EXTINF:-1 tvg-id="BeyazTV.tr",Beyaz TV (1080p) -http://185.234.111.229:8000/play/a05h -#EXTINF:-1 tvg-id="BeyazTV.tr",Beyaz TV (1080p) https://beyaztv.daioncdn.net/beyaztv/beyaztv.m3u8?app=fcd5c66b-da9d-44ba-a410-4f34805c397d&ce=3 #EXTINF:-1 tvg-id="BeyazTV.tr",Beyaz TV (720p) [Not 24/7] https://mn-nl.mncdn.com/blutv_beyaztv2/live.m3u8 -#EXTINF:-1 tvg-id="BeykentTV.tr",Beykent TV (720p) -https://yayin30.haber100.com/live/beykenttv/playlist.m3u8 #EXTINF:-1 tvg-id="BirTV.tr",Bir TV (720p) https://live.artidijitalmedya.com/artidijital_birtv/birtv/playlist.m3u8 #EXTINF:-1 tvg-id="BizimevTV.tr",Bizimev TV (720p) @@ -114,8 +68,6 @@ https://tv.ensonhaber.com/bloomberght/bloomberght.m3u8 https://ciner-live.daioncdn.net/bloomberght/bloomberght.m3u8 #EXTINF:-1 tvg-id="BRTV.tr",BRTV (720p) [Geo-blocked] https://live.artidijitalmedya.com/artidijital_brtv/brtv/playlist.m3u8 -#EXTINF:-1 tvg-id="BRTV.tr",BRTV (576p) -http://185.234.111.229:8000/play/a04m #EXTINF:-1 tvg-id="ASTV.tr",Bursa AS TV (900p) https://live.artidijitalmedya.com/artidijital_astv/astv/playlist.m3u8 #EXTINF:-1 tvg-id="ASTV.tr",Bursa AS TV (720p) [Geo-blocked] @@ -136,16 +88,12 @@ https://cdn-cekmekoybeltv.yayin.com.tr/cekmekoybeltv/cekmekoybeltv/playlist.m3u8 https://cdn-cekmekoybeltv.yayin.com.tr/cekmekoybeltv/cekmekoybeltv_1080p/playlist.m3u8 #EXTINF:-1 tvg-id="CGTNDocumentary.tr",CGTN Documentary https://mn-nl.mncdn.com/dogusdyg_drone/cgtn/playlist.m3u8 -#EXTINF:-1 tvg-id="CiftciTV.tr",Ciftci TV (576p) -http://185.234.111.229:8000/play/a04i #EXTINF:-1 tvg-id="CiftciTV.tr",Çiftçi TV (1080p) [Not 24/7] http://stream.taksimbilisim.com:1935/ciftcitv/smil:ciftcitv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="CiftciTV.tr",Çiftçi TV (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_ciftcitv/ciftcitv/playlist.m3u8 #EXTINF:-1 tvg-id="Cine1.tr",Cine 1 (720p) https://live.artidijitalmedya.com/artidijital_cine1/cine1/playlist.m3u8 -#EXTINF:-1 tvg-id="Cine1.tr",Cine 1 (576p) -http://185.234.111.229:8000/play/a04w #EXTINF:-1 tvg-id="Cine5.tr",Cine5 (720p) https://cdn-cine5tv.yayin.com.tr/cine5tv/cine5tv/playlist.m3u8 #EXTINF:-1 tvg-id="CNBCe.tr",CNBC-e @@ -163,43 +111,21 @@ https://live.artidijitalmedya.com/artidijital_dimtv/dimtv/playlist.m3u8 #EXTINF:-1 tvg-id="DisneyJr.tr",Disney Jr. (1080p) [Geo-blocked] https://saran-live.ercdn.net/disneyjunior/index.m3u8 #EXTINF:-1 tvg-id="DiyanetTV.tr",Diyanet TV (1080p) -http://185.234.111.229:8000/play/a05j -#EXTINF:-1 tvg-id="DiyanetTV.tr",Diyanet TV (1080p) https://eustr73.mediatriple.net/videoonlylive/mtikoimxnztxlive/broadcast_5e3bf95a47e07.smil/playlist.m3u8 #EXTINF:-1 tvg-id="DiyarTV.tr",Diyar TV (720p) -http://185.234.111.229:8000/play/a051 -#EXTINF:-1 tvg-id="DiyarTV.tr",Diyar TV (720p) https://live.artidijitalmedya.com/artidijital_diyartv/diyartv/playlist.m3u8 #EXTINF:-1 tvg-id="DiyarTV.tr",Diyar TV (720p) https://yayin30.haber100.com/live/diyartv/playlist.m3u8 #EXTINF:-1 tvg-id="DostTV.tr",Dost TV (576p) https://dost.stream.emsal.im/tv/live.m3u8 -#EXTINF:-1 tvg-id="DreamTurk.tr",Dream Turk (576p) -http://185.234.111.229:8000/play/a01v #EXTINF:-1 tvg-id="DreamTurk.tr",Dream Türk (720p) https://live.duhnet.tv/S2/HLS_LIVE/dreamturknp/playlist.m3u8 #EXTINF:-1 tvg-id="DRTDenizli.tr",DRT Denizli (720p) https://edge1.socialsmart.tv/drttv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="DRTTV.tr",DRT TV (576p) -http://185.234.111.229:8000/play/a06a #EXTINF:-1 tvg-id="EdessaTV.tr",Edessa TV (720p) https://tv.digitalbox.xyz:19360/edessatv/edessatv.m3u8 -#EXTINF:-1 tvg-id="EkinTurk.tr",Ekin Turk (576p) -http://185.234.111.229:8000/play/a025 -#EXTINF:-1 tvg-id="Ekoturk.tr",Ekoturk (1080p) -http://185.234.111.229:8000/play/a00w -#EXTINF:-1 tvg-id="Ekoturk.tr",Ekoturk -https://ekoturk.blutv.com/blutv_ekoturk2/live.m3u8 -#EXTINF:-1 tvg-id="Ekoturk.tr",Ekotürk (720p) -https://mn-nl.mncdn.com/blutv_ekoturk2/live.m3u8 -#EXTINF:-1 tvg-id="ElmasTV.tr",Elmas TV (720p) [Not 24/7] -https://5be5d840359c6.streamlock.net/elmas67tv/elmas67tv/chunklist.m3u8 -#EXTINF:-1 tvg-id="",Em TV (486p) -https://cdn.yayin.com.tr/TVEM/TVEM/playlist.m3u8 #EXTINF:-1 tvg-id="ERTV.tr",Er TV (1080p) [Geo-blocked] https://live.artidijitalmedya.com/artidijital_ertv_new/ertv/playlist.m3u8 -#EXTINF:-1 tvg-id="ErtSahTV.tr",Ert Sah TV (720p) [Not 24/7] -http://win20.yayin.com.tr/ertsahtv/ertsahtv/playlist.m3u8 #EXTINF:-1 tvg-id="ErzurumWebTV.tr",Erzurum Web TV (720p) https://win29.yayin.com.tr/erzurumwebtv/erzurumwebtv/iptvdelisi.m3u8 #EXTINF:-1 tvg-id="ESTV.tr",ES TV (720p) @@ -234,8 +160,6 @@ https://saran-live.ercdn.net/fx/index.m3u8 https://edge1.socialsmart.tv/goncatv/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="GRT.tr",GRT (900p) https://live.artidijitalmedya.com/artidijital_grt/grt1/playlist.m3u8 -#EXTINF:-1 tvg-id="GRT.tr",GRT (576p) -http://185.234.111.229:8000/play/a04f #EXTINF:-1 tvg-id="GuneyTVTarsus.tr",Guney TV Tarsus (720p) https://live.artidijitalmedya.com/artidijital_guneytv/guneytv/playlist.m3u8 #EXTINF:-1 tvg-id="GuneydoguTV.tr",Guneydogu TV (720p) @@ -246,12 +170,8 @@ https://mn-nl.mncdn.com/gzttv/gzttv/playlist.m3u8 https://cdn-haber61tv.yayin.com.tr/haber61tv/smil:haber61tv.smil/index.m3u8 #EXTINF:-1 tvg-id="Haber61TV.tr",Haber61 TV (720p) [Not 24/7] https://win8.yayin.com.tr/haber61tv/smil:haber61tv.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="HaberGlobal.tr",Haber Global (1080p) -http://185.234.111.229:8000/play/a05x #EXTINF:-1 tvg-id="HaberGlobal.tr",Haber Global (720p) [Not 24/7] https://tv.ensonhaber.com/haberglobal/haberglobal.m3u8 -#EXTINF:-1 tvg-id="HaberGlobal.tr",Haber Global (576p) -http://185.234.111.229:8000/play/a05k #EXTINF:-1 tvg-id="HaberGlobal.tr",Haber Global https://haberglobaldvr.blutv.com/blutv_haberglobal_dvr/live.m3u8 #EXTINF:-1 tvg-id="HaberturkTV.tr",Habertürk TV (1080p) @@ -264,16 +184,10 @@ https://tv.ensonhaber.com/haberturk/haberturk.m3u8 https://halktv-live.daioncdn.net/halktv/halktv.m3u8 #EXTINF:-1 tvg-id="HalkTV.tr",Halk TV (720p) https://halktv.blutv.com/blutv_halktv_live/live.m3u8 -#EXTINF:-1 tvg-id="HalkTV.tr",Halk TV (576p) -http://185.234.111.229:8000/play/a07k #EXTINF:-1 tvg-id="HelwaTV.tr",Helwa TV (1080p) https://raw.githubusercontent.com/ipstreet312/freeiptv/master/ressources/dzflix/helwa.m3u8 #EXTINF:-1 tvg-id="HTSporTV.tr",HTSpor TV (1080p) -http://185.234.111.229:8000/play/a016 -#EXTINF:-1 tvg-id="HTSporTV.tr",HTSpor TV (1080p) https://ciner.daioncdn.net/ht-spor/ht-spor.m3u8?app=web -#EXTINF:-1 tvg-id="HTSporTV.tr",HTSpor TV (1080p) -https://ciner.daioncdn.net/ht-spor/ht-spor.m3u8?app=web&dfp_paln=AQzzBGQEBm1BO0E2iVe9tLfcsqJ3gAOMJ63P8Ch&ppid=675956db19f9bb686edda21d15d911e8 #EXTINF:-1 tvg-id="HunatTV.tr",Hunat TV (720p) [Geo-blocked] https://live.artidijitalmedya.com/artidijital_hunattv/hunattv/playlist.m3u8 #EXTINF:-1 tvg-id="HunatTV.tr",Hunat TV (480p) [Not 24/7] @@ -286,10 +200,6 @@ https://npserver1.ibb.gov.tr/webtv/webtv_wowza1/playlist.m3u8 http://stream.taksimbilisim.com:1935/iceltv/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="IcelTV.tr",Icel TV (720p) [Not 24/7] https://edge1.socialsmart.tv/iceltv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="KabloInfo.tr",Kablo Info (1080p) -http://185.234.111.229:8000/play/a01g -#EXTINF:-1 tvg-id="Kanal3.tr",Kanal 3 (1080p) -http://185.234.111.229:8000/play/a013 #EXTINF:-1 tvg-id="Kanal3.tr",Kanal 3 (1080p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal3/kanal3/playlist.m3u8 #EXTINF:-1 tvg-id="Kanal3.tr",Kanal 3 (1080p) [Not 24/7] @@ -306,30 +216,18 @@ https://kanal7.blutv.com/blutv_kanal7_live/live.m3u8 https://livetv.radyotvonline.net/kanal7live/kanal7avr/playlist.m3u8 #EXTINF:-1 tvg-id="Kanal12.tr",Kanal 12 (720p) https://live.artidijitalmedya.com/artidijital_kanal12/kanal12/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal12.tr",Kanal 12 (576p) -http://185.234.111.229:8000/play/a054 #EXTINF:-1 tvg-id="Kanal15.tr",Kanal 15 (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal15/kanal15/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal15.tr",Kanal 15 (576p) -http://185.234.111.229:8000/play/a04t #EXTINF:-1 tvg-id="Kanal23.tr",Kanal 23 (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal23/kanal23/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal23.tr",Kanal 23 (576p) -http://185.234.111.229:8000/play/a04s -#EXTINF:-1 tvg-id="Kanal26.tr",Kanal 26 (1080p) -http://185.234.111.229:8000/play/a04e #EXTINF:-1 tvg-id="Kanal26.tr",Kanal 26 (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal26/kanal26/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal32.tr",Kanal 32 (720p) -http://185.234.111.229:8000/play/a05r #EXTINF:-1 tvg-id="Kanal32.tr",Kanal 32 (720p) [Not 24/7] https://edge1.socialsmart.tv/kanal32/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="Kanal33.tr",Kanal 33 (720p) [Not 24/7] http://stream.taksimbilisim.com:1935/kanal33/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="Kanal33.tr",Kanal 33 (720p) [Not 24/7] https://edge1.socialsmart.tv/kanal33/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal33.tr",Kanal 33 (576p) -http://185.234.111.229:8000/play/a067 #EXTINF:-1 tvg-id="Kanal34.tr",Kanal 34 (720p) https://5be5d840359c6.streamlock.net/kanal34tv/kanal34tv/playlist.m3u8 #EXTINF:-1 tvg-id="Kanal34.tr",Kanal 34 (720p) [Not 24/7] @@ -340,18 +238,12 @@ http://yayin3.canlitv.com:1935/live/kanal38/playlist.m3u8 https://edge1.socialsmart.tv/kanal58/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="",KANAL 58 (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal58/kanal58/playlist.m3u8 -#EXTINF:-1 tvg-id="Kanal58.tr",Kanal 58 (576p) -http://185.234.111.229:8000/play/a053 #EXTINF:-1 tvg-id="Kanal68.tr",Kanal 68 (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanal68/kanal68/playlist.m3u8 #EXTINF:-1 tvg-id="",Kanal Antalya (720p) https://cdn-kanaltvo.yayin.com.tr/kanaltvo/kanaltvo/playlist.m3u8 #EXTINF:-1 tvg-id="KanalAvrupa.tr",Kanal Avrupa (1080p) http://51.15.2.151/hls/kanalavrupa.m3u8 -#EXTINF:-1 tvg-id="KanalAvrupa.tr",Kanal Avrupa (1080p) -http://185.234.111.229:8000/play/a066 -#EXTINF:-1 tvg-id="KanalB.tr",Kanal B (576p) -http://185.234.111.229:8000/play/a01b #EXTINF:-1 tvg-id="KanalB.tr",Kanal B (480p) [Not 24/7] http://212.174.58.161/hls-live/livepkgr/_definst_/liveevent/kanalb.m3u8 #EXTINF:-1 tvg-id="KanalD.tr",Kanal D (1080p) @@ -360,16 +252,12 @@ https://demiroren-live.daioncdn.net/kanald/kanald.m3u8 https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01602-themahqfrance-vivekanald-samsungspain/playlist.m3u8 #EXTINF:-1 tvg-id="KanalFirat.tr",Kanal Firat (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanalfirat/kanalfirat/playlist.m3u8 -#EXTINF:-1 tvg-id="KanalFirat.tr",Kanal Firat (576p) -http://185.234.111.229:8000/play/a04l #EXTINF:-1 tvg-id="KanalHayat.tr",Kanal Hayat (1080p) https://tbn02a.ltnschedule.com/hls/nx21i.m3u8 #EXTINF:-1 tvg-id="KanalS.tr",Kanal S (720p) https://cdn-kanals.yayin.com.tr/kanals/kanals/playlist.m3u8 #EXTINF:-1 tvg-id="KanalUrfa.tr",Kanal Urfa (576p) [Not 24/7] https://edge1.socialsmart.tv/kanalurfa/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="KanalV.tr",Kanal V (720p) -http://185.234.111.229:8000/play/a04b #EXTINF:-1 tvg-id="KanalV.tr",Kanal V (720p) [Not 24/7] http://yerelmedya.tv:1935/kanalv/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="KanalV.tr",Kanal V (720p) [Not 24/7] @@ -388,22 +276,14 @@ https://live.artidijitalmedya.com/artidijital_kentturktv/kentturktv/playlist.m3u https://live.artidijitalmedya.com/artidijital_38kenttv/38kenttv/playlist.m3u8 #EXTINF:-1 tvg-id="KonTV.tr",Kon TV (720p) https://mn-nl.mncdn.com/blutv_kontv2/live.m3u8 -#EXTINF:-1 tvg-id="KonTV.tr",Kon TV (576p) -http://185.234.111.229:8000/play/a05o #EXTINF:-1 tvg-id="KonyaOlayTV.tr",Konya Olay TV (720p) https://live.artidijitalmedya.com/artidijital_konyaolaytv/konyaolaytv/playlist.m3u8 -#EXTINF:-1 tvg-id="KoyTV.tr",Koy TV (720p) -http://185.234.111.229:8000/play/a05v #EXTINF:-1 tvg-id="KralPopTV.tr",KRAL Pop TV (720p) https://dogus-live.daioncdn.net/kralpoptv/playlist.m3u8 #EXTINF:-1 tvg-id="KralTV.tr",KRAL TV (720p) https://dogus-live.daioncdn.net/kraltv/playlist.m3u8 -#EXTINF:-1 tvg-id="KRT.tr",KRT (1080p) -http://185.234.111.229:8000/play/a06f #EXTINF:-1 tvg-id="KRT.tr",KRT (720p) https://krt.blutv.com/blutv_krt_live/live.m3u8 -#EXTINF:-1 tvg-id="KudusTV.tr",Kudus TV (576p) -http://185.234.111.229:8000/play/a065 #EXTINF:-1 tvg-id="KudusTV.tr",Kudüs TV (480p) [Geo-blocked] https://yayin.kudustv.com/981680400/kudustv/playlist.m3u8 #EXTINF:-1 tvg-id="LalegulTV.tr",Lalegul TV (1080p) @@ -416,22 +296,14 @@ http://lalegultv.netmedya.net/lalegul-tv/lalegultv.stream/playlist.m3u8 https://live.artidijitalmedya.com/artidijital_lifetv/lifetv/playlist.m3u8 #EXTINF:-1 tvg-id="LineTV.tr",Line TV (720p) [Not 24/7] https://edge1.socialsmart.tv/linetv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="LuysTV.tr",Luys TV (576p) -http://185.234.111.229:8000/play/a06i -#EXTINF:-1 tvg-id="MalatyaVuslatTV.tr",Malatya Vuslat TV (576p) -http://185.234.111.229:8000/play/a04x #EXTINF:-1 tvg-id="MaviKaradenizTV.tr",MaviKaradeniz (1080p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_mavikaradeniz/mavikaradeniz/playlist.m3u8 -#EXTINF:-1 tvg-id="MaviKaradenizTV.tr",MaviKaradeniz TV (576p) -http://185.234.111.229:8000/play/a04p #EXTINF:-1 tvg-id="MedMuzik.tr",Med Muzik (1080p) http://54.36.110.140/live3/live3.m3u8 #EXTINF:-1 tvg-id="MekameleenTV.tr",Mekameleen TV (1080p) https://mn-nl.mncdn.com/mekameleen/smil:mekameleentv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="MeltemTV.tr",Meltem TV (1080p) https://vhxyrsly.rocketcdn.com/meltemtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MercanTV.tr",Mercan TV (576p) -http://185.234.111.229:8000/play/a04k #EXTINF:-1 tvg-id="MercanTV.tr",Mercan TV (576p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_mercantv/mercantv/playlist.m3u8 #EXTINF:-1 tvg-id="MilyonTV.tr",Milyon TV (720p) @@ -452,10 +324,6 @@ https://edge1.socialsmart.tv/muglaturk/bant1/playlist.m3u8 https://saran-live.ercdn.net/natgeohd/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographicWild.tr",National Geographic Wild (1080p) [Geo-blocked] https://saran-live.ercdn.net/natgeowild/index.m3u8 -#EXTINF:-1 tvg-id="NationalGeographicWild.tr",National Geographic Wild (720p) -https://tv.arectv29.sbs/live/natgeowild.m3u8 -#EXTINF:-1 tvg-id="NationalGeographicWild.tr",National Geographic Wild -https://tv.arectv13.sbs/live/natgeowild.m3u8 #EXTINF:-1 tvg-id="NaturalTV.tr",Natural TV (720p) [Not 24/7] http://broadcasttr.com:1935/naturaltv/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="NaturalTV.tr",Natural TV (720p) [Not 24/7] @@ -478,8 +346,6 @@ https://b01c02nl.mediatriple.net/videoonlylive/mtkgeuihrlfwlive/u_stream_5c9e198 https://b01c02nl.mediatriple.net/videoonlylive/mtkgeuihrlfwlive/u_stream_5c9e2aa8acf44_1/playlist.m3u8 #EXTINF:-1 tvg-id="Number1Dance.tr",Number 1 Dance (480p) http://wms.brtk.net:1935/live/brt1/playlist.m3u8 -#EXTINF:-1 tvg-id="Number1Turk.tr",Number 1 Turk (576p) -http://185.234.111.229:8000/play/a068 #EXTINF:-1 tvg-id="Number1Turk.tr",Number 1 Türk (720p) https://mn-nl.mncdn.com/blutv_nr1turk2/live.m3u8 #EXTINF:-1 tvg-id="Number1TV.tr",Number 1 TV (720p) @@ -531,8 +397,6 @@ https://live.artidijitalmedya.com/artidijital_powerturktv/powerturktv/playlist.m https://customer-9vqui33qma2rownb.cloudflarestream.com/7792e558fe54e23bdd4b462ec275cdba/manifest/video.m3u8 #EXTINF:-1 tvg-id="RehberTV.tr",Rehber TV (720p) https://yayin30.haber100.com/live/rehbertv/playlist.m3u8 -#EXTINF:-1 tvg-id="RumeliTV.tr",Rumeli TV (576p) -http://185.234.111.229:8000/play/a023 #EXTINF:-1 tvg-id="SSport.tr",S Sport https://bcovlive-a.akamaihd.net/540fcb034b144b848e7ff887f61a293a/eu-central-1/6415845530001/profile_0/chunklist.m3u8 #EXTINF:-1 tvg-id="SSport.tr",S Sport @@ -552,13 +416,7 @@ http://139.162.182.79/live/test/index.m3u8 #EXTINF:-1 tvg-id="SemerkandTV.tr",Semerkand TV (1080p) [Not 24/7] https://b01c02nl.mediatriple.net/videoonlylive/mtisvwurbfcyslive/broadcast_58d915bd40efc.smil/playlist.m3u8 #EXTINF:-1 tvg-id="ShowMax.tr",Show Max -https://canlitvulusal.xyz/live/showmax/index.m3u8 -#EXTINF:-1 tvg-id="ShowMax.tr",Show Max https://raw.githubusercontent.com/UzunMuhalefet/yayinlar/main/streams/best/showmax.m3u8 -#EXTINF:-1 tvg-id="ShowTurk.tr",Show Turk -https://showturk.blutv.com/blutv_showturk2/live.m3u8 -#EXTINF:-1 tvg-id="ShowTurk.tr",Show Türk (720p) [Not 24/7] -https://mn-nl.mncdn.com/blutv_showturk2/live.m3u8 #EXTINF:-1 tvg-id="ShowTV.tr",Show TV (1080p) https://ciner-live.daioncdn.net/showtv/showtv.m3u8 #EXTINF:-1 tvg-id="SinopYildizTV.tr",Sinop Yildiz TV (360p) @@ -585,20 +443,12 @@ https://live.artidijitalmedya.com/artidijital_tatlisestv/tatlisestv/playlist.m3u https://meclistv-live.ercdn.net/meclistv/meclistv.m3u8 #EXTINF:-1 tvg-id="TekRumeliTV.tr",Tek Rumeli TV (576p) https://edge1.socialsmart.tv/tekrumelitv/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="TekRumeliTV.tr",Tek Rumeli TV -http://185.234.111.229:8000/play/a014 -#EXTINF:-1 tvg-id="Tele1.tr",Tele 1 (1080p) -http://185.234.111.229:8000/play/a01y #EXTINF:-1 tvg-id="Tele1.tr",Tele 1 (1080p) https://tele1-live.ercdn.net/tele1/tele1.m3u8 -#EXTINF:-1 tvg-id="Tele1.tr",Tele 1 (576p) -http://185.234.111.229:8000/play/a01z #EXTINF:-1 tvg-id="TempoTV.tr",Tempo TV (720p) https://live.artidijitalmedya.com/artidijital_tempotv/tempotv/playlist.m3u8 #EXTINF:-1 tvg-id="Teve2.tr",Teve2 (1080p) https://demiroren-live.daioncdn.net/teve2/teve2.m3u8 -#EXTINF:-1 tvg-id="Teve2.tr",Teve2 (576p) -http://185.234.111.229:8000/play/a01s #EXTINF:-1 tvg-id="TGRTBelgesel.tr",TGRT Belgesel TV (576p) https://tv.ensonhaber.com/tv/tr/tgrtbelgesel/index.m3u8 #EXTINF:-1 tvg-id="TGRTBelgesel.tr",TGRT Belgesel TV (576p) [Not 24/7] @@ -657,46 +507,24 @@ https://tv-e-okul02.medya.trt.com.tr/master.m3u8 https://tv-e-okul01.medya.trt.com.tr/master.m3u8 #EXTINF:-1 tvg-id="TRTHaber.tr",TRT Haber (720p) https://tv-trthaber.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTKurdi.tr",TRT Kurdi (1080p) -http://185.234.111.229:8000/play/a00j #EXTINF:-1 tvg-id="TRTKurdi.tr",TRT Kurdî (720p) https://tv-trtkurdi.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTMuzik.tr",TRT Muzik (1080p) -http://185.234.111.229:8000/play/a00i #EXTINF:-1 tvg-id="TRTMuzik.tr",TRT Müzik (720p) https://tv-trtmuzik.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTSpor.tr",TRT Spor (1080p) -http://185.234.111.229:8000/play/a00e #EXTINF:-1 tvg-id="TRTSpor.tr",TRT Spor (1080p) [Geo-blocked] https://tv-trtspor1.medya.trt.com.tr/master.m3u8 #EXTINF:-1 tvg-id="TRTSporYildiz.tr",TRT Spor Yildiz (1080p) [Geo-blocked] https://tv-trtspor2.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTTurk.tr",TRT Turk (1080p) -http://185.234.111.229:8000/play/a00h #EXTINF:-1 tvg-id="TRTTurk.tr@SD",TRT Turk https://viamotionhsi.netplus.ch/live/eds/trtturk/browser-dash/trtturk.mpd #EXTINF:-1 tvg-id="TRTTurk.tr@SD",TRT Turk https://viamotionhsi.netplus.ch/live/eds/trtturk/browser-HLS8/trtturk.m3u8 #EXTINF:-1 tvg-id="TRTTurk.tr",TRT Türk (720p) https://tv-trtturk.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTWorld.tr",TRT World (1080p) -http://92.114.85.72:8000/play/a02v -#EXTINF:-1 tvg-id="TRTWorld.tr",TRT World (1080p) -http://185.234.111.229:8000/play/a00g -#EXTINF:-1 tvg-id="TRTWorld.tr",TRT World (1080p) -http://185.234.111.229:8000/play/a003 #EXTINF:-1 tvg-id="TRTWorld.tr",TRT World (1080p) [Not 24/7] https://tv-trtworld.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTWorld.tr",TRT World (576p) -http://92.114.85.72:8000/play/a0a9 #EXTINF:-1 tvg-id="TurkHaberTV.tr",TürkHaber (720p) https://edge1.socialsmart.tv/turkhaber/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="TurksatSaat.tr",Turksat Saat -http://185.234.111.229:8000/play/a01f -#EXTINF:-1 tvg-id="TurksatTanitim.tr",Turksat Tanitim -http://185.234.111.229:8000/play/a01d -#EXTINF:-1 tvg-id="TurksatTanitim.tr",Turksat Tanitim -http://185.234.111.229:8000/play/a01e #EXTINF:-1 tvg-id="TV1.tr",TV 1 (720p) https://edge1.socialsmart.tv/tv1/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="TV4.tr",TV4 (720p) @@ -707,8 +535,6 @@ https://tv8.daioncdn.net/tv8/tv8.m3u8?app=7ddc255a-ef47-4e81-ab14-c0e5f2949788&c https://tv8-live.daioncdn.net/tv8/tv8.m3u8 #EXTINF:-1 tvg-id="TV85.tr",TV 8.5 (720p) http://bozztv.com/gin-dvrfl05/gin-tv8_5/index.m3u8 -#EXTINF:-1 tvg-id="",TV8 International (1080p) -http://185.234.111.229:8000/play/a01x #EXTINF:-1 tvg-id="24TV.tr",TV 24 (720p) https://turkmedya-live.ercdn.net/tv24/tv24.m3u8 #EXTINF:-1 tvg-id="TV38.tr",TV 38 (360p) [Not 24/7] @@ -735,14 +561,8 @@ https://b01c02nl.mediatriple.net/videoonlylive/mtdxkkitgbrckilive/broadcast_5ee2 https://live.artidijitalmedya.com/artidijital_tva/tva/playlist.m3u8 #EXTINF:-1 tvg-id="TVDen.tr",TV Den (576p) [Not 24/7] http://canli.tvden.com.tr/hls/live.m3u8 -#EXTINF:-1 tvg-id="",TV Em (486p) -https://cdn-tvem.yayin.com.tr/TVEM/TVEM/playlist.m3u8 -#EXTINF:-1 tvg-id="",TV Em (486p) -https://cdn.yayin.com.tr/TVEM/TVEM/chunklist.m3u8 #EXTINF:-1 tvg-id="TVNET.tr",TVnet (720p) https://mn-nl.mncdn.com/tvnet/tvnet/playlist.m3u8 -#EXTINF:-1 tvg-id="TYTTurk.tr",TYT Turk (720p) -https://cdn4.yayin.com.tr/tytturk/index.m3u8 #EXTINF:-1 tvg-id="TYTTurk.tr",TYT Turk https://cdn-tytturk.yayin.com.tr/tytturk/index.m3u8 #EXTINF:-1 tvg-id="UcanKusTV.tr",UçanKuş TV (720p) @@ -762,26 +582,14 @@ https://uskudarunv.mediatriple.net/uskudarunv/uskudar2/playlist.m3u8 #EXTINF:-1 tvg-id="VTV.tr" http-referrer="https://www.vtv.net.tr/",V TV (720p) #EXTVLCOPT:http-referrer=https://www.vtv.net.tr/ https://serdar.tiviplayer.com/player/m3u8/65aae71c9b93f0965aaed3a92660d98b/65aae71c9b93f0965aaed3a92660d98b.m3u8 -#EXTINF:-1 tvg-id="VavTV.tr",Vav TV (1080p) -http://185.234.111.229:8000/play/a01n #EXTINF:-1 tvg-id="VavTV.tr@SD",Vav TV https://playlist.fasttvcdn.com/pl/rfrk9821hdy9dayo8wfyha/kltr-sanat-tv/playlist.m3u8 #EXTINF:-1 tvg-id="ViasatExplore.tr",Viasat Explore https://tv.arectv29.sbs/live/viasathistory.m3u8 #EXTINF:-1 tvg-id="Vizyon58TV.tr",Vizyon 58 TV (720p) [Geo-blocked] https://live.artidijitalmedya.com/artidijital_vizyon58/vizyon58/playlist.m3u8 -#EXTINF:-1 tvg-id="VuslatTV.tr",Vuslat TV (720p) [Not 24/7] -http://yayin3.canlitv.com:1935/live/vuslattv/HasBahCa.m3u8 -#EXTINF:-1 tvg-id="VuslatTV.tr",Vuslat TV (720p) [Not 24/7] -http://yayin3.canlitv.com:1935/live/vuslattv/playlist.m3u8 -#EXTINF:-1 tvg-id="VuslatTV.tr",Vuslat TV (720p) [Not 24/7] -https://59cba4d34b678.streamlock.net/live/vuslattv/playlist.m3u8 -#EXTINF:-1 tvg-id="VuslatTV.tr",Vuslat TV (720p) [Not 24/7] -https://live.artidijitalmedya.com/artidijital_vuslattv/vuslattv/playlist.m3u8 #EXTINF:-1 tvg-id="WomanTV.tr",Woman TV (1080p) https://embedlp.becdn.net/womantv.m3u8 -#EXTINF:-1 tvg-id="YildizTVEn.tr",Yildiz TV En -https://cdn-yildiz.yayin.com.tr/yildiz/yildiz/playlist.m3u8 #EXTINF:-1 tvg-id="YOLTV.de",Yol TV (720p) https://stream.yol.tv:9443/medialive/yol.m3u8 #EXTINF:-1 tvg-id="ZarokTV.tr",Zarok TV (720p) From 50a3eb1066a9ec04ec09ff532a99a57ade68d580 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Wed, 1 Oct 2025 19:27:57 +0200 Subject: [PATCH 02/51] Update ye.m3u --- streams/ye.m3u | 2 ++ 1 file changed, 2 insertions(+) diff --git a/streams/ye.m3u b/streams/ye.m3u index b9db5c9aa3..3246d119f7 100644 --- a/streams/ye.m3u +++ b/streams/ye.m3u @@ -5,6 +5,8 @@ https://live.cdnbridge.tv/Almasirah/Almasirah_all/playlist.m3u8 https://live2.cdnbridge.tv/AlmasirahMubasher/Mubasher_All/playlist.m3u8 #EXTINF:-1 tvg-id="AlSahatTV.ye@SD",Al-Sahat TV (720p) https://assahat.b-cdn.net/Assahat/assahatobs/index.m3u8 +#EXTINF:-1 tvg-id="BelqeesTV.ye",Belqees TV (576p) +http://213.57.91.138:8000/play/a068 #EXTINF:-1 tvg-id="YemenShababChannel.ye",Yemen Shabab Channel (1080p) https://starmenajo.com/hls/yemenshabab/index.m3u8 #EXTINF:-1 tvg-id="YemenTodayTV.ye",Yemen Today TV (480p) From b532f94882bc243f7a822853e65d504bfab5db72 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Wed, 1 Oct 2025 20:23:57 +0200 Subject: [PATCH 03/51] Update ae.m3u --- streams/ae.m3u | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/streams/ae.m3u b/streams/ae.m3u index e9c928dd3b..e4daa5dfad 100644 --- a/streams/ae.m3u +++ b/streams/ae.m3u @@ -1,14 +1,16 @@ #EXTM3U -#EXTINF:-1 tvg-id="AbuDhabiAloula.ae@SD",Abu Dhabi Aloula (1080p) -https://vo-live-media.cdb.cdn.orange.com/Content/Channel/AbuDhabiChannel/HLS/index.m3u8 #EXTINF:-1 tvg-id="AbuDhabiEmirates.ae@SD",Abu Dhabi Emirates (1080p) https://vo-live-media.cdb.cdn.orange.com/Content/Channel/EmiratesChannel/HLS/index.m3u8 #EXTINF:-1 tvg-id="AbuDhabiSports1.ae",Abu Dhabi Sports 1 (1080p) +http://213.57.91.138:8000/play/a057 +#EXTINF:-1 tvg-id="AbuDhabiSports1.ae",Abu Dhabi Sports 1 (1080p) [Geo-blocked] https://vo-live-media.cdb.cdn.orange.com/Content/Channel/AbuDhabiSportsChannel1/HLS/index.m3u8 #EXTINF:-1 tvg-id="AbuDhabiSports2.ae",Abu Dhabi Sports 2 (1080p) +http://213.57.91.138:8000/play/a058 +#EXTINF:-1 tvg-id="AbuDhabiSports2.ae",Abu Dhabi Sports 2 (1080p) [Geo-blocked] https://vo-live-media.cdb.cdn.orange.com/Content/Channel/AbuDhabiSportsChannel2/HLS/index.m3u8 -#EXTINF:-1 tvg-id="AbuDhabiTV.ae@SD",Abu Dhabi TV -http://dvrfl05.bozztv.com/gin-abudhabitv/index.m3u8 +#EXTINF:-1 tvg-id="AbuDhabiTV.ae@SD",Abu Dhabi TV (1080p) +https://vo-live-media.cdb.cdn.orange.com/Content/Channel/AbuDhabiChannel/HLS/index.m3u8 #EXTINF:-1 tvg-id="AjmanTV.ae",Ajman TV (1080p) https://cdn1.logichost.in/ajmantv/live/playlist.m3u8 #EXTINF:-1 tvg-id="Alarabiya.ae",Al Arabiya (1080p) @@ -39,6 +41,8 @@ https://viamotionhsi.netplus.ch/live/eds/alarabiya/browser-dash/alarabiya.mpd https://viamotionhsi.netplus.ch/live/eds/alarabiya/browser-HLS8/alarabiya.m3u8 #EXTINF:-1 tvg-id="BaynounahTV.ae@SD",Baynounah TV (1080p) https://vo-live-media.cdb.cdn.orange.com/Content/Channel/Baynounah/HLS/index.m3u8 +#EXTINF:-1 tvg-id="ChinaArabTV.ae",China Arab TV (576p) +http://213.57.91.138:8000/play/a061 #EXTINF:-1 tvg-id="CNBCArabiya.ae",CNBC Arabiya (1080p) https://cnbc-live.akamaized.net/cnbc/master.m3u8 #EXTINF:-1 tvg-id="DubaiOne.ae",Dubai One (1080p) @@ -134,4 +138,12 @@ https://shd-gcp-live.edgenextcdn.net/live/bitmovin-wanasah/13e82ea6232fa647c43b2 #EXTINF:-1 tvg-id="WatarRadio.ae",Watar Radio (1080p) https://svs.itworkscdn.net/smcwatarlive/smcwatar/playlist.m3u8 #EXTINF:-1 tvg-id="YasTV.ae@SD",Yas TV (1080p) +http://213.57.91.138:8000/play/a059 +#EXTINF:-1 tvg-id="YasTV.ae@SD",Yas TV (1080p) [Geo-blocked] https://vo-live-media.cdb.cdn.orange.com/Content/Channel/YASSportsChannel/HLS/index.m3u8 +#EXTINF:-1 tvg-id="ZeeAflam.ae",Zee Aflam (576p) +http://213.57.91.138:8000/play/a05s +#EXTINF:-1 tvg-id="ZeeAlwan.ae",Zee Alwan (576p) +http://213.57.91.138:8000/play/a05t +#EXTINF:-1 tvg-id="ZeeAlwan.ae@Egypt",Zee Alwan Egypt (576p) +http://213.57.91.138:8000/play/a05u From e38eb80c93c1008637792abc4602c1ef39ab3c58 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Wed, 1 Oct 2025 21:30:55 +0200 Subject: [PATCH 04/51] Update eg.m3u --- streams/eg.m3u | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/streams/eg.m3u b/streams/eg.m3u index 2cb191f046..2e0ff04e10 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -4,37 +4,37 @@ https://5b622f07944df.streamlock.net/aghapy.tv/aghapy.smil/playlist.m3u8 #EXTINF:-1 tvg-id="AlGhadTV.eg",Al Ghad TV (1080p) https://eazyvwqssi.erbvr.com/alghadtv/alghadtv.m3u8 #EXTINF:-1 tvg-id="AlMasriyah.eg@SD",Al Masriyah -https://fl1002.bozztv.com/ga-almasriya/index.m3u8 -#EXTINF:-1 tvg-id="AlMasriyah.eg@SD",Al Masriyah https://viamotionhsi.netplus.ch/live/eds/almasriyah/browser-HLS8/almasriyah.m3u8 #EXTINF:-1 tvg-id="AlQaheraNews.eg",Al Qahera News (1080p) [Not 24/7] https://bcovlive-a.akamaihd.net/d30cbb3350af4cb7a6e05b9eb1bfd850/eu-west-1/6057955906001/playlist.m3u8 #EXTINF:-1 tvg-id="AlfathSonnahTV.eg",Alfath Sonnah TV (576p) https://alfat7-q.com:5443/LiveApp/streams/986613792230697141226562.m3u8 -#EXTINF:-1 tvg-id="AlhayatTV.eg@SD",Alhayat TV +#EXTINF:-1 tvg-id="AlhayatDrama.eg@SD",Alhayat Drama (576) +http://213.57.91.138:8000/play/a06s +#EXTINF:-1 tvg-id="AlhayatTV.eg@SD",Alhayat TV (720p) https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/alhayathd/playlist.m3u8 +#EXTINF:-1 tvg-id="AlNahar.eg@SD",Al-Nahar (576p) +http://213.57.91.138:8000/play/a06m +#EXTINF:-1 tvg-id="AlNaharDrama.eg@SD",Al-Nahar Drama (576) +http://213.57.91.138:8000/play/a06n #EXTINF:-1 tvg-id="AlShoub.eg@SD",AlShoub (720p) https://play.tactivemedia.com/memfs/c5919b97-5329-4b84-91b2-613c6ed9953e.m3u8 #EXTINF:-1 tvg-id="ATVSat.us",ATVSat (1080p) [Not 24/7] https://stream.atvsat.com/atvsatlive/smil:atvsatlive.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="CBC.eg",CBC (576p) +http://213.57.91.138:8000/play/a06o #EXTINF:-1 tvg-id="CBC.eg",CBC (1080p) https://bcovlive-a.akamaihd.net/0c223ac0a9d34b30b100cb92ee83b70a/us-west-2/6057955906001/playlist.m3u8 -#EXTINF:-1 tvg-id="CBC.eg@SD",CBC (1080i) -https://fl1002.bozztv.com/ga-cbc/index.m3u8 -#EXTINF:-1 tvg-id="CBCDrama.eg@SD",CBC Drama -https://fl1002.bozztv.com/ga-cbcdrama/index.m3u8 +#EXTINF:-1 tvg-id="CBCDrama.eg@SD",CBC Drama (576p) +http://213.57.91.138:8000/play/a06q +#EXTINF:-1 tvg-id="CBCSofra.eg",CBC Sofra (576p) +http://213.57.91.138:8000/play/a06p #EXTINF:-1 tvg-id="CBCSofra.eg",CBC Sofra (1080p) https://bcovlive-a.akamaihd.net/753a1f2c951b4fb3914f30e1deb147d8/us-west-2/6057955906001/playlist.m3u8 #EXTINF:-1 tvg-id="CopticTV.eg",Coptic TV (720p) [Not 24/7] https://5aafcc5de91f1.streamlock.net/ctvchannel.tv/ctv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="DMC.eg",DMC (1080p) https://bcovlive-a.akamaihd.net/ba3169004d40484b9ff29e194964c9e8/eu-west-1/6057955906001/playlist.m3u8 -#EXTINF:-1 tvg-id="DMC.eg@SD",DMC (720p) -https://fl1002.bozztv.com/ga-dmc/index.m3u8 -#EXTINF:-1 tvg-id="DMCDrama.eg@SD",DMC Drama (720p) -https://fl1002.bozztv.com/ga-dmcdrama/index.m3u8 -#EXTINF:-1 tvg-id="ElMehwarChannel.eg@SD",El Mehwar Channel -https://fl1002.bozztv.com/ga-elmehwar/tracks-v1a1/mono.m3u8 #EXTINF:-1 tvg-id="ElRadio9090FM.eg",El Radio 9090 FM (480p) https://9090video.mobtada.com/hls/stream.m3u8 #EXTINF:-1 tvg-id="",Elsharq TV (1080p) [Not 24/7] @@ -55,7 +55,7 @@ https://nogoumtv.nrpstream.com/hls/stream.m3u8 https://bcovlive-a.akamaihd.net/3dc60bab470f4c9fbf00408ecb7c3d7a/eu-west-1/6057955906001/playlist_dvr.m3u8 #EXTINF:-1 tvg-id="PNCDrama.eg@SD",PNC Drama (1080p) https://d35j504z0x2vu2.cloudfront.net/v1/master/0bc8e8376bd8417a1b6761138aa41c26c7309312/pnc-drama/master.m3u8 -#EXTINF:-1 tvg-id="RotanaCinemaEgypt.eg" http-referrer="https://rotana.net/",Rotana Cinema Egypt (1080p) +#EXTINF:-1 tvg-id="RotanaCinemaEgypt.eg" http-referrer="https://rotana.net/",Rotana Cinema Egypt (1080p) [Geo-blocked] #EXTVLCOPT:http-referrer=https://rotana.net/ https://rotana.hibridcdn.net/rotananet/cinemamasr_net-7Y83PP5adWixDF93/playlist.m3u8 #EXTINF:-1 tvg-id="WatanTV.eg",Watan TV (1080p) From 0aafcc8e19dfbc237aea741cf4cbf01eee4687db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= <30985701+BellezaEmporium@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:03:39 +0200 Subject: [PATCH 05/51] removed multiple channels --- streams/tr.m3u | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/streams/tr.m3u b/streams/tr.m3u index 53a52e2957..ccfee988da 100644 --- a/streams/tr.m3u +++ b/streams/tr.m3u @@ -48,8 +48,6 @@ http://185.234.111.229:8000/play/a05u https://tv.ensonhaber.com/benguturk/benguturk.m3u8 #EXTINF:-1 tvg-id="BeratTV.tr",Berat TV (720p) [Not 24/7] https://cdn-berattv.yayin.com.tr/berattv/berattv/playlist.m3u8 -#EXTINF:-1 tvg-id="BeratTV.tr",Berat TV (576p) -http://185.234.111.229:8000/play/a05g #EXTINF:-1 tvg-id="BesiktasWebTV.tr",Beşiktaş Web TV (360p) https://s01.vpis.io/besiktas/besiktas.m3u8 #EXTINF:-1 tvg-id="BeyazTV.tr",Beyaz TV (1080p) @@ -96,8 +94,6 @@ https://live.artidijitalmedya.com/artidijital_ciftcitv/ciftcitv/playlist.m3u8 https://live.artidijitalmedya.com/artidijital_cine1/cine1/playlist.m3u8 #EXTINF:-1 tvg-id="Cine5.tr",Cine5 (720p) https://cdn-cine5tv.yayin.com.tr/cine5tv/cine5tv/playlist.m3u8 -#EXTINF:-1 tvg-id="CNBCe.tr",CNBC-e -https://stream.tvcdn.net/ekonomi/cnbc-e.m3u8 #EXTINF:-1 tvg-id="DehaTV.tr",Deha TV (720p) [Geo-blocked] https://live.artidijitalmedya.com/artidijital_dehatv/dehatv/playlist.m3u8 #EXTINF:-1 tvg-id="DenizPostasiTV.tr",Deniz Postası TV (720p) [Not 24/7] @@ -140,8 +136,6 @@ https://viamotionhsi.netplus.ch/live/eds/eurod/browser-HLS8/eurod.m3u8 https://live.duhnet.tv/S2/HLS_LIVE/eurodnp/playlist.m3u8 #EXTINF:-1 tvg-id="EuroD.tr@SD",Euro D https://viamotionhsi.netplus.ch/live/eds/eurod/browser-dash/eurod.mpd -#EXTINF:-1 tvg-id="EuroStar.tr",EuroStar (576p) -http://185.234.111.229:8000/play/a01h #EXTINF:-1 tvg-id="EuroStar.tr",EuroStar https://gknnowtv.onrender.com/eurostar.m3u8 #EXTINF:-1 tvg-id="EuroStar.tr",EuroStar TV (1080p) @@ -176,14 +170,10 @@ https://tv.ensonhaber.com/haberglobal/haberglobal.m3u8 https://haberglobaldvr.blutv.com/blutv_haberglobal_dvr/live.m3u8 #EXTINF:-1 tvg-id="HaberturkTV.tr",Habertürk TV (1080p) https://ciner-live.daioncdn.net/haberturktv/haberturktv.m3u8 -#EXTINF:-1 tvg-id="HaberturkTV.tr",Habertürk TV (1080p) -https://haberturk.blutv.com/blutv_haberturk_live/live.m3u8 #EXTINF:-1 tvg-id="HaberturkTV.tr",Habertürk TV (720p) [Not 24/7] https://tv.ensonhaber.com/haberturk/haberturk.m3u8 #EXTINF:-1 tvg-id="HalkTV.tr",Halk TV (1080p) https://halktv-live.daioncdn.net/halktv/halktv.m3u8 -#EXTINF:-1 tvg-id="HalkTV.tr",Halk TV (720p) -https://halktv.blutv.com/blutv_halktv_live/live.m3u8 #EXTINF:-1 tvg-id="HelwaTV.tr",Helwa TV (1080p) https://raw.githubusercontent.com/ipstreet312/freeiptv/master/ressources/dzflix/helwa.m3u8 #EXTINF:-1 tvg-id="HTSporTV.tr",HTSpor TV (1080p) @@ -254,12 +244,6 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01602-themahqfrance-vivekanald-sams https://live.artidijitalmedya.com/artidijital_kanalfirat/kanalfirat/playlist.m3u8 #EXTINF:-1 tvg-id="KanalHayat.tr",Kanal Hayat (1080p) https://tbn02a.ltnschedule.com/hls/nx21i.m3u8 -#EXTINF:-1 tvg-id="KanalS.tr",Kanal S (720p) -https://cdn-kanals.yayin.com.tr/kanals/kanals/playlist.m3u8 -#EXTINF:-1 tvg-id="KanalUrfa.tr",Kanal Urfa (576p) [Not 24/7] -https://edge1.socialsmart.tv/kanalurfa/bant1/playlist.m3u8 -#EXTINF:-1 tvg-id="KanalV.tr",Kanal V (720p) [Not 24/7] -http://yerelmedya.tv:1935/kanalv/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="KanalV.tr",Kanal V (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_kanalv/kanalv/playlist.m3u8 #EXTINF:-1 tvg-id="KanalZ.tr",Kanal Z (1080p) [Geo-blocked] @@ -274,16 +258,12 @@ https://live.artidijitalmedya.com/artidijital_kaytv/kaytv/playlist.m3u8 https://live.artidijitalmedya.com/artidijital_kentturktv/kentturktv/playlist.m3u8 #EXTINF:-1 tvg-id="KentTurk.tr",Kent Türk TV (720p) [Not 24/7] https://live.artidijitalmedya.com/artidijital_38kenttv/38kenttv/playlist.m3u8 -#EXTINF:-1 tvg-id="KonTV.tr",Kon TV (720p) -https://mn-nl.mncdn.com/blutv_kontv2/live.m3u8 #EXTINF:-1 tvg-id="KonyaOlayTV.tr",Konya Olay TV (720p) https://live.artidijitalmedya.com/artidijital_konyaolaytv/konyaolaytv/playlist.m3u8 #EXTINF:-1 tvg-id="KralPopTV.tr",KRAL Pop TV (720p) https://dogus-live.daioncdn.net/kralpoptv/playlist.m3u8 #EXTINF:-1 tvg-id="KralTV.tr",KRAL TV (720p) https://dogus-live.daioncdn.net/kraltv/playlist.m3u8 -#EXTINF:-1 tvg-id="KRT.tr",KRT (720p) -https://krt.blutv.com/blutv_krt_live/live.m3u8 #EXTINF:-1 tvg-id="KudusTV.tr",Kudüs TV (480p) [Geo-blocked] https://yayin.kudustv.com/981680400/kudustv/playlist.m3u8 #EXTINF:-1 tvg-id="LalegulTV.tr",Lalegul TV (1080p) @@ -332,12 +312,8 @@ https://edge1.socialsmart.tv/naturaltv/bant1/playlist.m3u8 https://uycyyuuzyh.turknet.ercdn.net/nphindgytw/nowtv/nowtv.m3u8 #EXTINF:-1 tvg-id="NOWTV.tr",NOW TV http://116.202.238.88/FOXTV_TR/index.m3u8 -#EXTINF:-1 tvg-id="NOWTV.tr",NOW TV -https://c.fulltvizle.com/fox/index.m3u8 #EXTINF:-1 tvg-id="NTV.tr",NTV (720p) [Not 24/7] https://dogus-live.daioncdn.net/ntv/ntv.m3u8 -#EXTINF:-1 tvg-id="NTVSpor.tr",NTV Spor -http://46.4.193.238:8484/hls/ntvspor/playlist.m3u8 #EXTINF:-1 tvg-id="Number1Ask.tr",Number 1 Ask (720p) https://b01c02nl.mediatriple.net/videoonlylive/mtkgeuihrlfwlive/u_stream_5c9e18f9cea15_1/playlist.m3u8 #EXTINF:-1 tvg-id="Number1Damar.tr",Number 1 Damar (720p) @@ -421,8 +397,6 @@ https://raw.githubusercontent.com/UzunMuhalefet/yayinlar/main/streams/best/showm https://ciner-live.daioncdn.net/showtv/showtv.m3u8 #EXTINF:-1 tvg-id="SinopYildizTV.tr",Sinop Yildiz TV (360p) https://s01.vpis.io/sinopyildiz/sinopyildiz.m3u8 -#EXTINF:-1 tvg-id="SozcuTV.tr",Sozcu TV (1080p) -http://185.234.111.229:8000/play/a00y #EXTINF:-1 tvg-id="SportsTV.tr",Sports TV (720p) [Geo-blocked] https://live.sportstv.com.tr/hls/low/sportstv.m3u8 #EXTINF:-1 tvg-id="StarTV.tr",Star TV (720p) [Not 24/7] @@ -489,12 +463,8 @@ https://tv-trt3.live.trt.com.tr/master.m3u8 https://tv-trtarabi.medya.trt.com.tr/master.m3u8 #EXTINF:-1 tvg-id="TRTAvaz.tr",TRT Avaz (720p) https://tv-trtavaz.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTBelgesel.tr",TRT Belgesel (1080p) -http://185.234.111.229:8000/play/a00f #EXTINF:-1 tvg-id="TRTBelgesel.tr",TRT Belgesel (720p) https://tv-trtbelgesel.medya.trt.com.tr/master.m3u8 -#EXTINF:-1 tvg-id="TRTCocuk.tr",TRT Cocuk (1080p) -http://185.234.111.229:8000/play/a00b #EXTINF:-1 tvg-id="TRTCocuk.tr",TRT Çocuk (720p) https://tv-trtcocuk.medya.trt.com.tr/master.m3u8 #EXTINF:-1 tvg-id="TRTDiyanetCocuk.tr",TRT Diyanet Çocuk (720p) @@ -552,9 +522,7 @@ http://stream.taksimbilisim.com:1935/tv52/smil:tv52.smil/playlist.m3u8 #EXTINF:-1 tvg-id="TV52.tr",TV 52 (720p) [Not 24/7] https://edge1.socialsmart.tv/tv52/bant1/playlist.m3u8 #EXTINF:-1 tvg-id="TV100.tr",TV 100 (1080p) -https://tv100-live.daioncdn.net/tv100/tv100_1080p.m3u8 -#EXTINF:-1 tvg-id="TV100.tr",TV 100 (720p) -https://tv100.blutv.com/blutv_tv100_live/live.m3u8 +https://tv100-live.daioncdn.net/tv100/tv100.m3u8 #EXTINF:-1 tvg-id="TV264.tr",TV 264 (1080p) https://b01c02nl.mediatriple.net/videoonlylive/mtdxkkitgbrckilive/broadcast_5ee244263fd6d.smil/playlist.m3u8 #EXTINF:-1 tvg-id="TVA.tr",TV A (720p) @@ -594,3 +562,4 @@ https://embedlp.becdn.net/womantv.m3u8 https://stream.yol.tv:9443/medialive/yol.m3u8 #EXTINF:-1 tvg-id="ZarokTV.tr",Zarok TV (720p) https://zindikurmanci.zaroktv.com.tr/hls/stream.m3u8 + From ec333b10e341f8938b2f7a03e124d6809738c8c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= <30985701+BellezaEmporium@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:05:30 +0200 Subject: [PATCH 06/51] lint --- streams/tr.m3u | 1 - 1 file changed, 1 deletion(-) diff --git a/streams/tr.m3u b/streams/tr.m3u index ccfee988da..16a4714386 100644 --- a/streams/tr.m3u +++ b/streams/tr.m3u @@ -562,4 +562,3 @@ https://embedlp.becdn.net/womantv.m3u8 https://stream.yol.tv:9443/medialive/yol.m3u8 #EXTINF:-1 tvg-id="ZarokTV.tr",Zarok TV (720p) https://zindikurmanci.zaroktv.com.tr/hls/stream.m3u8 - From f726dd6d6449bf3ee61386a1ea8c5d02731cfa6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= <30985701+BellezaEmporium@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:05:57 +0200 Subject: [PATCH 07/51] lint From c4432dc74be7a422a2f92a0100b1e8706444ea36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Moret?= <30985701+BellezaEmporium@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:06:23 +0200 Subject: [PATCH 08/51] lint x3 (keeps adding a new line) From 8176df1d5c7d0168aa0933003bcb9f61b5bfc3ff Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:12:42 +0000 Subject: [PATCH 09/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18236640094) workflow. closes #27463, closes #27430, closes #27433, closes #27364, closes #27457, closes #27447, closes #27375, closes #27371, closes #27370, closes #27366, closes #27363, closes #27362, closes #27361 --- streams/bg.m3u | 2 ++ streams/eg.m3u | 10 +++++++++- streams/id.m3u | 6 ++++-- streams/in.m3u | 2 ++ streams/pe.m3u | 2 -- streams/sg.m3u | 4 ++-- streams/us.m3u | 2 ++ 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/streams/bg.m3u b/streams/bg.m3u index 5b548f8c34..23642e585f 100644 --- a/streams/bg.m3u +++ b/streams/bg.m3u @@ -38,3 +38,5 @@ https://streamer103.neterra.tv/travel/live.m3u8 http://zagoratv.ddns.net:8080/tvzagora.m3u8 #EXTINF:-1 tvg-id="TVNBulgaria.bg",TVN-Bulgaria (1080p) https://obs.friendshipchurch.eu/tvn/mystream.m3u8 +#EXTINF:-1 tvg-id="Nickelodeon.bg@SD",Nickelodeon (576p) +http://87.246.60.6:11004/?token=fas-tv.com diff --git a/streams/eg.m3u b/streams/eg.m3u index 7db29a5f61..ad7dac04ab 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -30,7 +30,7 @@ https://5aafcc5de91f1.streamlock.net/ctvchannel.tv/ctv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="DMC.eg",DMC (1080p) https://bcovlive-a.akamaihd.net/ba3169004d40484b9ff29e194964c9e8/eu-west-1/6057955906001/playlist.m3u8 #EXTINF:-1 tvg-id="DMC.eg@SD",DMC (720p) -https://fl1002.bozztv.com/ga-dmc/index.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/dmc/playlist.m3u8 #EXTINF:-1 tvg-id="DMCDrama.eg@SD",DMC Drama (720p) https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/dmcdrama/playlist.m3u8 #EXTINF:-1 tvg-id="ElMehwarChannel.eg@SD",El Mehwar Channel @@ -62,3 +62,11 @@ https://rotana.hibridcdn.net/rotananet/cinemamasr_net-7Y83PP5adWixDF93/playlist. https://rp.tactivemedia.com/watantv_source/live/playlist.m3u8 #EXTINF:-1 tvg-id="SadaElbalad.eg@SD",Sada Elbalad https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/sadaalbalad/playlist.m3u8 +#EXTINF:-1 tvg-id="AlNaharDrama.eg@SD",Al-Nahar Drama +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/alnahardrama/playlist.m3u8 +#EXTINF:-1 tvg-id="TeN.eg@SD",TeN +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/ten/playlist.m3u8 +#EXTINF:-1 tvg-id="Cima.eg@SD",Cima +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/alhayatcinema/playlist.m3u8 +#EXTINF:-1 tvg-id="CopticTV.eg@SD",Coptic TV +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/ctv/playlist.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index e9a66eb928..b7768f24d2 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -35,8 +35,6 @@ https://5bf7b725107e5.streamlock.net/bungotv/bungotv/playlist.m3u8 https://ams.juraganstreaming.com:5443/LiveApp/streams/celebesmedia.m3u8 #EXTINF:-1 tvg-id="CNBCIndonesia.id",CNBC Indonesia (720p) https://live.cnbcindonesia.com/livecnbc/smil:cnbctv.smil/master.m3u8 -#EXTINF:-1 tvg-id="DAAITV.id",DAAI TV (720p) -https://dacastmmd.mmdlive.lldns.net/dacastmmd/683cc426c19442a4ba31c53be5c963bb/index.m3u8 #EXTINF:-1 tvg-id="DAAITV.id@SD",DAAI TV https://pull.daaiplus.com/live-DAAIPLUS/live-DAAIPLUS_HD.m3u8 #EXTINF:-1 tvg-id="DhammaTV.id",Dhamma TV (720p) [Not 24/7] @@ -291,3 +289,7 @@ http://122.248.43.242:1935/JAWAPOSTVMADIUN/_definst_/myStream/playlist.m3u8 http://122.248.43.242:1935/JAWAPOSTVJKT/_definst_/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="JawaPosTV.id@Bali",Jawa Pos TV Bali (576p) http://122.248.43.242:1935/JAWAPOSTVBALI/_definst_/myStream/playlist.m3u8 +#EXTINF:-1 tvg-id="AsthaTV.id@HD",Astha TV (1080p) [Not 24/7] +https://hgmtv.com:19360/asthatv/asthatv.m3u8 +#EXTINF:-1 tvg-id="BatamTV.id@SD",Batam TV (480p) [Not 24/7] +http://122.248.43.242:1935/BATAMTV/_definst_/myStream/playlist.m3u8 diff --git a/streams/in.m3u b/streams/in.m3u index 456ec34f10..a8b793ec49 100644 --- a/streams/in.m3u +++ b/streams/in.m3u @@ -1324,3 +1324,5 @@ https://nonprod-sports-cohort.jiocinema.com/bpk-tv/JC_ColorsTamilHD/JCHLS/index. https://live.dinesh29.com.np/stream/jiotvplus/jayamax/master.m3u8 #EXTINF:-1 tvg-id="AajTak.in@SD",Aaj Tak https://live.dinesh29.com.np/stream/jiotvplus/aajtak/master.m3u8 +#EXTINF:-1 tvg-id="FlowersTV.in@SD",Flowers TV (576p) +http://93.119.105.61:80/play/live.php?mac=00:1A:79:00:28:53&stream=443062&extension=ts&play_token=FPh4kuMnod diff --git a/streams/pe.m3u b/streams/pe.m3u index 4c5606c66d..e7c56903a4 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -139,8 +139,6 @@ https://servilive.com:3531/stream/play.m3u8 https://7.innovatestream.pe:19360/turbomixoficial/turbomixoficial.m3u8 #EXTINF:-1 tvg-id="TVCosmos.pe",TV Cosmos (720p) [Not 24/7] https://5790d294af2dc.streamlock.net/8134/8134/playlist.m3u8 -#EXTINF:-1 tvg-id="TVPeru.pe",TV Perú -https://cdnhd.iblups.com/hls/777b4d4cc0984575a7d14f6ee57dbcaf.m3u8 #EXTINF:-1 tvg-id="TVPeruInternacional.pe",TV Perú Internacional (1080p) https://cdnhd.iblups.com/hls/ee2450c81e554f4cae0e6292106993c2.m3u8 #EXTINF:-1 tvg-id="TVPeruNoticias.pe",TV Perú Noticias diff --git a/streams/sg.m3u b/streams/sg.m3u index e50dbd4df1..8faa7871a9 100644 --- a/streams/sg.m3u +++ b/streams/sg.m3u @@ -9,8 +9,8 @@ https://ddftztnzt6o79.cloudfront.net/hls/clr4ctv_okto/master.m3u8 https://dlau142f16b92.cloudfront.net/hls/clr4ctv_ch5/master.m3u8 #EXTINF:-1 tvg-id="Channel8.sg",Channel 8 [Geo-blocked] https://d34e90s3s13i7n.cloudfront.net/hls/clr4ctv_ch8/master.m3u8 -#EXTINF:-1 tvg-id="CNA.sg",CNA [Geo-blocked] -https://d2ko4czujk9652.cloudfront.net/hls/clr4ctv_cnas/master.m3u8 +#EXTINF:-1 tvg-id="CNA.sg",CNA (1080p) [Geo-blocked] +https://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index.m3u8 #EXTINF:-1 tvg-id="CNAInternational.sg",CNA International (1080p) https://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index.m3u8 #EXTINF:-1 tvg-id="CNAInternational.sg",CNA International (1080p) diff --git a/streams/us.m3u b/streams/us.m3u index 36688cf6ba..4d36b3be04 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1050,3 +1050,5 @@ https://fl25.moveonjoy.com/CBSEAST/index.m3u8 https://fast-channels.sinclairstoryline.com/CHARGE/index.m3u8 #EXTINF:-1 tvg-id="TheWalkTV.us",The Walk TV (720p) https://cdn-unified-hls.streamspot.com/ingest1/8b0796adaf/playlist.m3u8?origin=1 +#EXTINF:-1 tvg-id="TheWayTV.us@SD",The Way TV +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/thewaytv/playlist.m3u8 From 4b68ba741d43dc853460626a6efd12ec6b88902b Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:12:42 +0000 Subject: [PATCH 10/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18236640094) workflow. --- PLAYLISTS.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index c3c7433658..59d0933847 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -29,30 +29,30 @@ Same thing, but split up into separate files: Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking35https://iptv-org.github.io/iptv/categories/cooking.m3u Culture165https://iptv-org.github.io/iptv/categories/culture.m3u - Documentary123https://iptv-org.github.io/iptv/categories/documentary.m3u - Education176https://iptv-org.github.io/iptv/categories/education.m3u + Documentary122https://iptv-org.github.io/iptv/categories/documentary.m3u + Education175https://iptv-org.github.io/iptv/categories/education.m3u Entertainment620https://iptv-org.github.io/iptv/categories/entertainment.m3u Family53https://iptv-org.github.io/iptv/categories/family.m3u General2375https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids267https://iptv-org.github.io/iptv/categories/kids.m3u + Kids265https://iptv-org.github.io/iptv/categories/kids.m3u Legislative187https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle104https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies372https://iptv-org.github.io/iptv/categories/movies.m3u + Lifestyle103https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Movies371https://iptv-org.github.io/iptv/categories/movies.m3u Music632https://iptv-org.github.io/iptv/categories/music.m3u News813https://iptv-org.github.io/iptv/categories/news.m3u Outdoor45https://iptv-org.github.io/iptv/categories/outdoor.m3u Public26https://iptv-org.github.io/iptv/categories/public.m3u - Relax4https://iptv-org.github.io/iptv/categories/relax.m3u - Religious684https://iptv-org.github.io/iptv/categories/religious.m3u + Relax3https://iptv-org.github.io/iptv/categories/relax.m3u + Religious685https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u - Series256https://iptv-org.github.io/iptv/categories/series.m3u + Series257https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u Sports294https://iptv-org.github.io/iptv/categories/sports.m3u Travel41https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3692https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3690https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -86,12 +86,11 @@ Same thing, but split up into separate files: Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic6https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic400https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic404https://iptv-org.github.io/iptv/languages/ara.m3u Armenian8https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u Ayizo Gbe1https://iptv-org.github.io/iptv/languages/ayb.m3u - Aymara1https://iptv-org.github.io/iptv/languages/aym.m3u Azerbaijani17https://iptv-org.github.io/iptv/languages/aze.m3u Baatonum2https://iptv-org.github.io/iptv/languages/bba.m3u Bambara5https://iptv-org.github.io/iptv/languages/bam.m3u @@ -103,7 +102,7 @@ Same thing, but split up into separate files: Bisa1https://iptv-org.github.io/iptv/languages/bib.m3u Bosnian14https://iptv-org.github.io/iptv/languages/bos.m3u Buamu1https://iptv-org.github.io/iptv/languages/box.m3u - Bulgarian23https://iptv-org.github.io/iptv/languages/bul.m3u + Bulgarian24https://iptv-org.github.io/iptv/languages/bul.m3u Burmese6https://iptv-org.github.io/iptv/languages/mya.m3u Catalan55https://iptv-org.github.io/iptv/languages/cat.m3u Central Atlas Tamazight1https://iptv-org.github.io/iptv/languages/tzm.m3u @@ -124,7 +123,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2311https://iptv-org.github.io/iptv/languages/eng.m3u + English2312https://iptv-org.github.io/iptv/languages/eng.m3u Estonian8https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -153,7 +152,7 @@ Same thing, but split up into separate files: Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u Hungarian103https://iptv-org.github.io/iptv/languages/hun.m3u Icelandic5https://iptv-org.github.io/iptv/languages/isl.m3u - Indonesian136https://iptv-org.github.io/iptv/languages/ind.m3u + Indonesian138https://iptv-org.github.io/iptv/languages/ind.m3u Inuktitut1https://iptv-org.github.io/iptv/languages/iku.m3u Irish3https://iptv-org.github.io/iptv/languages/gle.m3u Isekiri1https://iptv-org.github.io/iptv/languages/its.m3u @@ -219,9 +218,8 @@ Same thing, but split up into separate files: Polish67https://iptv-org.github.io/iptv/languages/pol.m3u Portuguese252https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u - Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian105https://iptv-org.github.io/iptv/languages/ron.m3u - Russian370https://iptv-org.github.io/iptv/languages/rus.m3u + Russian357https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u Samoan2https://iptv-org.github.io/iptv/languages/smo.m3u Santali1https://iptv-org.github.io/iptv/languages/sat.m3u @@ -234,7 +232,7 @@ Same thing, but split up into separate files: South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1709https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1708https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u Swahili19https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u From f190a22696ee7c881b59eaa1c09ea86789657d44 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 00:14:20 +0000 Subject: [PATCH 11/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18251296878) workflow. closes #27511, closes #27494, closes #27492, closes #27513, closes #27512, closes #27510, closes #27509, closes #27508, closes #27507, closes #27506, closes #27505, closes #27504, closes #27503, closes #27502, closes #27501, closes #27500, closes #27499, closes #27498, closes #27497, closes #27496, closes #27495, closes #27493, closes #27490, closes #27489, closes #27488, closes #27487, closes #27486, closes #27485, closes #27484, closes #27483, closes #27482, closes #27480, closes #27479, closes #27474, closes #27473, closes #27470, closes #27469, closes #27465, closes #27437, closes #27233 --- streams/ar.m3u | 2 ++ streams/au.m3u | 2 ++ streams/bg.m3u | 2 ++ streams/bw.m3u | 4 +++- streams/cn.m3u | 2 ++ streams/eg.m3u | 2 ++ streams/er.m3u | 2 ++ streams/gh.m3u | 32 +++++++++++++++++++++++++++++++- streams/km.m3u | 3 +++ streams/mg.m3u | 4 +++- streams/mw.m3u | 4 +++- streams/na.m3u | 2 ++ streams/ne.m3u | 4 ++++ streams/ng.m3u | 14 ++++++++++++-- streams/pe.m3u | 4 ++++ streams/tz.m3u | 2 ++ streams/uk.m3u | 2 ++ 17 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 streams/km.m3u diff --git a/streams/ar.m3u b/streams/ar.m3u index ff3126563a..158c30e659 100644 --- a/streams/ar.m3u +++ b/streams/ar.m3u @@ -196,3 +196,5 @@ https://stmv6.voxtvhd.com.br/cineclasico/cineclasico/playlist.m3u8 #EXTINF:-1 tvg-id="XtremaTerror.ar" http-referrer="https://xtrematv.com/?p=1456",Xtrema Terror #EXTVLCOPT:http-referrer=https://xtrematv.com/?p=1456 https://stmv6.voxtvhd.com.br/cineterror/cineterror/playlist.m3u8 +#EXTINF:-1 tvg-id="DisneyChannelLatinAmerica.ar",Disney Channel Latin America (1080p) +http://201.230.121.186:8000/play/a0fb/index.m3u8 diff --git a/streams/au.m3u b/streams/au.m3u index 319e6e7532..5ff6ce1b25 100644 --- a/streams/au.m3u +++ b/streams/au.m3u @@ -99,3 +99,5 @@ https://live-tvsn.simplestreamcdn.com/live12/tvsnbeauty/bitrate1.isml/.m3u8 https://live-tvsn.simplestreamcdn.com/live13/tvsnjewellery/bitrate1.isml/.m3u8 #EXTINF:-1 tvg-id="ABCAustralia.au@SD",ABC Australia https://live.dinesh29.com.np/stream/jiotvplus/abcaustralia/master.m3u8 +#EXTINF:-1 tvg-id="10Shake.au",10 Shake (480p) +http://44.32.200.212:5004/auto/v13 diff --git a/streams/bg.m3u b/streams/bg.m3u index 23642e585f..9673acf285 100644 --- a/streams/bg.m3u +++ b/streams/bg.m3u @@ -40,3 +40,5 @@ http://zagoratv.ddns.net:8080/tvzagora.m3u8 https://obs.friendshipchurch.eu/tvn/mystream.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.bg@SD",Nickelodeon (576p) http://87.246.60.6:11004/?token=fas-tv.com +#EXTINF:-1 tvg-id="DisneyChannel.bg",Disney Channel (576p) +http://84.54.128.52:9090/play/3006/index.m3u8 diff --git a/streams/bw.m3u b/streams/bw.m3u index fcd718794a..a3f6e288ad 100644 --- a/streams/bw.m3u +++ b/streams/bw.m3u @@ -1 +1,3 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="BTV1.bw@SD",BTV 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/btv1/playlist.m3u8 diff --git a/streams/cn.m3u b/streams/cn.m3u index 0861eaab6e..5903f6ea8d 100644 --- a/streams/cn.m3u +++ b/streams/cn.m3u @@ -1397,3 +1397,5 @@ http://223.110.254.143:6610/cntv/live1/HD-8000k-1080P-heilongjiangstv/HD-8000k-1 http://hlsal-ldvt.qing.mgtv.com/nn_live/nn_x64/dWlwPTEyNy4wLjAuMSZ1aWQ9cWluZy1jbXMmbm5fdGltZXpvbmU9OCZjZG5leF9pZD1hbF9obHNfbGR2dCZ1dWlkPTliODY4NmU5ZTM2YzYwMmMmZT02OTE0NjA0JnY9MSZpZD1ITldTWkdTVCZzPTcwN2RiYTc2YzJjNmJmMTQ4MmUyZGYzOWU2NWM3YWFi/HNWSZGST.m3u8 #EXTINF:-1 tvg-id="LiangshanTV.cn",Liangshan TV https://tvlive.i0834.cn/nmip-media/channellive/channel115044/playlist.m3u8 +#EXTINF:-1 tvg-id="ZhejiangSatelliteTV.cn",Zhejiang Satellite TV +https://play-qukan.cztv.com/live/1758879019692345.m3u8 diff --git a/streams/eg.m3u b/streams/eg.m3u index ad7dac04ab..30c8bcddc4 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -70,3 +70,5 @@ https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/ten/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/alhayatcinema/playlist.m3u8 #EXTINF:-1 tvg-id="CopticTV.eg@SD",Coptic TV https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/ctv/playlist.m3u8 +#EXTINF:-1 tvg-id="SadaElbaladDrama.eg@SD",Sada Elbalad Drama +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/sadaalbaladdrama/playlist.m3u8 diff --git a/streams/er.m3u b/streams/er.m3u index b89f1274a4..5156222c87 100644 --- a/streams/er.m3u +++ b/streams/er.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="ERiTV1.er@SD",ERi-TV 1 (576p) https://jmc-live.ercdn.net/eritreatv/eritreatv.m3u8 +#EXTINF:-1 tvg-id="ERiTV1.er@SD",ERi-TV 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119051/eritv/playlist.m3u8 diff --git a/streams/gh.m3u b/streams/gh.m3u index 095314fd4b..b9399ca0b8 100644 --- a/streams/gh.m3u +++ b/streams/gh.m3u @@ -14,7 +14,7 @@ https://asiakwa.com/ceejaytv/index.fmp4.m3u8 #EXTINF:-1 tvg-id="Channel247.gh@SD",Channel247 (1080p) https://tv.localstreamgh.com/Channel247/index.m3u8 #EXTINF:-1 tvg-id="ChannelOneTV.gh",ChannelOne TV (576p) -https://2ctv.crystaltv.mobi:44095/tv877.167.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/channelonetv/playlist.m3u8 #EXTINF:-1 tvg-id="EwenyigbaTV.de",Ewenyigba TV (720p) https://barakyah-hls.secdn.net/barakyah-channel/play/mp4:enyigba/playlist.m3u8 #EXTINF:-1 tvg-id="FacultyTV.gh",Faculty TV (720p) @@ -79,3 +79,33 @@ https://live.mediageneral.digital/live/livestream.m3u8 https://g2qd3exjy7an-hls-live.5centscdn.com/webtv3/ghanatv.stream/playlist.m3u8 #EXTINF:-1 tvg-id="UnitedTV.gh@SD",United TV https://g2qd3exjy7an-hls-live.5centscdn.com/utvgha/ghanaweb.stream/playlist.m3u8 +#EXTINF:-1 tvg-id="GTVSportsPlus.gh@SD",GTV Sports + +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/gtvsports/playlist.m3u8 +#EXTINF:-1 tvg-id="ElijahTV.gh@SD",Elijah TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/elijahtv/playlist.m3u8 +#EXTINF:-1 tvg-id="AtinkaTV.gh@SD",Atinka TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/atinkatv/playlist.m3u8 +#EXTINF:-1 tvg-id="GBCNews.gh@SD",GBC News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/gtv/playlist.m3u8 +#EXTINF:-1 tvg-id="UnitedTV.gh@SD",United TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/utvghana/playlist.m3u8 +#EXTINF:-1 tvg-id="KessbenTV.gh@SD",Kessben TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/kessbentv/playlist.m3u8 +#EXTINF:-1 tvg-id="ABCNewsGH.gh@SD",ABC News GH +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/abcnewsghana/playlist.m3u8 +#EXTINF:-1 tvg-id="GhOneTV.gh@SD",Gh One TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/ghonetv/playlist.m3u8 +#EXTINF:-1 tvg-id="OnuaTV.gh@SD",Onua TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/onuatv/playlist.m3u8 +#EXTINF:-1 tvg-id="TV3.gh@SD",TV3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/tv3/playlist.m3u8 +#EXTINF:-1 tvg-id="FireTV.gh@SD",Fire TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/firetv/playlist.m3u8 +#EXTINF:-1 tvg-id="JoyPrime.gh@SD",Joy Prime +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/joyprime/playlist.m3u8 +#EXTINF:-1 tvg-id="JoyNews.gh@SD",Joy News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/joynews/playlist.m3u8 +#EXTINF:-1 tvg-id="AdomTV.gh@SD",Adom TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/adomtv/playlist.m3u8 +#EXTINF:-1 tvg-id="RhemaTV.gh@SD",Rhema TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/rhematv/playlist.m3u8 diff --git a/streams/km.m3u b/streams/km.m3u new file mode 100644 index 0000000000..5ec3230e71 --- /dev/null +++ b/streams/km.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="ORTCTV.km@SD",ORTC TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/ortc/playlist.m3u8 diff --git a/streams/mg.m3u b/streams/mg.m3u index fcd718794a..51c64487bd 100644 --- a/streams/mg.m3u +++ b/streams/mg.m3u @@ -1 +1,3 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="TVM.mg@SD",TVM +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/tvmmadagascar/playlist.m3u8 diff --git a/streams/mw.m3u b/streams/mw.m3u index fcd718794a..d6d4b15506 100644 --- a/streams/mw.m3u +++ b/streams/mw.m3u @@ -1 +1,3 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="MBC.mw@SD",MBC +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/mbc1/playlist.m3u8 diff --git a/streams/na.m3u b/streams/na.m3u index 578cea25f9..126592ab01 100644 --- a/streams/na.m3u +++ b/streams/na.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="NTV.na",NTV (720p) https://s-pl-01.mediatool.tv/playout/ntv-abr/index.m3u8 +#EXTINF:-1 tvg-id="NBC1.na@SD",NBC 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/nbc1/playlist.m3u8 diff --git a/streams/ne.m3u b/streams/ne.m3u index b7d18ec926..b49a2082c3 100644 --- a/streams/ne.m3u +++ b/streams/ne.m3u @@ -5,3 +5,7 @@ https://live20.bozztv.com/dvrfl06/astv/astv-douniatv/index.m3u8 https://live20.bozztv.com/dvrfl06/astv/astv-saraouna/index.m3u8 #EXTINF:-1 tvg-id="TeleSahel.ne",Télé Sahel (576p) http://69.64.57.208/telesahel/playlist.m3u8 +#EXTINF:-1 tvg-id="TalTV.ne@SD",Tal TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/taltv/playlist.m3u8 +#EXTINF:-1 tvg-id="TeleSahel.ne@SD",Tele Sahel +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/telesahel/playlist.m3u8 diff --git a/streams/ng.m3u b/streams/ng.m3u index 6a6899ef87..783e5d5304 100644 --- a/streams/ng.m3u +++ b/streams/ng.m3u @@ -37,11 +37,11 @@ https://live-hls-5rxy.livepush.io/live_cdn/em_LJ5aZjqp0LdiQ/index.m3u8 #EXTINF:-1 tvg-id="CozaTV.ng@SD",Coza TV (576p) https://viewmedia7219.bozztv.com/wmedia/viewmedia100/web_019/Stream/playlist.m3u8 #EXTINF:-1 tvg-id="DoveTV.ng",Dove TV (576p) -https://webstreaming-7.viewmedia.tv/web_093/Stream/live93_3/high/playlist.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/dovetv/playlist.m3u8 #EXTINF:-1 tvg-id="DunamisTV.ng",Dunamis TV (576p) [Not 24/7] https://atechgroupuk.site/DTV.m3u8 #EXTINF:-1 tvg-id="EmmanuelTV.ng@SD",Emmanuel TV -https://live20.bozztv.com/dvrfl06/astv/astv-emmanuel/index.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/elmmanueltv/playlist.m3u8 #EXTINF:-1 tvg-id="FlameTV.ng@SD",Flame TV (576p) https://viewmedia7219.bozztv.com/wmedia/viewmedia100/web_010/Stream/playlist.m3u8 #EXTINF:-1 tvg-id="FoursquareTV.ng",Foursquare TV (360p) [Not 24/7] @@ -135,3 +135,13 @@ https://wazobia.live:8333/channel/wmax.m3u8 https://wazobia.live:8333/channel/wmaxph.m3u8 #EXTINF:-1 tvg-id="WholeWordTV.ng",Whole Word TV (720p) https://mn-nl.mncdn.com/wholewordtv/wholewordtv/index.m3u8 +#EXTINF:-1 tvg-id="Arewa24.ng@SD",Arewa 24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/arewa24/playlist.m3u8 +#EXTINF:-1 tvg-id="NTASports24.ng@SD",NTA Sports 24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/ntasports/playlist.m3u8 +#EXTINF:-1 tvg-id="FlameTV.ng@SD",Flame TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/flametv/playlist.m3u8 +#EXTINF:-1 tvg-id="TVCNews.ng@SD",TVC News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/tvcnews/playlist.m3u8 +#EXTINF:-1 tvg-id="ChannelsTV.ng@SD",Channels TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/channelstv/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index e7c56903a4..927277f12d 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -167,3 +167,7 @@ https://ott1.hdlatam.tv/live_abr/webtvVisionSur/playlist.m3u8 https://live.obslivestream.com/vivatv/index.m3u8 #EXTINF:-1 tvg-id="VNP.pe",VNP https://videoserver.tmcreativos.com:19360/visionnoticias/visionnoticias.m3u8 +#EXTINF:-1 tvg-id="TVPeru.pe" http-referrer="http://tvperu.gob.pe/",TV Peru (720p) +http://181.188.216.5:18000/play/a0qn/index.m3u8 +#EXTINF:-1 tvg-id="CanalN.pe@SD",Canal N +http://181.188.216.5:18000/play/a01p/index.m3u8 diff --git a/streams/tz.m3u b/streams/tz.m3u index 82d24dd245..5ed09d3fbc 100644 --- a/streams/tz.m3u +++ b/streams/tz.m3u @@ -5,3 +5,5 @@ https://goliveafrica.media:9998/live/625965017ed69/index.m3u8 http://138.68.138.119:8080/live/5a8993709ea19/index.m3u8 #EXTINF:-1 tvg-id="IBNTVAfrica.tz",IBN TV Africa (720p) http://68.183.41.209:8080/live/5d9a537c64b9c/index.m3u8 +#EXTINF:-1 tvg-id="ITV.tz@SD",ITV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/itv/playlist.m3u8 diff --git a/streams/uk.m3u b/streams/uk.m3u index f0ef8732ea..6826565eb5 100644 --- a/streams/uk.m3u +++ b/streams/uk.m3u @@ -330,3 +330,5 @@ http://69.64.57.208/voxafrica/playlist.m3u8 https://wildearth-ono.amagi.tv/playlist/amg01290-wildearth-oando/playlist.m3u8 #EXTINF:-1 tvg-id="YAAAS.uk@HD",YAAAS! (720p) [Geo-blocked] https://jmp2.uk/stvp-GB340000289 +#EXTINF:-1 tvg-id="AriseNews.uk@SD",Arise News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/arisenews/playlist.m3u8 From 4921c180fc46faf095d1173607db8c59431bb1ef Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 00:14:20 +0000 Subject: [PATCH 12/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18251296878) workflow. --- PLAYLISTS.md | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 59d0933847..957f0f7642 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -22,7 +22,7 @@ Same thing, but split up into separate files: CategoryChannelsPlaylist - Animation56https://iptv-org.github.io/iptv/categories/animation.m3u + Animation58https://iptv-org.github.io/iptv/categories/animation.m3u Auto18https://iptv-org.github.io/iptv/categories/auto.m3u Business68https://iptv-org.github.io/iptv/categories/business.m3u Classic45https://iptv-org.github.io/iptv/categories/classic.m3u @@ -31,28 +31,28 @@ Same thing, but split up into separate files: Culture165https://iptv-org.github.io/iptv/categories/culture.m3u Documentary122https://iptv-org.github.io/iptv/categories/documentary.m3u Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment620https://iptv-org.github.io/iptv/categories/entertainment.m3u + Entertainment621https://iptv-org.github.io/iptv/categories/entertainment.m3u Family53https://iptv-org.github.io/iptv/categories/family.m3u - General2375https://iptv-org.github.io/iptv/categories/general.m3u + General2385https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids265https://iptv-org.github.io/iptv/categories/kids.m3u + Kids268https://iptv-org.github.io/iptv/categories/kids.m3u Legislative187https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle103https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Lifestyle104https://iptv-org.github.io/iptv/categories/lifestyle.m3u Movies371https://iptv-org.github.io/iptv/categories/movies.m3u Music632https://iptv-org.github.io/iptv/categories/music.m3u - News813https://iptv-org.github.io/iptv/categories/news.m3u + News818https://iptv-org.github.io/iptv/categories/news.m3u Outdoor45https://iptv-org.github.io/iptv/categories/outdoor.m3u Public26https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u - Religious685https://iptv-org.github.io/iptv/categories/religious.m3u + Religious687https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u - Series257https://iptv-org.github.io/iptv/categories/series.m3u + Series258https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u - Sports294https://iptv-org.github.io/iptv/categories/sports.m3u + Sports295https://iptv-org.github.io/iptv/categories/sports.m3u Travel41https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3690https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3691https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -81,16 +81,17 @@ Same thing, but split up into separate files: Acoli1https://iptv-org.github.io/iptv/languages/ach.m3u Adhola1https://iptv-org.github.io/iptv/languages/adh.m3u Afar2https://iptv-org.github.io/iptv/languages/aar.m3u - Afrikaans3https://iptv-org.github.io/iptv/languages/afr.m3u + Afrikaans4https://iptv-org.github.io/iptv/languages/afr.m3u Albanian42https://iptv-org.github.io/iptv/languages/sqi.m3u Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic6https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic404https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic406https://iptv-org.github.io/iptv/languages/ara.m3u Armenian8https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u Ayizo Gbe1https://iptv-org.github.io/iptv/languages/ayb.m3u + Aymara1https://iptv-org.github.io/iptv/languages/aym.m3u Azerbaijani17https://iptv-org.github.io/iptv/languages/aze.m3u Baatonum2https://iptv-org.github.io/iptv/languages/bba.m3u Bambara5https://iptv-org.github.io/iptv/languages/bam.m3u @@ -102,12 +103,13 @@ Same thing, but split up into separate files: Bisa1https://iptv-org.github.io/iptv/languages/bib.m3u Bosnian14https://iptv-org.github.io/iptv/languages/bos.m3u Buamu1https://iptv-org.github.io/iptv/languages/box.m3u - Bulgarian24https://iptv-org.github.io/iptv/languages/bul.m3u + Bulgarian25https://iptv-org.github.io/iptv/languages/bul.m3u Burmese6https://iptv-org.github.io/iptv/languages/mya.m3u Catalan55https://iptv-org.github.io/iptv/languages/cat.m3u Central Atlas Tamazight1https://iptv-org.github.io/iptv/languages/tzm.m3u Central Kurdish1https://iptv-org.github.io/iptv/languages/ckb.m3u Chenoua1https://iptv-org.github.io/iptv/languages/cnu.m3u + Chewa1https://iptv-org.github.io/iptv/languages/nya.m3u Chhattisgarhi1https://iptv-org.github.io/iptv/languages/hne.m3u Chiga1https://iptv-org.github.io/iptv/languages/cgg.m3u Chinese214https://iptv-org.github.io/iptv/languages/zho.m3u @@ -123,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2312https://iptv-org.github.io/iptv/languages/eng.m3u + English2330https://iptv-org.github.io/iptv/languages/eng.m3u Estonian8https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -131,13 +133,13 @@ Same thing, but split up into separate files: Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u Finnish16https://iptv-org.github.io/iptv/languages/fin.m3u Fon3https://iptv-org.github.io/iptv/languages/fon.m3u - French476https://iptv-org.github.io/iptv/languages/fra.m3u + French479https://iptv-org.github.io/iptv/languages/fra.m3u Fulah3https://iptv-org.github.io/iptv/languages/ful.m3u Gaelic2https://iptv-org.github.io/iptv/languages/gla.m3u Ganda5https://iptv-org.github.io/iptv/languages/lug.m3u Gen1https://iptv-org.github.io/iptv/languages/gej.m3u Georgian22https://iptv-org.github.io/iptv/languages/kat.m3u - German331https://iptv-org.github.io/iptv/languages/deu.m3u + German332https://iptv-org.github.io/iptv/languages/deu.m3u Gikuyu3https://iptv-org.github.io/iptv/languages/kik.m3u Goan Konkani1https://iptv-org.github.io/iptv/languages/gom.m3u Gourmanchéma1https://iptv-org.github.io/iptv/languages/gux.m3u @@ -146,7 +148,7 @@ Same thing, but split up into separate files: Gujarati10https://iptv-org.github.io/iptv/languages/guj.m3u Gun1https://iptv-org.github.io/iptv/languages/guw.m3u Haitian13https://iptv-org.github.io/iptv/languages/hat.m3u - Hausa2https://iptv-org.github.io/iptv/languages/hau.m3u + Hausa3https://iptv-org.github.io/iptv/languages/hau.m3u Hebrew15https://iptv-org.github.io/iptv/languages/heb.m3u Hindi214https://iptv-org.github.io/iptv/languages/hin.m3u Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u @@ -188,6 +190,7 @@ Same thing, but split up into separate files: Lyélé1https://iptv-org.github.io/iptv/languages/lee.m3u Macedonian33https://iptv-org.github.io/iptv/languages/mkd.m3u Maithili1https://iptv-org.github.io/iptv/languages/mai.m3u + Malagasy1https://iptv-org.github.io/iptv/languages/mlg.m3u Malay17https://iptv-org.github.io/iptv/languages/msa.m3u Malayalam83https://iptv-org.github.io/iptv/languages/mal.m3u Maltese5https://iptv-org.github.io/iptv/languages/mlt.m3u @@ -216,8 +219,9 @@ Same thing, but split up into separate files: Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u Persian226https://iptv-org.github.io/iptv/languages/fas.m3u Polish67https://iptv-org.github.io/iptv/languages/pol.m3u - Portuguese252https://iptv-org.github.io/iptv/languages/por.m3u + Portuguese253https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u + Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian105https://iptv-org.github.io/iptv/languages/ron.m3u Russian357https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u @@ -232,9 +236,9 @@ Same thing, but split up into separate files: South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1708https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1711https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u - Swahili19https://iptv-org.github.io/iptv/languages/swa.m3u + Swahili20https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u Swedish12https://iptv-org.github.io/iptv/languages/swe.m3u Tachawit2https://iptv-org.github.io/iptv/languages/shy.m3u @@ -254,6 +258,7 @@ Same thing, but split up into separate files: Tigrinya1https://iptv-org.github.io/iptv/languages/tir.m3u Tooro1https://iptv-org.github.io/iptv/languages/ttj.m3u Tsonga1https://iptv-org.github.io/iptv/languages/tso.m3u + Tswana1https://iptv-org.github.io/iptv/languages/tsn.m3u Tumzabt1https://iptv-org.github.io/iptv/languages/mzb.m3u Turkish263https://iptv-org.github.io/iptv/languages/tur.m3u Turkmen8https://iptv-org.github.io/iptv/languages/tuk.m3u @@ -384,6 +389,7 @@ Same thing, but split up into separate files: - Santa Cruz de la Sierra https://iptv-org.github.io/iptv/cities/boscs.m3u - 🇧🇶 Bonaire https://iptv-org.github.io/iptv/countries/bq.m3u - 🇧🇦 Bosnia and Herzegovina https://iptv-org.github.io/iptv/countries/ba.m3u +- 🇧🇼 Botswana https://iptv-org.github.io/iptv/countries/bw.m3u - 🇧🇷 Brazil https://iptv-org.github.io/iptv/countries/br.m3u - Alagoas https://iptv-org.github.io/iptv/subdivisions/br-al.m3u - Maceió https://iptv-org.github.io/iptv/cities/brmcz.m3u @@ -508,6 +514,7 @@ Same thing, but split up into separate files: - San Andrés https://iptv-org.github.io/iptv/cities/cosac.m3u - Valle del Cauca https://iptv-org.github.io/iptv/subdivisions/co-vac.m3u - Cali https://iptv-org.github.io/iptv/cities/coclo.m3u +- 🇰🇲 Comoros https://iptv-org.github.io/iptv/countries/km.m3u - 🇨🇷 Costa Rica https://iptv-org.github.io/iptv/countries/cr.m3u - Cartago https://iptv-org.github.io/iptv/subdivisions/cr-c.m3u - Puntarenas https://iptv-org.github.io/iptv/subdivisions/cr-p.m3u @@ -705,6 +712,8 @@ Same thing, but split up into separate files: - 🇱🇹 Lithuania https://iptv-org.github.io/iptv/countries/lt.m3u - 🇱🇺 Luxembourg https://iptv-org.github.io/iptv/countries/lu.m3u - 🇲🇴 Macao https://iptv-org.github.io/iptv/countries/mo.m3u +- 🇲🇬 Madagascar https://iptv-org.github.io/iptv/countries/mg.m3u +- 🇲🇼 Malawi https://iptv-org.github.io/iptv/countries/mw.m3u - 🇲🇾 Malaysia https://iptv-org.github.io/iptv/countries/my.m3u - 🇲🇻 Maldives https://iptv-org.github.io/iptv/countries/mv.m3u - 🇲🇱 Mali https://iptv-org.github.io/iptv/countries/ml.m3u From 2ec68c501b4de48599fbc37aec21a8aba6bfa52d Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 21:45:39 +0200 Subject: [PATCH 13/51] Update us_moveonjoy.m3u --- streams/us_moveonjoy.m3u | 304 +++++++++++++++++++-------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index 873eed4a58..0f66f4a30f 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -1,305 +1,305 @@ #EXTM3U #EXTINF:-1 tvg-id="WOLODT1.us",ABC 25 Columbia -https://fl25.moveonjoy.com/ABC_EAST/index.m3u8 +https://fl17.moveonjoy.com/ABC_EAST/index.m3u8 #EXTINF:-1 tvg-id="ACCNetwork.us",ACCN (720p) -https://fl25.moveonjoy.com/ACC_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/ACC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AMC.us@East",AMC East (1080p) -https://fl25.moveonjoy.com/AMC_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AntennaTV.us",Antenna TV -https://fl25.moveonjoy.com/Antenna_TV/index.m3u8 +https://fl17.moveonjoy.com/Antenna_TV/index.m3u8 #EXTINF:-1 tvg-id="Aspire.us",Aspire -https://fl25.moveonjoy.com/Aspire/index.m3u8 +https://fl17.moveonjoy.com/Aspire/index.m3u8 #EXTINF:-1 tvg-id="AXSTV.us",AXS TV -https://fl25.moveonjoy.com/Axs_TV/index.m3u8 +https://fl17.moveonjoy.com/Axs_TV/index.m3u8 #EXTINF:-1 tvg-id="BBCAmerica.us@East",BBC America East -https://fl25.moveonjoy.com/BBC_AMERICA/index.m3u8 +https://fl17.moveonjoy.com/BBC_AMERICA/index.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk@NorthAmerica",BBC News North America -https://fl25.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 +https://fl17.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 #EXTINF:-1 tvg-id="beINSportsUSA.us",beIN Sports USA -http://fl25.moveonjoy.com/BEIN_SPORTS/index.m3u8 +http://fl17.moveonjoy.com/BEIN_SPORTS/index.m3u8 #EXTINF:-1 tvg-id="BET.us@East",BET East -https://fl25.moveonjoy.com/BET_EAST/index.m3u8 +https://fl17.moveonjoy.com/BET_EAST/index.m3u8 #EXTINF:-1 tvg-id="BETGospel.us",BET Gospel -https://fl25.moveonjoy.com/BET_GOSPEL/index.m3u8 +https://fl17.moveonjoy.com/BET_GOSPEL/index.m3u8 #EXTINF:-1 tvg-id="BETHer.us@East",BET Her East -https://fl25.moveonjoy.com/BET_HER/index.m3u8 +https://fl17.moveonjoy.com/BET_HER/index.m3u8 #EXTINF:-1 tvg-id="BETJams.us",BET Jams -https://fl25.moveonjoy.com/BET_Jams/index.m3u8 +https://fl17.moveonjoy.com/BET_Jams/index.m3u8 #EXTINF:-1 tvg-id="BETSoul.us",BET Soul -https://fl25.moveonjoy.com/BET_SOUL/index.m3u8 +https://fl17.moveonjoy.com/BET_SOUL/index.m3u8 #EXTINF:-1 tvg-id="BigTenNetwork.us",Big Ten Network -https://fl25.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="BloombergTV.us",Bloomberg TV -https://fl25.moveonjoy.com/BLOOMBERG/index.m3u8 +https://fl17.moveonjoy.com/BLOOMBERG/index.m3u8 #EXTINF:-1 tvg-id="Bounce.us",Bounce -https://fl25.moveonjoy.com/BOUNCE_TV/index.m3u8 +https://fl17.moveonjoy.com/BOUNCE_TV/index.m3u8 #EXTINF:-1 tvg-id="Bravo.us@East",Bravo East -https://fl25.moveonjoy.com/BRAVO/index.m3u8 +https://fl17.moveonjoy.com/BRAVO/index.m3u8 #EXTINF:-1 tvg-id="Buzzr.us",Buzzr -https://fl25.moveonjoy.com/Buzzr/index.m3u8 +https://fl17.moveonjoy.com/Buzzr/index.m3u8 #EXTINF:-1 tvg-id="CSPAN.us",C-SPAN -https://fl25.moveonjoy.com/C-SPAN/index.m3u8 +https://fl17.moveonjoy.com/C-SPAN/index.m3u8 #EXTINF:-1 tvg-id="CBS.us@East",CBS East (720p) -https://fl25.moveonjoy.com/CBS_News/index.m3u8 +https://fl17.moveonjoy.com/CBS_News/index.m3u8 #EXTINF:-1 tvg-id="CBSSportsNetworkUSA.us",CBS Sports Network USA -https://fl25.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="CHBLTV.ca",CHBL-TV -https://fl25.moveonjoy.com/CA_GLOBAL/index.m3u8 +https://fl17.moveonjoy.com/CA_GLOBAL/index.m3u8 #EXTINF:-1 tvg-id="CleoTV.us",Cleo TV (720p) -https://fl25.moveonjoy.com/Cleo_TV/index.m3u8 +https://fl17.moveonjoy.com/Cleo_TV/index.m3u8 #EXTINF:-1 tvg-id="CMT.us@East",CMT East -https://fl25.moveonjoy.com/CMT/index.m3u8 +https://fl17.moveonjoy.com/CMT/index.m3u8 #EXTINF:-1 tvg-id="CNBC.us",CNBC -https://fl25.moveonjoy.com/CNBC/index.m3u8 +https://fl17.moveonjoy.com/CNBC/index.m3u8 #EXTINF:-1 tvg-id="CNBCWorld.us",CNBC World -https://fl25.moveonjoy.com/CNBC_World/index.m3u8 +https://fl17.moveonjoy.com/CNBC_World/index.m3u8 #EXTINF:-1 tvg-id="ComedyCentral.us@East",Comedy Central East (720p) -https://fl25.moveonjoy.com/Comedy_Central/index.m3u8 +https://fl17.moveonjoy.com/Comedy_Central/index.m3u8 #EXTINF:-1 tvg-id="ComedyTV.us",Comedy TV -https://fl25.moveonjoy.com/Comedy_TV/index.m3u8 +https://fl17.moveonjoy.com/Comedy_TV/index.m3u8 #EXTINF:-1 tvg-id="Comet.us",Comet -https://fl25.moveonjoy.com/COMET/index.m3u8 +https://fl17.moveonjoy.com/COMET/index.m3u8 #EXTINF:-1 tvg-id="CourtTV.us",Court TV -https://fl25.moveonjoy.com/COURT_TV/index.m3u8 +https://fl17.moveonjoy.com/COURT_TV/index.m3u8 #EXTINF:-1 tvg-id="CoziTV.us",Cozi TV -https://fl25.moveonjoy.com/COZI_TV/index.m3u8 +https://fl17.moveonjoy.com/COZI_TV/index.m3u8 #EXTINF:-1 tvg-id="Crave1.ca",Crave 1 -https://fl25.moveonjoy.com/CRAVE_1/index.m3u8 +https://fl17.moveonjoy.com/CRAVE_1/index.m3u8 #EXTINF:-1 tvg-id="Crave2.ca",Crave 2 -https://fl25.moveonjoy.com/CRAVE_2/index.m3u8 +https://fl17.moveonjoy.com/CRAVE_2/index.m3u8 #EXTINF:-1 tvg-id="Crave3.ca",Crave 3 -https://fl25.moveonjoy.com/CRAVE_3/index.m3u8 +https://fl17.moveonjoy.com/CRAVE_3/index.m3u8 #EXTINF:-1 tvg-id="Crave4.ca",Crave 4 -https://fl25.moveonjoy.com/CRAVE_4/index.m3u8 +https://fl17.moveonjoy.com/CRAVE_4/index.m3u8 #EXTINF:-1 tvg-id="CrimePlusInvestigation.us@SD",Crime + Investigation -https://fl25.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 +https://fl17.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 #EXTINF:-1 tvg-id="CuriosityStream.us",CuriosityStream (720p) -https://fl25.moveonjoy.com/Curiosity_Stream/index.m3u8 +https://fl17.moveonjoy.com/Curiosity_Stream/index.m3u8 #EXTINF:-1 tvg-id="CVMTV.jm@SD",CVM TV -https://fl25.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 +https://fl17.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="DisneyChannel.us@East",Disney Channel East -https://fl25.moveonjoy.com/DISNEY/index.m3u8 +https://fl17.moveonjoy.com/DISNEY/index.m3u8 #EXTINF:-1 tvg-id="DisneyJunior.us@East",Disney Junior East -https://fl25.moveonjoy.com/DISNEY_JR/index.m3u8 +https://fl17.moveonjoy.com/DISNEY_JR/index.m3u8 #EXTINF:-1 tvg-id="DisneyXD.us@East",Disney XD (720p) -http://fl25.moveonjoy.com/DISNEY_XD/index.m3u8 +http://fl17.moveonjoy.com/DISNEY_XD/index.m3u8 #EXTINF:-1 tvg-id="E.us@East",E! East -https://fl25.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 +https://fl17.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 #EXTINF:-1 tvg-id="ESPNU.us",ESPN U (720p) -https://fl25.moveonjoy.com/ESPN_U/index.m3u8 +https://fl17.moveonjoy.com/ESPN_U/index.m3u8 #EXTINF:-1 tvg-id="ESPNews.us",ESPNews (720p) -https://fl25.moveonjoy.com/ESPN_NEWS/index.m3u8 +https://fl17.moveonjoy.com/ESPN_NEWS/index.m3u8 #EXTINF:-1 tvg-id="FanDuelSportsNetwork.us",FanDuel Sports Network -https://fl25.moveonjoy.com/PAC_12/index.m3u8 +https://fl17.moveonjoy.com/PAC_12/index.m3u8 #EXTINF:-1 tvg-id="FanDuelTV.us",FanDuel TV -https://fl25.moveonjoy.com/TVG/index.m3u8 +https://fl17.moveonjoy.com/TVG/index.m3u8 #EXTINF:-1 tvg-id="FoxBusinessNetwork.us",Fox Business Network (720p) -https://fl25.moveonjoy.com/FOX_Business_Network/index.m3u8 +https://fl17.moveonjoy.com/FOX_Business_Network/index.m3u8 #EXTINF:-1 tvg-id="FoxNewsChannel.us",Fox News Channel (720p) -https://fl25.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="FoxSoul.us",Fox Soul -https://fl25.moveonjoy.com/FOX_SOUL/index.m3u8 +https://fl17.moveonjoy.com/FOX_SOUL/index.m3u8 #EXTINF:-1 tvg-id="",Fox Sports 1 -https://fl25.moveonjoy.com/FOX_Sports_1/index.m3u8 +https://fl17.moveonjoy.com/FOX_Sports_1/index.m3u8 #EXTINF:-1 tvg-id="Freeform.us@East",Free form East -https://fl25.moveonjoy.com/FREE_FORM/index.m3u8 +https://fl17.moveonjoy.com/FREE_FORM/index.m3u8 #EXTINF:-1 tvg-id="Fuse.us@East",Fuse East (720p) -https://fl25.moveonjoy.com/FUSE/index.m3u8 +https://fl17.moveonjoy.com/FUSE/index.m3u8 #EXTINF:-1 tvg-id="FX.us@East",FX East -https://fl25.moveonjoy.com/FX/index.m3u8 +https://fl17.moveonjoy.com/FX/index.m3u8 #EXTINF:-1 tvg-id="FXM.us@East",FXM East -https://fl25.moveonjoy.com/FX_MOVIE/index.m3u8 +https://fl17.moveonjoy.com/FX_MOVIE/index.m3u8 #EXTINF:-1 tvg-id="FXX.us@East",FXX East -https://fl25.moveonjoy.com/FXX/index.m3u8 +https://fl17.moveonjoy.com/FXX/index.m3u8 #EXTINF:-1 tvg-id="FYI.us@East",FYI East -https://fl25.moveonjoy.com/FYI/index.m3u8 +https://fl17.moveonjoy.com/FYI/index.m3u8 #EXTINF:-1 tvg-id="GetTV.us",GetTV (480p) -https://fl25.moveonjoy.com/GET_TV/index.m3u8 +https://fl17.moveonjoy.com/GET_TV/index.m3u8 #EXTINF:-1 tvg-id="GolfChannel.us@SD",Golf Channel -https://fl25.moveonjoy.com/GOLF/index.m3u8 +https://fl17.moveonjoy.com/GOLF/index.m3u8 #EXTINF:-1 tvg-id="",Great American Country -https://fl25.moveonjoy.com/Great_American_Country/index.m3u8 +https://fl17.moveonjoy.com/Great_American_Country/index.m3u8 #EXTINF:-1 tvg-id="Grit.us",Grit -https://fl25.moveonjoy.com/GRIT_TV/index.m3u8 +https://fl17.moveonjoy.com/GRIT_TV/index.m3u8 #EXTINF:-1 tvg-id="HallmarkChannel.us@East",Hallmark Channel East -https://fl25.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="HallmarkDrama.us",Hallmark Drama (720p) -https://fl25.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 +https://fl17.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 #EXTINF:-1 tvg-id="HallmarkMoviesMysteries.us@East",Hallmark Movies Mysteries East -https://fl25.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 +https://fl17.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 #EXTINF:-1 tvg-id="History.us@East",History -https://fl25.moveonjoy.com/history_channel/index.m3u8 +https://fl17.moveonjoy.com/history_channel/index.m3u8 #EXTINF:-1 tvg-id="HSN.us",HSN -https://fl25.moveonjoy.com/HSN/index.m3u8 +https://fl17.moveonjoy.com/HSN/index.m3u8 #EXTINF:-1 tvg-id="INSP.us",INSP -https://fl25.moveonjoy.com/INSP/index.m3u8 +https://fl17.moveonjoy.com/INSP/index.m3u8 #EXTINF:-1 tvg-id="IONPlus.us@East",ION Plus East (720p) -https://fl25.moveonjoy.com/ION_Plus/index.m3u8 +https://fl17.moveonjoy.com/ION_Plus/index.m3u8 #EXTINF:-1 tvg-id="IONTV.us@East",ION TV East -https://fl25.moveonjoy.com/ION_TV/index.m3u8 +https://fl17.moveonjoy.com/ION_TV/index.m3u8 #EXTINF:-1 tvg-id="Lifetime.us@East",Lifetime East -https://fl25.moveonjoy.com/LIFETIME/index.m3u8 +https://fl17.moveonjoy.com/LIFETIME/index.m3u8 #EXTINF:-1 tvg-id="LifetimeMovies.us@East",Lifetime Movies East -https://fl25.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="LoveNature.ca",Love Nature -https://fl25.moveonjoy.com/LOVE_NATURE/index.m3u8 +https://fl17.moveonjoy.com/LOVE_NATURE/index.m3u8 #EXTINF:-1 tvg-id="",MAV TV (720p) -https://fl25.moveonjoy.com/MAV_TV/index.m3u8 +https://fl17.moveonjoy.com/MAV_TV/index.m3u8 #EXTINF:-1 tvg-id="MeTV.us",MeTV -https://fl25.moveonjoy.com/ME_TV/index.m3u8 +https://fl17.moveonjoy.com/ME_TV/index.m3u8 #EXTINF:-1 tvg-id="MGMPlus.us@East",MGM+ East -https://fl25.moveonjoy.com/EPIX/index.m3u8 +https://fl17.moveonjoy.com/EPIX/index.m3u8 #EXTINF:-1 tvg-id="MGMPlusMarquee.us",MGM+ Marquee -https://fl25.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 +https://fl17.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 #EXTINF:-1 tvg-id="MilitaryHistory.us",Military History -https://fl25.moveonjoy.com/Military_History/index.m3u8 +https://fl17.moveonjoy.com/Military_History/index.m3u8 #EXTINF:-1 tvg-id="MLBNetwork.us",MLB Network -https://fl25.moveonjoy.com/MLB_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/MLB_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="MSG.us",MSG -https://fl25.moveonjoy.com/MSG/index.m3u8 +https://fl17.moveonjoy.com/MSG/index.m3u8 #EXTINF:-1 tvg-id="MTV2.us@East",MTV2 (720p) -https://fl25.moveonjoy.com/MTV_2/index.m3u8 +https://fl17.moveonjoy.com/MTV_2/index.m3u8 #EXTINF:-1 tvg-id="MTVClassic.us@East",MTV Classic (360p) -https://fl25.moveonjoy.com/MTV_CLASSIC/index.m3u8 +https://fl17.moveonjoy.com/MTV_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="MTV.us@East",MTV East -https://fl25.moveonjoy.com/MTV/index.m3u8 +https://fl17.moveonjoy.com/MTV/index.m3u8 #EXTINF:-1 tvg-id="MTVLive.us",MTV Live (720p) -https://fl25.moveonjoy.com/MTV_LIVE/index.m3u8 +https://fl17.moveonjoy.com/MTV_LIVE/index.m3u8 #EXTINF:-1 tvg-id="MTVU.us",mtvU (480p) -https://fl25.moveonjoy.com/MTV_U/index.m3u8 +https://fl17.moveonjoy.com/MTV_U/index.m3u8 #EXTINF:-1 tvg-id="Much.ca",Much (720p) -https://fl25.moveonjoy.com/MUCH/index.m3u8 +https://fl17.moveonjoy.com/MUCH/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographic.us@East",National Geographic East -https://fl25.moveonjoy.com/National_Geographic/index.m3u8 +https://fl17.moveonjoy.com/National_Geographic/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographicWild.us@East",National Geographic Wild East -https://fl25.moveonjoy.com/Nat_Geo_Wild/index.m3u8 +https://fl17.moveonjoy.com/Nat_Geo_Wild/index.m3u8 #EXTINF:-1 tvg-id="NBATV.us",NBA TV -https://fl25.moveonjoy.com/NBA_TV/index.m3u8 +https://fl17.moveonjoy.com/NBA_TV/index.m3u8 #EXTINF:-1 tvg-id="NewsNation.us@East",News Nation (720p) -https://fl25.moveonjoy.com/NEWS_NATION/index.m3u8 +https://fl17.moveonjoy.com/NEWS_NATION/index.m3u8 #EXTINF:-1 tvg-id="NFLNetwork.us",NFL Network -https://fl25.moveonjoy.com/NFL_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/NFL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NFLRedZone.us",NFL RedZone -https://fl25.moveonjoy.com/NFL_RedZone/index.m3u8 +https://fl17.moveonjoy.com/NFL_RedZone/index.m3u8 #EXTINF:-1 tvg-id="NHLNetwork.us",NHL Network (720p) -https://fl25.moveonjoy.com/NHL_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/NHL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NickJr.us@East",Nick Jr. East (720p) -https://fl25.moveonjoy.com/NICK_JR/index.m3u8 +https://fl17.moveonjoy.com/NICK_JR/index.m3u8 #EXTINF:-1 tvg-id="NickMusic.us",Nick Music (720p) -https://fl25.moveonjoy.com/NICK_MUSIC/index.m3u8 +https://fl17.moveonjoy.com/NICK_MUSIC/index.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.us@East",Nickelodeon East -https://fl25.moveonjoy.com/NICKELODEON/index.m3u8 +https://fl17.moveonjoy.com/NICKELODEON/index.m3u8 #EXTINF:-1 tvg-id="Nicktoons.us@East",Nicktoons East -https://fl25.moveonjoy.com/NICKTOONS/index.m3u8 +https://fl17.moveonjoy.com/NICKTOONS/index.m3u8 #EXTINF:-1 tvg-id="OutdoorChannel.us",Outdoor Channel -https://fl25.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="OuterMax.us@East",OuterMax East (720p) -https://fl25.moveonjoy.com/OUTER_MAX/index.m3u8 +https://fl17.moveonjoy.com/OUTER_MAX/index.m3u8 #EXTINF:-1 tvg-id="OutsideTV.us",Outside TV -https://fl25.moveonjoy.com/OUTSIDE_TV/index.m3u8 +https://fl17.moveonjoy.com/OUTSIDE_TV/index.m3u8 #EXTINF:-1 tvg-id="Ovation.us",Ovation (1080p) -https://fl25.moveonjoy.com/Ovation/index.m3u8 +https://fl17.moveonjoy.com/Ovation/index.m3u8 #EXTINF:-1 tvg-id="Oxygen.us@East",Oxygen East -https://fl25.moveonjoy.com/OXYGEN/index.m3u8 +https://fl17.moveonjoy.com/OXYGEN/index.m3u8 #EXTINF:-1 tvg-id="ParamountNetwork.us@East",Paramount Network East -https://fl25.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="PopTV.us",Pop TV -https://fl25.moveonjoy.com/Pop_TV/index.m3u8 +https://fl17.moveonjoy.com/Pop_TV/index.m3u8 #EXTINF:-1 tvg-id="PursuitChannel.us",Pursuit Channel (720p) -https://fl25.moveonjoy.com/Pursuit_Channel/index.m3u8 +https://fl17.moveonjoy.com/Pursuit_Channel/index.m3u8 #EXTINF:-1 tvg-id="QVC.us",QVC (720p) -https://fl25.moveonjoy.com/QVC/index.m3u8 +https://fl17.moveonjoy.com/QVC/index.m3u8 #EXTINF:-1 tvg-id="Reelz.us",Reelz (720p) -https://fl25.moveonjoy.com/REELZ/index.m3u8 +https://fl17.moveonjoy.com/REELZ/index.m3u8 #EXTINF:-1 tvg-id="Revolt.us",Revolt -https://fl25.moveonjoy.com/REVOLT/index.m3u8 +https://fl17.moveonjoy.com/REVOLT/index.m3u8 #EXTINF:-1 tvg-id="Showtime2.us@East",Showtime 2 East -https://fl25.moveonjoy.com/SHOWTIME_2/index.m3u8 +https://fl17.moveonjoy.com/SHOWTIME_2/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@East",Showtime East -https://fl25.moveonjoy.com/SHOWTIME/index.m3u8 +https://fl17.moveonjoy.com/SHOWTIME/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeNext.us@East",Showtime Next East -https://fl25.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 +https://fl17.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@West",Showtime West (1080p) -https://fl25.moveonjoy.com/SHOWTIME_WEST/index.m3u8 +https://fl17.moveonjoy.com/SHOWTIME_WEST/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeWomen.us@East",Showtime Women East -https://fl25.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 +https://fl17.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 #EXTINF:-1 tvg-id="SmithsonianChannel.us@East",Smithsonian Channel East -https://fl25.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SonyChannel.mx",Sony Channel -https://fl25.moveonjoy.com/Sony_Movie_Channel/index.m3u8 +https://fl17.moveonjoy.com/Sony_Movie_Channel/index.m3u8 #EXTINF:-1 tvg-id="SportsmanChannel.us",Sportsman Channel -https://fl25.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SportsNetNewYork.us",SportsNet New York (540p) -https://fl25.moveonjoy.com/SNY/index.m3u8 +https://fl17.moveonjoy.com/SNY/index.m3u8 #EXTINF:-1 tvg-id="StartTV.us",Start TV -https://fl25.moveonjoy.com/Start_Tv/index.m3u8 +https://fl17.moveonjoy.com/Start_Tv/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@East",Starz East -https://fl25.moveonjoy.com/STARZ/index.m3u8 +https://fl17.moveonjoy.com/STARZ/index.m3u8 #EXTINF:-1 tvg-id="StarzEncoreClassic.us@East",Starz Encore Classic East -https://fl25.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 +https://fl17.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@West",Starz West -https://fl25.moveonjoy.com/STARZ_WEST/index.m3u8 +https://fl17.moveonjoy.com/STARZ_WEST/index.m3u8 #EXTINF:-1 tvg-id="StoriesbyAMC.us@EastHD",Stories by AMC (1080p) -http://fl25.moveonjoy.com/AMC_NETWORK/index.m3u8 +http://fl17.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="SundanceTV.us@East",Sundance TV East -https://fl25.moveonjoy.com/SUNDANCE/index.m3u8 +https://fl17.moveonjoy.com/SUNDANCE/index.m3u8 #EXTINF:-1 tvg-id="Syfy.us@East",Syfy East -https://fl25.moveonjoy.com/SYFY/index.m3u8 +https://fl17.moveonjoy.com/SYFY/index.m3u8 #EXTINF:-1 tvg-id="TeenNick.us",TeenNick -https://fl25.moveonjoy.com/Teen_Nick/index.m3u8 +https://fl17.moveonjoy.com/Teen_Nick/index.m3u8 #EXTINF:-1 tvg-id="TennisChannel.us",Tennis Channel -https://fl25.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 +https://fl17.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="TheCowboyChannel.us",The Cowboy Channel -https://fl25.moveonjoy.com/Cowboy_Channel/index.m3u8 +https://fl17.moveonjoy.com/Cowboy_Channel/index.m3u8 #EXTINF:-1 tvg-id="TSN1.ca",TSN1 (1080p) -https://fl25.moveonjoy.com/TSN_1/index.m3u8 +https://fl17.moveonjoy.com/TSN_1/index.m3u8 #EXTINF:-1 tvg-id="TSN2.ca",TSN2 -https://fl25.moveonjoy.com/TSN_2/index.m3u8 +https://fl17.moveonjoy.com/TSN_2/index.m3u8 #EXTINF:-1 tvg-id="TSN3.ca",TSN3 -https://fl25.moveonjoy.com/TSN_3/index.m3u8 +https://fl17.moveonjoy.com/TSN_3/index.m3u8 #EXTINF:-1 tvg-id="TSN4.ca",TSN4 -https://fl25.moveonjoy.com/TSN_4/index.m3u8 +https://fl17.moveonjoy.com/TSN_4/index.m3u8 #EXTINF:-1 tvg-id="TSN5.ca",TSN5 -https://fl25.moveonjoy.com/TSN_5/index.m3u8 +https://fl17.moveonjoy.com/TSN_5/index.m3u8 #EXTINF:-1 tvg-id="TVLand.us@East",TV Land -https://fl25.moveonjoy.com/TV_LAND/index.m3u8 +https://fl17.moveonjoy.com/TV_LAND/index.m3u8 #EXTINF:-1 tvg-id="TVOne.us",TV One -https://fl25.moveonjoy.com/TV_ONE/index.m3u8 +https://fl17.moveonjoy.com/TV_ONE/index.m3u8 #EXTINF:-1 tvg-id="TVJ.jm",TVJ (720p) -https://fl25.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 +https://fl17.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="UpTV.us",Up TV (1080p) -https://fl25.moveonjoy.com/Up_Tv/index.m3u8 +https://fl17.moveonjoy.com/Up_Tv/index.m3u8 #EXTINF:-1 tvg-id="USANetwork.us@East",USA Network (720p) -http://fl25.moveonjoy.com/USA_NETWORK/index.m3u8 +http://fl17.moveonjoy.com/USA_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="VH1.us@East",VH1 East -https://fl25.moveonjoy.com/VH1/index.m3u8 +https://fl17.moveonjoy.com/VH1/index.m3u8 #EXTINF:-1 tvg-id="VICETV.us",VICE TV (720p) -https://fl25.moveonjoy.com/VICELAND/index.m3u8 +https://fl17.moveonjoy.com/VICELAND/index.m3u8 #EXTINF:-1 tvg-id="WNetwork.ca@East",W Network (720p) -https://fl25.moveonjoy.com/W_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/W_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WeTV.us@East",We TV East -https://fl25.moveonjoy.com/WE_TV/index.m3u8 +https://fl17.moveonjoy.com/WE_TV/index.m3u8 #EXTINF:-1 tvg-id="WFLADT1.us@SD",WFLA-DT1 -https://fl25.moveonjoy.com/FL_Tampa_NBC/index.m3u8 +https://fl17.moveonjoy.com/FL_Tampa_NBC/index.m3u8 #EXTINF:-1 tvg-id="WFLXDT1.us@SD",WFLX-DT1 -https://fl25.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 +https://fl17.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 #EXTINF:-1 tvg-id="WFTSDT1.us@SD",WFTS-DT1 -https://fl25.moveonjoy.com/FL_Tampa_ABC/index.m3u8 +https://fl17.moveonjoy.com/FL_Tampa_ABC/index.m3u8 #EXTINF:-1 tvg-id="WGNDT1.us",WGN-DT1 (720p) -https://fl25.moveonjoy.com/WGN/index.m3u8 +https://fl17.moveonjoy.com/WGN/index.m3u8 #EXTINF:-1 tvg-id="Willow.us",Willow -https://fl25.moveonjoy.com/WILLOW_CRICKET/index.m3u8 +https://fl17.moveonjoy.com/WILLOW_CRICKET/index.m3u8 #EXTINF:-1 tvg-id="WKCFDT1.us@SD",WKCF-DT1 -https://fl25.moveonjoy.com/CW_ORLANDO/index.m3u8 +https://fl17.moveonjoy.com/CW_ORLANDO/index.m3u8 #EXTINF:-1 tvg-id="WNBCDT1.us",WNBC-DT1 -https://fl25.moveonjoy.com/NBC_EAST/index.m3u8 +https://fl17.moveonjoy.com/NBC_EAST/index.m3u8 #EXTINF:-1 tvg-id="WorldFishingNetwork.us",World Fishing Network -https://fl25.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WPECDT1.us@SD",WPEC-DT1 -https://fl25.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 +https://fl17.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 #EXTINF:-1 tvg-id="WTOGDT1.us@SD",WTOG-DT1 -https://fl25.moveonjoy.com/FL_Tampa_CW44/index.m3u8 +https://fl17.moveonjoy.com/FL_Tampa_CW44/index.m3u8 #EXTINF:-1 tvg-id="WVGNLD1.vi@SD",WVGN-LD1 -https://fl25.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 +https://fl17.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 #EXTINF:-1 tvg-id="YesNetwork.us",Yes Network -https://fl25.moveonjoy.com/YES_NETWORK/index.m3u8 +https://fl17.moveonjoy.com/YES_NETWORK/index.m3u8 From 4cd5b18a938f91eba37a19fc8fea1da3216526cf Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 21:52:26 +0200 Subject: [PATCH 14/51] Update us_moveonjoy.m3u --- streams/us_moveonjoy.m3u | 304 +++++++++++++++++++-------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index 0f66f4a30f..db44891ce1 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -1,305 +1,305 @@ #EXTM3U #EXTINF:-1 tvg-id="WOLODT1.us",ABC 25 Columbia -https://fl17.moveonjoy.com/ABC_EAST/index.m3u8 +https://fl7.moveonjoy.com/ABC_EAST/index.m3u8 #EXTINF:-1 tvg-id="ACCNetwork.us",ACCN (720p) -https://fl17.moveonjoy.com/ACC_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/ACC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AMC.us@East",AMC East (1080p) -https://fl17.moveonjoy.com/AMC_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AntennaTV.us",Antenna TV -https://fl17.moveonjoy.com/Antenna_TV/index.m3u8 +https://fl7.moveonjoy.com/Antenna_TV/index.m3u8 #EXTINF:-1 tvg-id="Aspire.us",Aspire -https://fl17.moveonjoy.com/Aspire/index.m3u8 +https://fl7.moveonjoy.com/Aspire/index.m3u8 #EXTINF:-1 tvg-id="AXSTV.us",AXS TV -https://fl17.moveonjoy.com/Axs_TV/index.m3u8 +https://fl7.moveonjoy.com/Axs_TV/index.m3u8 #EXTINF:-1 tvg-id="BBCAmerica.us@East",BBC America East -https://fl17.moveonjoy.com/BBC_AMERICA/index.m3u8 +https://fl7.moveonjoy.com/BBC_AMERICA/index.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk@NorthAmerica",BBC News North America -https://fl17.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 +https://fl7.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 #EXTINF:-1 tvg-id="beINSportsUSA.us",beIN Sports USA -http://fl17.moveonjoy.com/BEIN_SPORTS/index.m3u8 +http://fl7.moveonjoy.com/BEIN_SPORTS/index.m3u8 #EXTINF:-1 tvg-id="BET.us@East",BET East -https://fl17.moveonjoy.com/BET_EAST/index.m3u8 +https://fl7.moveonjoy.com/BET_EAST/index.m3u8 #EXTINF:-1 tvg-id="BETGospel.us",BET Gospel -https://fl17.moveonjoy.com/BET_GOSPEL/index.m3u8 +https://fl7.moveonjoy.com/BET_GOSPEL/index.m3u8 #EXTINF:-1 tvg-id="BETHer.us@East",BET Her East -https://fl17.moveonjoy.com/BET_HER/index.m3u8 +https://fl7.moveonjoy.com/BET_HER/index.m3u8 #EXTINF:-1 tvg-id="BETJams.us",BET Jams -https://fl17.moveonjoy.com/BET_Jams/index.m3u8 +https://fl7.moveonjoy.com/BET_Jams/index.m3u8 #EXTINF:-1 tvg-id="BETSoul.us",BET Soul -https://fl17.moveonjoy.com/BET_SOUL/index.m3u8 +https://fl7.moveonjoy.com/BET_SOUL/index.m3u8 #EXTINF:-1 tvg-id="BigTenNetwork.us",Big Ten Network -https://fl17.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="BloombergTV.us",Bloomberg TV -https://fl17.moveonjoy.com/BLOOMBERG/index.m3u8 +https://fl7.moveonjoy.com/BLOOMBERG/index.m3u8 #EXTINF:-1 tvg-id="Bounce.us",Bounce -https://fl17.moveonjoy.com/BOUNCE_TV/index.m3u8 +https://fl7.moveonjoy.com/BOUNCE_TV/index.m3u8 #EXTINF:-1 tvg-id="Bravo.us@East",Bravo East -https://fl17.moveonjoy.com/BRAVO/index.m3u8 +https://fl7.moveonjoy.com/BRAVO/index.m3u8 #EXTINF:-1 tvg-id="Buzzr.us",Buzzr -https://fl17.moveonjoy.com/Buzzr/index.m3u8 +https://fl7.moveonjoy.com/Buzzr/index.m3u8 #EXTINF:-1 tvg-id="CSPAN.us",C-SPAN -https://fl17.moveonjoy.com/C-SPAN/index.m3u8 +https://fl7.moveonjoy.com/C-SPAN/index.m3u8 #EXTINF:-1 tvg-id="CBS.us@East",CBS East (720p) -https://fl17.moveonjoy.com/CBS_News/index.m3u8 +https://fl7.moveonjoy.com/CBS_News/index.m3u8 #EXTINF:-1 tvg-id="CBSSportsNetworkUSA.us",CBS Sports Network USA -https://fl17.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="CHBLTV.ca",CHBL-TV -https://fl17.moveonjoy.com/CA_GLOBAL/index.m3u8 +https://fl7.moveonjoy.com/CA_GLOBAL/index.m3u8 #EXTINF:-1 tvg-id="CleoTV.us",Cleo TV (720p) -https://fl17.moveonjoy.com/Cleo_TV/index.m3u8 +https://fl7.moveonjoy.com/Cleo_TV/index.m3u8 #EXTINF:-1 tvg-id="CMT.us@East",CMT East -https://fl17.moveonjoy.com/CMT/index.m3u8 +https://fl7.moveonjoy.com/CMT/index.m3u8 #EXTINF:-1 tvg-id="CNBC.us",CNBC -https://fl17.moveonjoy.com/CNBC/index.m3u8 +https://fl7.moveonjoy.com/CNBC/index.m3u8 #EXTINF:-1 tvg-id="CNBCWorld.us",CNBC World -https://fl17.moveonjoy.com/CNBC_World/index.m3u8 +https://fl7.moveonjoy.com/CNBC_World/index.m3u8 #EXTINF:-1 tvg-id="ComedyCentral.us@East",Comedy Central East (720p) -https://fl17.moveonjoy.com/Comedy_Central/index.m3u8 +https://fl7.moveonjoy.com/Comedy_Central/index.m3u8 #EXTINF:-1 tvg-id="ComedyTV.us",Comedy TV -https://fl17.moveonjoy.com/Comedy_TV/index.m3u8 +https://fl7.moveonjoy.com/Comedy_TV/index.m3u8 #EXTINF:-1 tvg-id="Comet.us",Comet -https://fl17.moveonjoy.com/COMET/index.m3u8 +https://fl7.moveonjoy.com/COMET/index.m3u8 #EXTINF:-1 tvg-id="CourtTV.us",Court TV -https://fl17.moveonjoy.com/COURT_TV/index.m3u8 +https://fl7.moveonjoy.com/COURT_TV/index.m3u8 #EXTINF:-1 tvg-id="CoziTV.us",Cozi TV -https://fl17.moveonjoy.com/COZI_TV/index.m3u8 +https://fl7.moveonjoy.com/COZI_TV/index.m3u8 #EXTINF:-1 tvg-id="Crave1.ca",Crave 1 -https://fl17.moveonjoy.com/CRAVE_1/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_1/index.m3u8 #EXTINF:-1 tvg-id="Crave2.ca",Crave 2 -https://fl17.moveonjoy.com/CRAVE_2/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_2/index.m3u8 #EXTINF:-1 tvg-id="Crave3.ca",Crave 3 -https://fl17.moveonjoy.com/CRAVE_3/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_3/index.m3u8 #EXTINF:-1 tvg-id="Crave4.ca",Crave 4 -https://fl17.moveonjoy.com/CRAVE_4/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_4/index.m3u8 #EXTINF:-1 tvg-id="CrimePlusInvestigation.us@SD",Crime + Investigation -https://fl17.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 +https://fl7.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 #EXTINF:-1 tvg-id="CuriosityStream.us",CuriosityStream (720p) -https://fl17.moveonjoy.com/Curiosity_Stream/index.m3u8 +https://fl7.moveonjoy.com/Curiosity_Stream/index.m3u8 #EXTINF:-1 tvg-id="CVMTV.jm@SD",CVM TV -https://fl17.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 +https://fl7.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="DisneyChannel.us@East",Disney Channel East -https://fl17.moveonjoy.com/DISNEY/index.m3u8 +https://fl7.moveonjoy.com/DISNEY/index.m3u8 #EXTINF:-1 tvg-id="DisneyJunior.us@East",Disney Junior East -https://fl17.moveonjoy.com/DISNEY_JR/index.m3u8 +https://fl7.moveonjoy.com/DISNEY_JR/index.m3u8 #EXTINF:-1 tvg-id="DisneyXD.us@East",Disney XD (720p) -http://fl17.moveonjoy.com/DISNEY_XD/index.m3u8 +http://fl7.moveonjoy.com/DISNEY_XD/index.m3u8 #EXTINF:-1 tvg-id="E.us@East",E! East -https://fl17.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 +https://fl7.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 #EXTINF:-1 tvg-id="ESPNU.us",ESPN U (720p) -https://fl17.moveonjoy.com/ESPN_U/index.m3u8 +https://fl7.moveonjoy.com/ESPN_U/index.m3u8 #EXTINF:-1 tvg-id="ESPNews.us",ESPNews (720p) -https://fl17.moveonjoy.com/ESPN_NEWS/index.m3u8 +https://fl7.moveonjoy.com/ESPN_NEWS/index.m3u8 #EXTINF:-1 tvg-id="FanDuelSportsNetwork.us",FanDuel Sports Network -https://fl17.moveonjoy.com/PAC_12/index.m3u8 +https://fl7.moveonjoy.com/PAC_12/index.m3u8 #EXTINF:-1 tvg-id="FanDuelTV.us",FanDuel TV -https://fl17.moveonjoy.com/TVG/index.m3u8 +https://fl7.moveonjoy.com/TVG/index.m3u8 #EXTINF:-1 tvg-id="FoxBusinessNetwork.us",Fox Business Network (720p) -https://fl17.moveonjoy.com/FOX_Business_Network/index.m3u8 +https://fl7.moveonjoy.com/FOX_Business_Network/index.m3u8 #EXTINF:-1 tvg-id="FoxNewsChannel.us",Fox News Channel (720p) -https://fl17.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="FoxSoul.us",Fox Soul -https://fl17.moveonjoy.com/FOX_SOUL/index.m3u8 +https://fl7.moveonjoy.com/FOX_SOUL/index.m3u8 #EXTINF:-1 tvg-id="",Fox Sports 1 -https://fl17.moveonjoy.com/FOX_Sports_1/index.m3u8 +https://fl7.moveonjoy.com/FOX_Sports_1/index.m3u8 #EXTINF:-1 tvg-id="Freeform.us@East",Free form East -https://fl17.moveonjoy.com/FREE_FORM/index.m3u8 +https://fl7.moveonjoy.com/FREE_FORM/index.m3u8 #EXTINF:-1 tvg-id="Fuse.us@East",Fuse East (720p) -https://fl17.moveonjoy.com/FUSE/index.m3u8 +https://fl7.moveonjoy.com/FUSE/index.m3u8 #EXTINF:-1 tvg-id="FX.us@East",FX East -https://fl17.moveonjoy.com/FX/index.m3u8 +https://fl7.moveonjoy.com/FX/index.m3u8 #EXTINF:-1 tvg-id="FXM.us@East",FXM East -https://fl17.moveonjoy.com/FX_MOVIE/index.m3u8 +https://fl7.moveonjoy.com/FX_MOVIE/index.m3u8 #EXTINF:-1 tvg-id="FXX.us@East",FXX East -https://fl17.moveonjoy.com/FXX/index.m3u8 +https://fl7.moveonjoy.com/FXX/index.m3u8 #EXTINF:-1 tvg-id="FYI.us@East",FYI East -https://fl17.moveonjoy.com/FYI/index.m3u8 +https://fl7.moveonjoy.com/FYI/index.m3u8 #EXTINF:-1 tvg-id="GetTV.us",GetTV (480p) -https://fl17.moveonjoy.com/GET_TV/index.m3u8 +https://fl7.moveonjoy.com/GET_TV/index.m3u8 #EXTINF:-1 tvg-id="GolfChannel.us@SD",Golf Channel -https://fl17.moveonjoy.com/GOLF/index.m3u8 +https://fl7.moveonjoy.com/GOLF/index.m3u8 #EXTINF:-1 tvg-id="",Great American Country -https://fl17.moveonjoy.com/Great_American_Country/index.m3u8 +https://fl7.moveonjoy.com/Great_American_Country/index.m3u8 #EXTINF:-1 tvg-id="Grit.us",Grit -https://fl17.moveonjoy.com/GRIT_TV/index.m3u8 +https://fl7.moveonjoy.com/GRIT_TV/index.m3u8 #EXTINF:-1 tvg-id="HallmarkChannel.us@East",Hallmark Channel East -https://fl17.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="HallmarkDrama.us",Hallmark Drama (720p) -https://fl17.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 #EXTINF:-1 tvg-id="HallmarkMoviesMysteries.us@East",Hallmark Movies Mysteries East -https://fl17.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 #EXTINF:-1 tvg-id="History.us@East",History -https://fl17.moveonjoy.com/history_channel/index.m3u8 +https://fl7.moveonjoy.com/history_channel/index.m3u8 #EXTINF:-1 tvg-id="HSN.us",HSN -https://fl17.moveonjoy.com/HSN/index.m3u8 +https://fl7.moveonjoy.com/HSN/index.m3u8 #EXTINF:-1 tvg-id="INSP.us",INSP -https://fl17.moveonjoy.com/INSP/index.m3u8 +https://fl7.moveonjoy.com/INSP/index.m3u8 #EXTINF:-1 tvg-id="IONPlus.us@East",ION Plus East (720p) -https://fl17.moveonjoy.com/ION_Plus/index.m3u8 +https://fl7.moveonjoy.com/ION_Plus/index.m3u8 #EXTINF:-1 tvg-id="IONTV.us@East",ION TV East -https://fl17.moveonjoy.com/ION_TV/index.m3u8 +https://fl7.moveonjoy.com/ION_TV/index.m3u8 #EXTINF:-1 tvg-id="Lifetime.us@East",Lifetime East -https://fl17.moveonjoy.com/LIFETIME/index.m3u8 +https://fl7.moveonjoy.com/LIFETIME/index.m3u8 #EXTINF:-1 tvg-id="LifetimeMovies.us@East",Lifetime Movies East -https://fl17.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="LoveNature.ca",Love Nature -https://fl17.moveonjoy.com/LOVE_NATURE/index.m3u8 +https://fl7.moveonjoy.com/LOVE_NATURE/index.m3u8 #EXTINF:-1 tvg-id="",MAV TV (720p) -https://fl17.moveonjoy.com/MAV_TV/index.m3u8 +https://fl7.moveonjoy.com/MAV_TV/index.m3u8 #EXTINF:-1 tvg-id="MeTV.us",MeTV -https://fl17.moveonjoy.com/ME_TV/index.m3u8 +https://fl7.moveonjoy.com/ME_TV/index.m3u8 #EXTINF:-1 tvg-id="MGMPlus.us@East",MGM+ East -https://fl17.moveonjoy.com/EPIX/index.m3u8 +https://fl7.moveonjoy.com/EPIX/index.m3u8 #EXTINF:-1 tvg-id="MGMPlusMarquee.us",MGM+ Marquee -https://fl17.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 +https://fl7.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 #EXTINF:-1 tvg-id="MilitaryHistory.us",Military History -https://fl17.moveonjoy.com/Military_History/index.m3u8 +https://fl7.moveonjoy.com/Military_History/index.m3u8 #EXTINF:-1 tvg-id="MLBNetwork.us",MLB Network -https://fl17.moveonjoy.com/MLB_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/MLB_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="MSG.us",MSG -https://fl17.moveonjoy.com/MSG/index.m3u8 +https://fl7.moveonjoy.com/MSG/index.m3u8 #EXTINF:-1 tvg-id="MTV2.us@East",MTV2 (720p) -https://fl17.moveonjoy.com/MTV_2/index.m3u8 +https://fl7.moveonjoy.com/MTV_2/index.m3u8 #EXTINF:-1 tvg-id="MTVClassic.us@East",MTV Classic (360p) -https://fl17.moveonjoy.com/MTV_CLASSIC/index.m3u8 +https://fl7.moveonjoy.com/MTV_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="MTV.us@East",MTV East -https://fl17.moveonjoy.com/MTV/index.m3u8 +https://fl7.moveonjoy.com/MTV/index.m3u8 #EXTINF:-1 tvg-id="MTVLive.us",MTV Live (720p) -https://fl17.moveonjoy.com/MTV_LIVE/index.m3u8 +https://fl7.moveonjoy.com/MTV_LIVE/index.m3u8 #EXTINF:-1 tvg-id="MTVU.us",mtvU (480p) -https://fl17.moveonjoy.com/MTV_U/index.m3u8 +https://fl7.moveonjoy.com/MTV_U/index.m3u8 #EXTINF:-1 tvg-id="Much.ca",Much (720p) -https://fl17.moveonjoy.com/MUCH/index.m3u8 +https://fl7.moveonjoy.com/MUCH/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographic.us@East",National Geographic East -https://fl17.moveonjoy.com/National_Geographic/index.m3u8 +https://fl7.moveonjoy.com/National_Geographic/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographicWild.us@East",National Geographic Wild East -https://fl17.moveonjoy.com/Nat_Geo_Wild/index.m3u8 +https://fl7.moveonjoy.com/Nat_Geo_Wild/index.m3u8 #EXTINF:-1 tvg-id="NBATV.us",NBA TV -https://fl17.moveonjoy.com/NBA_TV/index.m3u8 +https://fl7.moveonjoy.com/NBA_TV/index.m3u8 #EXTINF:-1 tvg-id="NewsNation.us@East",News Nation (720p) -https://fl17.moveonjoy.com/NEWS_NATION/index.m3u8 +https://fl7.moveonjoy.com/NEWS_NATION/index.m3u8 #EXTINF:-1 tvg-id="NFLNetwork.us",NFL Network -https://fl17.moveonjoy.com/NFL_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/NFL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NFLRedZone.us",NFL RedZone -https://fl17.moveonjoy.com/NFL_RedZone/index.m3u8 +https://fl7.moveonjoy.com/NFL_RedZone/index.m3u8 #EXTINF:-1 tvg-id="NHLNetwork.us",NHL Network (720p) -https://fl17.moveonjoy.com/NHL_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/NHL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NickJr.us@East",Nick Jr. East (720p) -https://fl17.moveonjoy.com/NICK_JR/index.m3u8 +https://fl7.moveonjoy.com/NICK_JR/index.m3u8 #EXTINF:-1 tvg-id="NickMusic.us",Nick Music (720p) -https://fl17.moveonjoy.com/NICK_MUSIC/index.m3u8 +https://fl7.moveonjoy.com/NICK_MUSIC/index.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.us@East",Nickelodeon East -https://fl17.moveonjoy.com/NICKELODEON/index.m3u8 +https://fl7.moveonjoy.com/NICKELODEON/index.m3u8 #EXTINF:-1 tvg-id="Nicktoons.us@East",Nicktoons East -https://fl17.moveonjoy.com/NICKTOONS/index.m3u8 +https://fl7.moveonjoy.com/NICKTOONS/index.m3u8 #EXTINF:-1 tvg-id="OutdoorChannel.us",Outdoor Channel -https://fl17.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="OuterMax.us@East",OuterMax East (720p) -https://fl17.moveonjoy.com/OUTER_MAX/index.m3u8 +https://fl7.moveonjoy.com/OUTER_MAX/index.m3u8 #EXTINF:-1 tvg-id="OutsideTV.us",Outside TV -https://fl17.moveonjoy.com/OUTSIDE_TV/index.m3u8 +https://fl7.moveonjoy.com/OUTSIDE_TV/index.m3u8 #EXTINF:-1 tvg-id="Ovation.us",Ovation (1080p) -https://fl17.moveonjoy.com/Ovation/index.m3u8 +https://fl7.moveonjoy.com/Ovation/index.m3u8 #EXTINF:-1 tvg-id="Oxygen.us@East",Oxygen East -https://fl17.moveonjoy.com/OXYGEN/index.m3u8 +https://fl7.moveonjoy.com/OXYGEN/index.m3u8 #EXTINF:-1 tvg-id="ParamountNetwork.us@East",Paramount Network East -https://fl17.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="PopTV.us",Pop TV -https://fl17.moveonjoy.com/Pop_TV/index.m3u8 +https://fl7.moveonjoy.com/Pop_TV/index.m3u8 #EXTINF:-1 tvg-id="PursuitChannel.us",Pursuit Channel (720p) -https://fl17.moveonjoy.com/Pursuit_Channel/index.m3u8 +https://fl7.moveonjoy.com/Pursuit_Channel/index.m3u8 #EXTINF:-1 tvg-id="QVC.us",QVC (720p) -https://fl17.moveonjoy.com/QVC/index.m3u8 +https://fl7.moveonjoy.com/QVC/index.m3u8 #EXTINF:-1 tvg-id="Reelz.us",Reelz (720p) -https://fl17.moveonjoy.com/REELZ/index.m3u8 +https://fl7.moveonjoy.com/REELZ/index.m3u8 #EXTINF:-1 tvg-id="Revolt.us",Revolt -https://fl17.moveonjoy.com/REVOLT/index.m3u8 +https://fl7.moveonjoy.com/REVOLT/index.m3u8 #EXTINF:-1 tvg-id="Showtime2.us@East",Showtime 2 East -https://fl17.moveonjoy.com/SHOWTIME_2/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_2/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@East",Showtime East -https://fl17.moveonjoy.com/SHOWTIME/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeNext.us@East",Showtime Next East -https://fl17.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@West",Showtime West (1080p) -https://fl17.moveonjoy.com/SHOWTIME_WEST/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_WEST/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeWomen.us@East",Showtime Women East -https://fl17.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 #EXTINF:-1 tvg-id="SmithsonianChannel.us@East",Smithsonian Channel East -https://fl17.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SonyChannel.mx",Sony Channel -https://fl17.moveonjoy.com/Sony_Movie_Channel/index.m3u8 +https://fl7.moveonjoy.com/Sony_Movie_Channel/index.m3u8 #EXTINF:-1 tvg-id="SportsmanChannel.us",Sportsman Channel -https://fl17.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SportsNetNewYork.us",SportsNet New York (540p) -https://fl17.moveonjoy.com/SNY/index.m3u8 +https://fl7.moveonjoy.com/SNY/index.m3u8 #EXTINF:-1 tvg-id="StartTV.us",Start TV -https://fl17.moveonjoy.com/Start_Tv/index.m3u8 +https://fl7.moveonjoy.com/Start_Tv/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@East",Starz East -https://fl17.moveonjoy.com/STARZ/index.m3u8 +https://fl7.moveonjoy.com/STARZ/index.m3u8 #EXTINF:-1 tvg-id="StarzEncoreClassic.us@East",Starz Encore Classic East -https://fl17.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 +https://fl7.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@West",Starz West -https://fl17.moveonjoy.com/STARZ_WEST/index.m3u8 +https://fl7.moveonjoy.com/STARZ_WEST/index.m3u8 #EXTINF:-1 tvg-id="StoriesbyAMC.us@EastHD",Stories by AMC (1080p) -http://fl17.moveonjoy.com/AMC_NETWORK/index.m3u8 +http://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="SundanceTV.us@East",Sundance TV East -https://fl17.moveonjoy.com/SUNDANCE/index.m3u8 +https://fl7.moveonjoy.com/SUNDANCE/index.m3u8 #EXTINF:-1 tvg-id="Syfy.us@East",Syfy East -https://fl17.moveonjoy.com/SYFY/index.m3u8 +https://fl7.moveonjoy.com/SYFY/index.m3u8 #EXTINF:-1 tvg-id="TeenNick.us",TeenNick -https://fl17.moveonjoy.com/Teen_Nick/index.m3u8 +https://fl7.moveonjoy.com/Teen_Nick/index.m3u8 #EXTINF:-1 tvg-id="TennisChannel.us",Tennis Channel -https://fl17.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="TheCowboyChannel.us",The Cowboy Channel -https://fl17.moveonjoy.com/Cowboy_Channel/index.m3u8 +https://fl7.moveonjoy.com/Cowboy_Channel/index.m3u8 #EXTINF:-1 tvg-id="TSN1.ca",TSN1 (1080p) -https://fl17.moveonjoy.com/TSN_1/index.m3u8 +https://fl7.moveonjoy.com/TSN_1/index.m3u8 #EXTINF:-1 tvg-id="TSN2.ca",TSN2 -https://fl17.moveonjoy.com/TSN_2/index.m3u8 +https://fl7.moveonjoy.com/TSN_2/index.m3u8 #EXTINF:-1 tvg-id="TSN3.ca",TSN3 -https://fl17.moveonjoy.com/TSN_3/index.m3u8 +https://fl7.moveonjoy.com/TSN_3/index.m3u8 #EXTINF:-1 tvg-id="TSN4.ca",TSN4 -https://fl17.moveonjoy.com/TSN_4/index.m3u8 +https://fl7.moveonjoy.com/TSN_4/index.m3u8 #EXTINF:-1 tvg-id="TSN5.ca",TSN5 -https://fl17.moveonjoy.com/TSN_5/index.m3u8 +https://fl7.moveonjoy.com/TSN_5/index.m3u8 #EXTINF:-1 tvg-id="TVLand.us@East",TV Land -https://fl17.moveonjoy.com/TV_LAND/index.m3u8 +https://fl7.moveonjoy.com/TV_LAND/index.m3u8 #EXTINF:-1 tvg-id="TVOne.us",TV One -https://fl17.moveonjoy.com/TV_ONE/index.m3u8 +https://fl7.moveonjoy.com/TV_ONE/index.m3u8 #EXTINF:-1 tvg-id="TVJ.jm",TVJ (720p) -https://fl17.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 +https://fl7.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="UpTV.us",Up TV (1080p) -https://fl17.moveonjoy.com/Up_Tv/index.m3u8 +https://fl7.moveonjoy.com/Up_Tv/index.m3u8 #EXTINF:-1 tvg-id="USANetwork.us@East",USA Network (720p) -http://fl17.moveonjoy.com/USA_NETWORK/index.m3u8 +http://fl7.moveonjoy.com/USA_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="VH1.us@East",VH1 East -https://fl17.moveonjoy.com/VH1/index.m3u8 +https://fl7.moveonjoy.com/VH1/index.m3u8 #EXTINF:-1 tvg-id="VICETV.us",VICE TV (720p) -https://fl17.moveonjoy.com/VICELAND/index.m3u8 +https://fl7.moveonjoy.com/VICELAND/index.m3u8 #EXTINF:-1 tvg-id="WNetwork.ca@East",W Network (720p) -https://fl17.moveonjoy.com/W_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/W_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WeTV.us@East",We TV East -https://fl17.moveonjoy.com/WE_TV/index.m3u8 +https://fl7.moveonjoy.com/WE_TV/index.m3u8 #EXTINF:-1 tvg-id="WFLADT1.us@SD",WFLA-DT1 -https://fl17.moveonjoy.com/FL_Tampa_NBC/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_NBC/index.m3u8 #EXTINF:-1 tvg-id="WFLXDT1.us@SD",WFLX-DT1 -https://fl17.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 +https://fl7.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 #EXTINF:-1 tvg-id="WFTSDT1.us@SD",WFTS-DT1 -https://fl17.moveonjoy.com/FL_Tampa_ABC/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_ABC/index.m3u8 #EXTINF:-1 tvg-id="WGNDT1.us",WGN-DT1 (720p) -https://fl17.moveonjoy.com/WGN/index.m3u8 +https://fl7.moveonjoy.com/WGN/index.m3u8 #EXTINF:-1 tvg-id="Willow.us",Willow -https://fl17.moveonjoy.com/WILLOW_CRICKET/index.m3u8 +https://fl7.moveonjoy.com/WILLOW_CRICKET/index.m3u8 #EXTINF:-1 tvg-id="WKCFDT1.us@SD",WKCF-DT1 -https://fl17.moveonjoy.com/CW_ORLANDO/index.m3u8 +https://fl7.moveonjoy.com/CW_ORLANDO/index.m3u8 #EXTINF:-1 tvg-id="WNBCDT1.us",WNBC-DT1 -https://fl17.moveonjoy.com/NBC_EAST/index.m3u8 +https://fl7.moveonjoy.com/NBC_EAST/index.m3u8 #EXTINF:-1 tvg-id="WorldFishingNetwork.us",World Fishing Network -https://fl17.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WPECDT1.us@SD",WPEC-DT1 -https://fl17.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 +https://fl7.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 #EXTINF:-1 tvg-id="WTOGDT1.us@SD",WTOG-DT1 -https://fl17.moveonjoy.com/FL_Tampa_CW44/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_CW44/index.m3u8 #EXTINF:-1 tvg-id="WVGNLD1.vi@SD",WVGN-LD1 -https://fl17.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 +https://fl7.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 #EXTINF:-1 tvg-id="YesNetwork.us",Yes Network -https://fl17.moveonjoy.com/YES_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/YES_NETWORK/index.m3u8 From eec8357872d25b699243b227396c6f26a33d3248 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 21:55:20 +0200 Subject: [PATCH 15/51] Update us_moveonjoy.m3u --- streams/us_moveonjoy.m3u | 304 +++++++++++++++++++-------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index db44891ce1..823ec7b37b 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -1,305 +1,305 @@ #EXTM3U #EXTINF:-1 tvg-id="WOLODT1.us",ABC 25 Columbia -https://fl7.moveonjoy.com/ABC_EAST/index.m3u8 +https://fl31.moveonjoy.com/ABC_EAST/index.m3u8 #EXTINF:-1 tvg-id="ACCNetwork.us",ACCN (720p) -https://fl7.moveonjoy.com/ACC_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/ACC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AMC.us@East",AMC East (1080p) -https://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AntennaTV.us",Antenna TV -https://fl7.moveonjoy.com/Antenna_TV/index.m3u8 +https://fl31.moveonjoy.com/Antenna_TV/index.m3u8 #EXTINF:-1 tvg-id="Aspire.us",Aspire -https://fl7.moveonjoy.com/Aspire/index.m3u8 +https://fl31.moveonjoy.com/Aspire/index.m3u8 #EXTINF:-1 tvg-id="AXSTV.us",AXS TV -https://fl7.moveonjoy.com/Axs_TV/index.m3u8 +https://fl31.moveonjoy.com/Axs_TV/index.m3u8 #EXTINF:-1 tvg-id="BBCAmerica.us@East",BBC America East -https://fl7.moveonjoy.com/BBC_AMERICA/index.m3u8 +https://fl31.moveonjoy.com/BBC_AMERICA/index.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk@NorthAmerica",BBC News North America -https://fl7.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 +https://fl31.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 #EXTINF:-1 tvg-id="beINSportsUSA.us",beIN Sports USA -http://fl7.moveonjoy.com/BEIN_SPORTS/index.m3u8 +http://fl31.moveonjoy.com/BEIN_SPORTS/index.m3u8 #EXTINF:-1 tvg-id="BET.us@East",BET East -https://fl7.moveonjoy.com/BET_EAST/index.m3u8 +https://fl31.moveonjoy.com/BET_EAST/index.m3u8 #EXTINF:-1 tvg-id="BETGospel.us",BET Gospel -https://fl7.moveonjoy.com/BET_GOSPEL/index.m3u8 +https://fl31.moveonjoy.com/BET_GOSPEL/index.m3u8 #EXTINF:-1 tvg-id="BETHer.us@East",BET Her East -https://fl7.moveonjoy.com/BET_HER/index.m3u8 +https://fl31.moveonjoy.com/BET_HER/index.m3u8 #EXTINF:-1 tvg-id="BETJams.us",BET Jams -https://fl7.moveonjoy.com/BET_Jams/index.m3u8 +https://fl31.moveonjoy.com/BET_Jams/index.m3u8 #EXTINF:-1 tvg-id="BETSoul.us",BET Soul -https://fl7.moveonjoy.com/BET_SOUL/index.m3u8 +https://fl31.moveonjoy.com/BET_SOUL/index.m3u8 #EXTINF:-1 tvg-id="BigTenNetwork.us",Big Ten Network -https://fl7.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="BloombergTV.us",Bloomberg TV -https://fl7.moveonjoy.com/BLOOMBERG/index.m3u8 +https://fl31.moveonjoy.com/BLOOMBERG/index.m3u8 #EXTINF:-1 tvg-id="Bounce.us",Bounce -https://fl7.moveonjoy.com/BOUNCE_TV/index.m3u8 +https://fl31.moveonjoy.com/BOUNCE_TV/index.m3u8 #EXTINF:-1 tvg-id="Bravo.us@East",Bravo East -https://fl7.moveonjoy.com/BRAVO/index.m3u8 +https://fl31.moveonjoy.com/BRAVO/index.m3u8 #EXTINF:-1 tvg-id="Buzzr.us",Buzzr -https://fl7.moveonjoy.com/Buzzr/index.m3u8 +https://fl31.moveonjoy.com/Buzzr/index.m3u8 #EXTINF:-1 tvg-id="CSPAN.us",C-SPAN -https://fl7.moveonjoy.com/C-SPAN/index.m3u8 +https://fl31.moveonjoy.com/C-SPAN/index.m3u8 #EXTINF:-1 tvg-id="CBS.us@East",CBS East (720p) -https://fl7.moveonjoy.com/CBS_News/index.m3u8 +https://fl31.moveonjoy.com/CBS_News/index.m3u8 #EXTINF:-1 tvg-id="CBSSportsNetworkUSA.us",CBS Sports Network USA -https://fl7.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="CHBLTV.ca",CHBL-TV -https://fl7.moveonjoy.com/CA_GLOBAL/index.m3u8 +https://fl31.moveonjoy.com/CA_GLOBAL/index.m3u8 #EXTINF:-1 tvg-id="CleoTV.us",Cleo TV (720p) -https://fl7.moveonjoy.com/Cleo_TV/index.m3u8 +https://fl31.moveonjoy.com/Cleo_TV/index.m3u8 #EXTINF:-1 tvg-id="CMT.us@East",CMT East -https://fl7.moveonjoy.com/CMT/index.m3u8 +https://fl31.moveonjoy.com/CMT/index.m3u8 #EXTINF:-1 tvg-id="CNBC.us",CNBC -https://fl7.moveonjoy.com/CNBC/index.m3u8 +https://fl31.moveonjoy.com/CNBC/index.m3u8 #EXTINF:-1 tvg-id="CNBCWorld.us",CNBC World -https://fl7.moveonjoy.com/CNBC_World/index.m3u8 +https://fl31.moveonjoy.com/CNBC_World/index.m3u8 #EXTINF:-1 tvg-id="ComedyCentral.us@East",Comedy Central East (720p) -https://fl7.moveonjoy.com/Comedy_Central/index.m3u8 +https://fl31.moveonjoy.com/Comedy_Central/index.m3u8 #EXTINF:-1 tvg-id="ComedyTV.us",Comedy TV -https://fl7.moveonjoy.com/Comedy_TV/index.m3u8 +https://fl31.moveonjoy.com/Comedy_TV/index.m3u8 #EXTINF:-1 tvg-id="Comet.us",Comet -https://fl7.moveonjoy.com/COMET/index.m3u8 +https://fl31.moveonjoy.com/COMET/index.m3u8 #EXTINF:-1 tvg-id="CourtTV.us",Court TV -https://fl7.moveonjoy.com/COURT_TV/index.m3u8 +https://fl31.moveonjoy.com/COURT_TV/index.m3u8 #EXTINF:-1 tvg-id="CoziTV.us",Cozi TV -https://fl7.moveonjoy.com/COZI_TV/index.m3u8 +https://fl31.moveonjoy.com/COZI_TV/index.m3u8 #EXTINF:-1 tvg-id="Crave1.ca",Crave 1 -https://fl7.moveonjoy.com/CRAVE_1/index.m3u8 +https://fl31.moveonjoy.com/CRAVE_1/index.m3u8 #EXTINF:-1 tvg-id="Crave2.ca",Crave 2 -https://fl7.moveonjoy.com/CRAVE_2/index.m3u8 +https://fl31.moveonjoy.com/CRAVE_2/index.m3u8 #EXTINF:-1 tvg-id="Crave3.ca",Crave 3 -https://fl7.moveonjoy.com/CRAVE_3/index.m3u8 +https://fl31.moveonjoy.com/CRAVE_3/index.m3u8 #EXTINF:-1 tvg-id="Crave4.ca",Crave 4 -https://fl7.moveonjoy.com/CRAVE_4/index.m3u8 +https://fl31.moveonjoy.com/CRAVE_4/index.m3u8 #EXTINF:-1 tvg-id="CrimePlusInvestigation.us@SD",Crime + Investigation -https://fl7.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 +https://fl31.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 #EXTINF:-1 tvg-id="CuriosityStream.us",CuriosityStream (720p) -https://fl7.moveonjoy.com/Curiosity_Stream/index.m3u8 +https://fl31.moveonjoy.com/Curiosity_Stream/index.m3u8 #EXTINF:-1 tvg-id="CVMTV.jm@SD",CVM TV -https://fl7.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 +https://fl31.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="DisneyChannel.us@East",Disney Channel East -https://fl7.moveonjoy.com/DISNEY/index.m3u8 +https://fl31.moveonjoy.com/DISNEY/index.m3u8 #EXTINF:-1 tvg-id="DisneyJunior.us@East",Disney Junior East -https://fl7.moveonjoy.com/DISNEY_JR/index.m3u8 +https://fl31.moveonjoy.com/DISNEY_JR/index.m3u8 #EXTINF:-1 tvg-id="DisneyXD.us@East",Disney XD (720p) -http://fl7.moveonjoy.com/DISNEY_XD/index.m3u8 +http://fl31.moveonjoy.com/DISNEY_XD/index.m3u8 #EXTINF:-1 tvg-id="E.us@East",E! East -https://fl7.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 +https://fl31.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 #EXTINF:-1 tvg-id="ESPNU.us",ESPN U (720p) -https://fl7.moveonjoy.com/ESPN_U/index.m3u8 +https://fl31.moveonjoy.com/ESPN_U/index.m3u8 #EXTINF:-1 tvg-id="ESPNews.us",ESPNews (720p) -https://fl7.moveonjoy.com/ESPN_NEWS/index.m3u8 +https://fl31.moveonjoy.com/ESPN_NEWS/index.m3u8 #EXTINF:-1 tvg-id="FanDuelSportsNetwork.us",FanDuel Sports Network -https://fl7.moveonjoy.com/PAC_12/index.m3u8 +https://fl31.moveonjoy.com/PAC_12/index.m3u8 #EXTINF:-1 tvg-id="FanDuelTV.us",FanDuel TV -https://fl7.moveonjoy.com/TVG/index.m3u8 +https://fl31.moveonjoy.com/TVG/index.m3u8 #EXTINF:-1 tvg-id="FoxBusinessNetwork.us",Fox Business Network (720p) -https://fl7.moveonjoy.com/FOX_Business_Network/index.m3u8 +https://fl31.moveonjoy.com/FOX_Business_Network/index.m3u8 #EXTINF:-1 tvg-id="FoxNewsChannel.us",Fox News Channel (720p) -https://fl7.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="FoxSoul.us",Fox Soul -https://fl7.moveonjoy.com/FOX_SOUL/index.m3u8 +https://fl31.moveonjoy.com/FOX_SOUL/index.m3u8 #EXTINF:-1 tvg-id="",Fox Sports 1 -https://fl7.moveonjoy.com/FOX_Sports_1/index.m3u8 +https://fl31.moveonjoy.com/FOX_Sports_1/index.m3u8 #EXTINF:-1 tvg-id="Freeform.us@East",Free form East -https://fl7.moveonjoy.com/FREE_FORM/index.m3u8 +https://fl31.moveonjoy.com/FREE_FORM/index.m3u8 #EXTINF:-1 tvg-id="Fuse.us@East",Fuse East (720p) -https://fl7.moveonjoy.com/FUSE/index.m3u8 +https://fl31.moveonjoy.com/FUSE/index.m3u8 #EXTINF:-1 tvg-id="FX.us@East",FX East -https://fl7.moveonjoy.com/FX/index.m3u8 +https://fl31.moveonjoy.com/FX/index.m3u8 #EXTINF:-1 tvg-id="FXM.us@East",FXM East -https://fl7.moveonjoy.com/FX_MOVIE/index.m3u8 +https://fl31.moveonjoy.com/FX_MOVIE/index.m3u8 #EXTINF:-1 tvg-id="FXX.us@East",FXX East -https://fl7.moveonjoy.com/FXX/index.m3u8 +https://fl31.moveonjoy.com/FXX/index.m3u8 #EXTINF:-1 tvg-id="FYI.us@East",FYI East -https://fl7.moveonjoy.com/FYI/index.m3u8 +https://fl31.moveonjoy.com/FYI/index.m3u8 #EXTINF:-1 tvg-id="GetTV.us",GetTV (480p) -https://fl7.moveonjoy.com/GET_TV/index.m3u8 +https://fl31.moveonjoy.com/GET_TV/index.m3u8 #EXTINF:-1 tvg-id="GolfChannel.us@SD",Golf Channel -https://fl7.moveonjoy.com/GOLF/index.m3u8 +https://fl31.moveonjoy.com/GOLF/index.m3u8 #EXTINF:-1 tvg-id="",Great American Country -https://fl7.moveonjoy.com/Great_American_Country/index.m3u8 +https://fl31.moveonjoy.com/Great_American_Country/index.m3u8 #EXTINF:-1 tvg-id="Grit.us",Grit -https://fl7.moveonjoy.com/GRIT_TV/index.m3u8 +https://fl31.moveonjoy.com/GRIT_TV/index.m3u8 #EXTINF:-1 tvg-id="HallmarkChannel.us@East",Hallmark Channel East -https://fl7.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="HallmarkDrama.us",Hallmark Drama (720p) -https://fl7.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 +https://fl31.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 #EXTINF:-1 tvg-id="HallmarkMoviesMysteries.us@East",Hallmark Movies Mysteries East -https://fl7.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 +https://fl31.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 #EXTINF:-1 tvg-id="History.us@East",History -https://fl7.moveonjoy.com/history_channel/index.m3u8 +https://fl31.moveonjoy.com/history_channel/index.m3u8 #EXTINF:-1 tvg-id="HSN.us",HSN -https://fl7.moveonjoy.com/HSN/index.m3u8 +https://fl31.moveonjoy.com/HSN/index.m3u8 #EXTINF:-1 tvg-id="INSP.us",INSP -https://fl7.moveonjoy.com/INSP/index.m3u8 +https://fl31.moveonjoy.com/INSP/index.m3u8 #EXTINF:-1 tvg-id="IONPlus.us@East",ION Plus East (720p) -https://fl7.moveonjoy.com/ION_Plus/index.m3u8 +https://fl31.moveonjoy.com/ION_Plus/index.m3u8 #EXTINF:-1 tvg-id="IONTV.us@East",ION TV East -https://fl7.moveonjoy.com/ION_TV/index.m3u8 +https://fl31.moveonjoy.com/ION_TV/index.m3u8 #EXTINF:-1 tvg-id="Lifetime.us@East",Lifetime East -https://fl7.moveonjoy.com/LIFETIME/index.m3u8 +https://fl31.moveonjoy.com/LIFETIME/index.m3u8 #EXTINF:-1 tvg-id="LifetimeMovies.us@East",Lifetime Movies East -https://fl7.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="LoveNature.ca",Love Nature -https://fl7.moveonjoy.com/LOVE_NATURE/index.m3u8 +https://fl31.moveonjoy.com/LOVE_NATURE/index.m3u8 #EXTINF:-1 tvg-id="",MAV TV (720p) -https://fl7.moveonjoy.com/MAV_TV/index.m3u8 +https://fl31.moveonjoy.com/MAV_TV/index.m3u8 #EXTINF:-1 tvg-id="MeTV.us",MeTV -https://fl7.moveonjoy.com/ME_TV/index.m3u8 +https://fl31.moveonjoy.com/ME_TV/index.m3u8 #EXTINF:-1 tvg-id="MGMPlus.us@East",MGM+ East -https://fl7.moveonjoy.com/EPIX/index.m3u8 +https://fl31.moveonjoy.com/EPIX/index.m3u8 #EXTINF:-1 tvg-id="MGMPlusMarquee.us",MGM+ Marquee -https://fl7.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 +https://fl31.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 #EXTINF:-1 tvg-id="MilitaryHistory.us",Military History -https://fl7.moveonjoy.com/Military_History/index.m3u8 +https://fl31.moveonjoy.com/Military_History/index.m3u8 #EXTINF:-1 tvg-id="MLBNetwork.us",MLB Network -https://fl7.moveonjoy.com/MLB_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/MLB_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="MSG.us",MSG -https://fl7.moveonjoy.com/MSG/index.m3u8 +https://fl31.moveonjoy.com/MSG/index.m3u8 #EXTINF:-1 tvg-id="MTV2.us@East",MTV2 (720p) -https://fl7.moveonjoy.com/MTV_2/index.m3u8 +https://fl31.moveonjoy.com/MTV_2/index.m3u8 #EXTINF:-1 tvg-id="MTVClassic.us@East",MTV Classic (360p) -https://fl7.moveonjoy.com/MTV_CLASSIC/index.m3u8 +https://fl31.moveonjoy.com/MTV_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="MTV.us@East",MTV East -https://fl7.moveonjoy.com/MTV/index.m3u8 +https://fl31.moveonjoy.com/MTV/index.m3u8 #EXTINF:-1 tvg-id="MTVLive.us",MTV Live (720p) -https://fl7.moveonjoy.com/MTV_LIVE/index.m3u8 +https://fl31.moveonjoy.com/MTV_LIVE/index.m3u8 #EXTINF:-1 tvg-id="MTVU.us",mtvU (480p) -https://fl7.moveonjoy.com/MTV_U/index.m3u8 +https://fl31.moveonjoy.com/MTV_U/index.m3u8 #EXTINF:-1 tvg-id="Much.ca",Much (720p) -https://fl7.moveonjoy.com/MUCH/index.m3u8 +https://fl31.moveonjoy.com/MUCH/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographic.us@East",National Geographic East -https://fl7.moveonjoy.com/National_Geographic/index.m3u8 +https://fl31.moveonjoy.com/National_Geographic/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographicWild.us@East",National Geographic Wild East -https://fl7.moveonjoy.com/Nat_Geo_Wild/index.m3u8 +https://fl31.moveonjoy.com/Nat_Geo_Wild/index.m3u8 #EXTINF:-1 tvg-id="NBATV.us",NBA TV -https://fl7.moveonjoy.com/NBA_TV/index.m3u8 +https://fl31.moveonjoy.com/NBA_TV/index.m3u8 #EXTINF:-1 tvg-id="NewsNation.us@East",News Nation (720p) -https://fl7.moveonjoy.com/NEWS_NATION/index.m3u8 +https://fl31.moveonjoy.com/NEWS_NATION/index.m3u8 #EXTINF:-1 tvg-id="NFLNetwork.us",NFL Network -https://fl7.moveonjoy.com/NFL_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/NFL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NFLRedZone.us",NFL RedZone -https://fl7.moveonjoy.com/NFL_RedZone/index.m3u8 +https://fl31.moveonjoy.com/NFL_RedZone/index.m3u8 #EXTINF:-1 tvg-id="NHLNetwork.us",NHL Network (720p) -https://fl7.moveonjoy.com/NHL_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/NHL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NickJr.us@East",Nick Jr. East (720p) -https://fl7.moveonjoy.com/NICK_JR/index.m3u8 +https://fl31.moveonjoy.com/NICK_JR/index.m3u8 #EXTINF:-1 tvg-id="NickMusic.us",Nick Music (720p) -https://fl7.moveonjoy.com/NICK_MUSIC/index.m3u8 +https://fl31.moveonjoy.com/NICK_MUSIC/index.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.us@East",Nickelodeon East -https://fl7.moveonjoy.com/NICKELODEON/index.m3u8 +https://fl31.moveonjoy.com/NICKELODEON/index.m3u8 #EXTINF:-1 tvg-id="Nicktoons.us@East",Nicktoons East -https://fl7.moveonjoy.com/NICKTOONS/index.m3u8 +https://fl31.moveonjoy.com/NICKTOONS/index.m3u8 #EXTINF:-1 tvg-id="OutdoorChannel.us",Outdoor Channel -https://fl7.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="OuterMax.us@East",OuterMax East (720p) -https://fl7.moveonjoy.com/OUTER_MAX/index.m3u8 +https://fl31.moveonjoy.com/OUTER_MAX/index.m3u8 #EXTINF:-1 tvg-id="OutsideTV.us",Outside TV -https://fl7.moveonjoy.com/OUTSIDE_TV/index.m3u8 +https://fl31.moveonjoy.com/OUTSIDE_TV/index.m3u8 #EXTINF:-1 tvg-id="Ovation.us",Ovation (1080p) -https://fl7.moveonjoy.com/Ovation/index.m3u8 +https://fl31.moveonjoy.com/Ovation/index.m3u8 #EXTINF:-1 tvg-id="Oxygen.us@East",Oxygen East -https://fl7.moveonjoy.com/OXYGEN/index.m3u8 +https://fl31.moveonjoy.com/OXYGEN/index.m3u8 #EXTINF:-1 tvg-id="ParamountNetwork.us@East",Paramount Network East -https://fl7.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="PopTV.us",Pop TV -https://fl7.moveonjoy.com/Pop_TV/index.m3u8 +https://fl31.moveonjoy.com/Pop_TV/index.m3u8 #EXTINF:-1 tvg-id="PursuitChannel.us",Pursuit Channel (720p) -https://fl7.moveonjoy.com/Pursuit_Channel/index.m3u8 +https://fl31.moveonjoy.com/Pursuit_Channel/index.m3u8 #EXTINF:-1 tvg-id="QVC.us",QVC (720p) -https://fl7.moveonjoy.com/QVC/index.m3u8 +https://fl31.moveonjoy.com/QVC/index.m3u8 #EXTINF:-1 tvg-id="Reelz.us",Reelz (720p) -https://fl7.moveonjoy.com/REELZ/index.m3u8 +https://fl31.moveonjoy.com/REELZ/index.m3u8 #EXTINF:-1 tvg-id="Revolt.us",Revolt -https://fl7.moveonjoy.com/REVOLT/index.m3u8 +https://fl31.moveonjoy.com/REVOLT/index.m3u8 #EXTINF:-1 tvg-id="Showtime2.us@East",Showtime 2 East -https://fl7.moveonjoy.com/SHOWTIME_2/index.m3u8 +https://fl31.moveonjoy.com/SHOWTIME_2/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@East",Showtime East -https://fl7.moveonjoy.com/SHOWTIME/index.m3u8 +https://fl31.moveonjoy.com/SHOWTIME/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeNext.us@East",Showtime Next East -https://fl7.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 +https://fl31.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@West",Showtime West (1080p) -https://fl7.moveonjoy.com/SHOWTIME_WEST/index.m3u8 +https://fl31.moveonjoy.com/SHOWTIME_WEST/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeWomen.us@East",Showtime Women East -https://fl7.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 +https://fl31.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 #EXTINF:-1 tvg-id="SmithsonianChannel.us@East",Smithsonian Channel East -https://fl7.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SonyChannel.mx",Sony Channel -https://fl7.moveonjoy.com/Sony_Movie_Channel/index.m3u8 +https://fl31.moveonjoy.com/Sony_Movie_Channel/index.m3u8 #EXTINF:-1 tvg-id="SportsmanChannel.us",Sportsman Channel -https://fl7.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SportsNetNewYork.us",SportsNet New York (540p) -https://fl7.moveonjoy.com/SNY/index.m3u8 +https://fl31.moveonjoy.com/SNY/index.m3u8 #EXTINF:-1 tvg-id="StartTV.us",Start TV -https://fl7.moveonjoy.com/Start_Tv/index.m3u8 +https://fl31.moveonjoy.com/Start_Tv/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@East",Starz East -https://fl7.moveonjoy.com/STARZ/index.m3u8 +https://fl31.moveonjoy.com/STARZ/index.m3u8 #EXTINF:-1 tvg-id="StarzEncoreClassic.us@East",Starz Encore Classic East -https://fl7.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 +https://fl31.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@West",Starz West -https://fl7.moveonjoy.com/STARZ_WEST/index.m3u8 +https://fl31.moveonjoy.com/STARZ_WEST/index.m3u8 #EXTINF:-1 tvg-id="StoriesbyAMC.us@EastHD",Stories by AMC (1080p) -http://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 +http://fl31.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="SundanceTV.us@East",Sundance TV East -https://fl7.moveonjoy.com/SUNDANCE/index.m3u8 +https://fl31.moveonjoy.com/SUNDANCE/index.m3u8 #EXTINF:-1 tvg-id="Syfy.us@East",Syfy East -https://fl7.moveonjoy.com/SYFY/index.m3u8 +https://fl31.moveonjoy.com/SYFY/index.m3u8 #EXTINF:-1 tvg-id="TeenNick.us",TeenNick -https://fl7.moveonjoy.com/Teen_Nick/index.m3u8 +https://fl31.moveonjoy.com/Teen_Nick/index.m3u8 #EXTINF:-1 tvg-id="TennisChannel.us",Tennis Channel -https://fl7.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 +https://fl31.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="TheCowboyChannel.us",The Cowboy Channel -https://fl7.moveonjoy.com/Cowboy_Channel/index.m3u8 +https://fl31.moveonjoy.com/Cowboy_Channel/index.m3u8 #EXTINF:-1 tvg-id="TSN1.ca",TSN1 (1080p) -https://fl7.moveonjoy.com/TSN_1/index.m3u8 +https://fl31.moveonjoy.com/TSN_1/index.m3u8 #EXTINF:-1 tvg-id="TSN2.ca",TSN2 -https://fl7.moveonjoy.com/TSN_2/index.m3u8 +https://fl31.moveonjoy.com/TSN_2/index.m3u8 #EXTINF:-1 tvg-id="TSN3.ca",TSN3 -https://fl7.moveonjoy.com/TSN_3/index.m3u8 +https://fl31.moveonjoy.com/TSN_3/index.m3u8 #EXTINF:-1 tvg-id="TSN4.ca",TSN4 -https://fl7.moveonjoy.com/TSN_4/index.m3u8 +https://fl31.moveonjoy.com/TSN_4/index.m3u8 #EXTINF:-1 tvg-id="TSN5.ca",TSN5 -https://fl7.moveonjoy.com/TSN_5/index.m3u8 +https://fl31.moveonjoy.com/TSN_5/index.m3u8 #EXTINF:-1 tvg-id="TVLand.us@East",TV Land -https://fl7.moveonjoy.com/TV_LAND/index.m3u8 +https://fl31.moveonjoy.com/TV_LAND/index.m3u8 #EXTINF:-1 tvg-id="TVOne.us",TV One -https://fl7.moveonjoy.com/TV_ONE/index.m3u8 +https://fl31.moveonjoy.com/TV_ONE/index.m3u8 #EXTINF:-1 tvg-id="TVJ.jm",TVJ (720p) -https://fl7.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 +https://fl31.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="UpTV.us",Up TV (1080p) -https://fl7.moveonjoy.com/Up_Tv/index.m3u8 +https://fl31.moveonjoy.com/Up_Tv/index.m3u8 #EXTINF:-1 tvg-id="USANetwork.us@East",USA Network (720p) -http://fl7.moveonjoy.com/USA_NETWORK/index.m3u8 +http://fl31.moveonjoy.com/USA_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="VH1.us@East",VH1 East -https://fl7.moveonjoy.com/VH1/index.m3u8 +https://fl31.moveonjoy.com/VH1/index.m3u8 #EXTINF:-1 tvg-id="VICETV.us",VICE TV (720p) -https://fl7.moveonjoy.com/VICELAND/index.m3u8 +https://fl31.moveonjoy.com/VICELAND/index.m3u8 #EXTINF:-1 tvg-id="WNetwork.ca@East",W Network (720p) -https://fl7.moveonjoy.com/W_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/W_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WeTV.us@East",We TV East -https://fl7.moveonjoy.com/WE_TV/index.m3u8 +https://fl31.moveonjoy.com/WE_TV/index.m3u8 #EXTINF:-1 tvg-id="WFLADT1.us@SD",WFLA-DT1 -https://fl7.moveonjoy.com/FL_Tampa_NBC/index.m3u8 +https://fl31.moveonjoy.com/FL_Tampa_NBC/index.m3u8 #EXTINF:-1 tvg-id="WFLXDT1.us@SD",WFLX-DT1 -https://fl7.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 +https://fl31.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 #EXTINF:-1 tvg-id="WFTSDT1.us@SD",WFTS-DT1 -https://fl7.moveonjoy.com/FL_Tampa_ABC/index.m3u8 +https://fl31.moveonjoy.com/FL_Tampa_ABC/index.m3u8 #EXTINF:-1 tvg-id="WGNDT1.us",WGN-DT1 (720p) -https://fl7.moveonjoy.com/WGN/index.m3u8 +https://fl31.moveonjoy.com/WGN/index.m3u8 #EXTINF:-1 tvg-id="Willow.us",Willow -https://fl7.moveonjoy.com/WILLOW_CRICKET/index.m3u8 +https://fl31.moveonjoy.com/WILLOW_CRICKET/index.m3u8 #EXTINF:-1 tvg-id="WKCFDT1.us@SD",WKCF-DT1 -https://fl7.moveonjoy.com/CW_ORLANDO/index.m3u8 +https://fl31.moveonjoy.com/CW_ORLANDO/index.m3u8 #EXTINF:-1 tvg-id="WNBCDT1.us",WNBC-DT1 -https://fl7.moveonjoy.com/NBC_EAST/index.m3u8 +https://fl31.moveonjoy.com/NBC_EAST/index.m3u8 #EXTINF:-1 tvg-id="WorldFishingNetwork.us",World Fishing Network -https://fl7.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WPECDT1.us@SD",WPEC-DT1 -https://fl7.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 +https://fl31.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 #EXTINF:-1 tvg-id="WTOGDT1.us@SD",WTOG-DT1 -https://fl7.moveonjoy.com/FL_Tampa_CW44/index.m3u8 +https://fl31.moveonjoy.com/FL_Tampa_CW44/index.m3u8 #EXTINF:-1 tvg-id="WVGNLD1.vi@SD",WVGN-LD1 -https://fl7.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 +https://fl31.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 #EXTINF:-1 tvg-id="YesNetwork.us",Yes Network -https://fl7.moveonjoy.com/YES_NETWORK/index.m3u8 +https://fl31.moveonjoy.com/YES_NETWORK/index.m3u8 From 27c07a8ac91b826a063169e349b4ab80ae1c231b Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 21:57:05 +0200 Subject: [PATCH 16/51] Update us_moveonjoy.m3u --- streams/us_moveonjoy.m3u | 304 +++++++++++++++++++-------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index 823ec7b37b..db44891ce1 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -1,305 +1,305 @@ #EXTM3U #EXTINF:-1 tvg-id="WOLODT1.us",ABC 25 Columbia -https://fl31.moveonjoy.com/ABC_EAST/index.m3u8 +https://fl7.moveonjoy.com/ABC_EAST/index.m3u8 #EXTINF:-1 tvg-id="ACCNetwork.us",ACCN (720p) -https://fl31.moveonjoy.com/ACC_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/ACC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AMC.us@East",AMC East (1080p) -https://fl31.moveonjoy.com/AMC_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="AntennaTV.us",Antenna TV -https://fl31.moveonjoy.com/Antenna_TV/index.m3u8 +https://fl7.moveonjoy.com/Antenna_TV/index.m3u8 #EXTINF:-1 tvg-id="Aspire.us",Aspire -https://fl31.moveonjoy.com/Aspire/index.m3u8 +https://fl7.moveonjoy.com/Aspire/index.m3u8 #EXTINF:-1 tvg-id="AXSTV.us",AXS TV -https://fl31.moveonjoy.com/Axs_TV/index.m3u8 +https://fl7.moveonjoy.com/Axs_TV/index.m3u8 #EXTINF:-1 tvg-id="BBCAmerica.us@East",BBC America East -https://fl31.moveonjoy.com/BBC_AMERICA/index.m3u8 +https://fl7.moveonjoy.com/BBC_AMERICA/index.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk@NorthAmerica",BBC News North America -https://fl31.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 +https://fl7.moveonjoy.com/BBC_WORLD_NEWS/index.m3u8 #EXTINF:-1 tvg-id="beINSportsUSA.us",beIN Sports USA -http://fl31.moveonjoy.com/BEIN_SPORTS/index.m3u8 +http://fl7.moveonjoy.com/BEIN_SPORTS/index.m3u8 #EXTINF:-1 tvg-id="BET.us@East",BET East -https://fl31.moveonjoy.com/BET_EAST/index.m3u8 +https://fl7.moveonjoy.com/BET_EAST/index.m3u8 #EXTINF:-1 tvg-id="BETGospel.us",BET Gospel -https://fl31.moveonjoy.com/BET_GOSPEL/index.m3u8 +https://fl7.moveonjoy.com/BET_GOSPEL/index.m3u8 #EXTINF:-1 tvg-id="BETHer.us@East",BET Her East -https://fl31.moveonjoy.com/BET_HER/index.m3u8 +https://fl7.moveonjoy.com/BET_HER/index.m3u8 #EXTINF:-1 tvg-id="BETJams.us",BET Jams -https://fl31.moveonjoy.com/BET_Jams/index.m3u8 +https://fl7.moveonjoy.com/BET_Jams/index.m3u8 #EXTINF:-1 tvg-id="BETSoul.us",BET Soul -https://fl31.moveonjoy.com/BET_SOUL/index.m3u8 +https://fl7.moveonjoy.com/BET_SOUL/index.m3u8 #EXTINF:-1 tvg-id="BigTenNetwork.us",Big Ten Network -https://fl31.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/BIG_TEN_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="BloombergTV.us",Bloomberg TV -https://fl31.moveonjoy.com/BLOOMBERG/index.m3u8 +https://fl7.moveonjoy.com/BLOOMBERG/index.m3u8 #EXTINF:-1 tvg-id="Bounce.us",Bounce -https://fl31.moveonjoy.com/BOUNCE_TV/index.m3u8 +https://fl7.moveonjoy.com/BOUNCE_TV/index.m3u8 #EXTINF:-1 tvg-id="Bravo.us@East",Bravo East -https://fl31.moveonjoy.com/BRAVO/index.m3u8 +https://fl7.moveonjoy.com/BRAVO/index.m3u8 #EXTINF:-1 tvg-id="Buzzr.us",Buzzr -https://fl31.moveonjoy.com/Buzzr/index.m3u8 +https://fl7.moveonjoy.com/Buzzr/index.m3u8 #EXTINF:-1 tvg-id="CSPAN.us",C-SPAN -https://fl31.moveonjoy.com/C-SPAN/index.m3u8 +https://fl7.moveonjoy.com/C-SPAN/index.m3u8 #EXTINF:-1 tvg-id="CBS.us@East",CBS East (720p) -https://fl31.moveonjoy.com/CBS_News/index.m3u8 +https://fl7.moveonjoy.com/CBS_News/index.m3u8 #EXTINF:-1 tvg-id="CBSSportsNetworkUSA.us",CBS Sports Network USA -https://fl31.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/CBS_SPORTS_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="CHBLTV.ca",CHBL-TV -https://fl31.moveonjoy.com/CA_GLOBAL/index.m3u8 +https://fl7.moveonjoy.com/CA_GLOBAL/index.m3u8 #EXTINF:-1 tvg-id="CleoTV.us",Cleo TV (720p) -https://fl31.moveonjoy.com/Cleo_TV/index.m3u8 +https://fl7.moveonjoy.com/Cleo_TV/index.m3u8 #EXTINF:-1 tvg-id="CMT.us@East",CMT East -https://fl31.moveonjoy.com/CMT/index.m3u8 +https://fl7.moveonjoy.com/CMT/index.m3u8 #EXTINF:-1 tvg-id="CNBC.us",CNBC -https://fl31.moveonjoy.com/CNBC/index.m3u8 +https://fl7.moveonjoy.com/CNBC/index.m3u8 #EXTINF:-1 tvg-id="CNBCWorld.us",CNBC World -https://fl31.moveonjoy.com/CNBC_World/index.m3u8 +https://fl7.moveonjoy.com/CNBC_World/index.m3u8 #EXTINF:-1 tvg-id="ComedyCentral.us@East",Comedy Central East (720p) -https://fl31.moveonjoy.com/Comedy_Central/index.m3u8 +https://fl7.moveonjoy.com/Comedy_Central/index.m3u8 #EXTINF:-1 tvg-id="ComedyTV.us",Comedy TV -https://fl31.moveonjoy.com/Comedy_TV/index.m3u8 +https://fl7.moveonjoy.com/Comedy_TV/index.m3u8 #EXTINF:-1 tvg-id="Comet.us",Comet -https://fl31.moveonjoy.com/COMET/index.m3u8 +https://fl7.moveonjoy.com/COMET/index.m3u8 #EXTINF:-1 tvg-id="CourtTV.us",Court TV -https://fl31.moveonjoy.com/COURT_TV/index.m3u8 +https://fl7.moveonjoy.com/COURT_TV/index.m3u8 #EXTINF:-1 tvg-id="CoziTV.us",Cozi TV -https://fl31.moveonjoy.com/COZI_TV/index.m3u8 +https://fl7.moveonjoy.com/COZI_TV/index.m3u8 #EXTINF:-1 tvg-id="Crave1.ca",Crave 1 -https://fl31.moveonjoy.com/CRAVE_1/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_1/index.m3u8 #EXTINF:-1 tvg-id="Crave2.ca",Crave 2 -https://fl31.moveonjoy.com/CRAVE_2/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_2/index.m3u8 #EXTINF:-1 tvg-id="Crave3.ca",Crave 3 -https://fl31.moveonjoy.com/CRAVE_3/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_3/index.m3u8 #EXTINF:-1 tvg-id="Crave4.ca",Crave 4 -https://fl31.moveonjoy.com/CRAVE_4/index.m3u8 +https://fl7.moveonjoy.com/CRAVE_4/index.m3u8 #EXTINF:-1 tvg-id="CrimePlusInvestigation.us@SD",Crime + Investigation -https://fl31.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 +https://fl7.moveonjoy.com/Crime_and_Investigation_Network/index.m3u8 #EXTINF:-1 tvg-id="CuriosityStream.us",CuriosityStream (720p) -https://fl31.moveonjoy.com/Curiosity_Stream/index.m3u8 +https://fl7.moveonjoy.com/Curiosity_Stream/index.m3u8 #EXTINF:-1 tvg-id="CVMTV.jm@SD",CVM TV -https://fl31.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 +https://fl7.moveonjoy.com/CVM_TV_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="DisneyChannel.us@East",Disney Channel East -https://fl31.moveonjoy.com/DISNEY/index.m3u8 +https://fl7.moveonjoy.com/DISNEY/index.m3u8 #EXTINF:-1 tvg-id="DisneyJunior.us@East",Disney Junior East -https://fl31.moveonjoy.com/DISNEY_JR/index.m3u8 +https://fl7.moveonjoy.com/DISNEY_JR/index.m3u8 #EXTINF:-1 tvg-id="DisneyXD.us@East",Disney XD (720p) -http://fl31.moveonjoy.com/DISNEY_XD/index.m3u8 +http://fl7.moveonjoy.com/DISNEY_XD/index.m3u8 #EXTINF:-1 tvg-id="E.us@East",E! East -https://fl31.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 +https://fl7.moveonjoy.com/E_ENTERTAINMENT_TELEVISION/index.m3u8 #EXTINF:-1 tvg-id="ESPNU.us",ESPN U (720p) -https://fl31.moveonjoy.com/ESPN_U/index.m3u8 +https://fl7.moveonjoy.com/ESPN_U/index.m3u8 #EXTINF:-1 tvg-id="ESPNews.us",ESPNews (720p) -https://fl31.moveonjoy.com/ESPN_NEWS/index.m3u8 +https://fl7.moveonjoy.com/ESPN_NEWS/index.m3u8 #EXTINF:-1 tvg-id="FanDuelSportsNetwork.us",FanDuel Sports Network -https://fl31.moveonjoy.com/PAC_12/index.m3u8 +https://fl7.moveonjoy.com/PAC_12/index.m3u8 #EXTINF:-1 tvg-id="FanDuelTV.us",FanDuel TV -https://fl31.moveonjoy.com/TVG/index.m3u8 +https://fl7.moveonjoy.com/TVG/index.m3u8 #EXTINF:-1 tvg-id="FoxBusinessNetwork.us",Fox Business Network (720p) -https://fl31.moveonjoy.com/FOX_Business_Network/index.m3u8 +https://fl7.moveonjoy.com/FOX_Business_Network/index.m3u8 #EXTINF:-1 tvg-id="FoxNewsChannel.us",Fox News Channel (720p) -https://fl31.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/FOX_NEWS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="FoxSoul.us",Fox Soul -https://fl31.moveonjoy.com/FOX_SOUL/index.m3u8 +https://fl7.moveonjoy.com/FOX_SOUL/index.m3u8 #EXTINF:-1 tvg-id="",Fox Sports 1 -https://fl31.moveonjoy.com/FOX_Sports_1/index.m3u8 +https://fl7.moveonjoy.com/FOX_Sports_1/index.m3u8 #EXTINF:-1 tvg-id="Freeform.us@East",Free form East -https://fl31.moveonjoy.com/FREE_FORM/index.m3u8 +https://fl7.moveonjoy.com/FREE_FORM/index.m3u8 #EXTINF:-1 tvg-id="Fuse.us@East",Fuse East (720p) -https://fl31.moveonjoy.com/FUSE/index.m3u8 +https://fl7.moveonjoy.com/FUSE/index.m3u8 #EXTINF:-1 tvg-id="FX.us@East",FX East -https://fl31.moveonjoy.com/FX/index.m3u8 +https://fl7.moveonjoy.com/FX/index.m3u8 #EXTINF:-1 tvg-id="FXM.us@East",FXM East -https://fl31.moveonjoy.com/FX_MOVIE/index.m3u8 +https://fl7.moveonjoy.com/FX_MOVIE/index.m3u8 #EXTINF:-1 tvg-id="FXX.us@East",FXX East -https://fl31.moveonjoy.com/FXX/index.m3u8 +https://fl7.moveonjoy.com/FXX/index.m3u8 #EXTINF:-1 tvg-id="FYI.us@East",FYI East -https://fl31.moveonjoy.com/FYI/index.m3u8 +https://fl7.moveonjoy.com/FYI/index.m3u8 #EXTINF:-1 tvg-id="GetTV.us",GetTV (480p) -https://fl31.moveonjoy.com/GET_TV/index.m3u8 +https://fl7.moveonjoy.com/GET_TV/index.m3u8 #EXTINF:-1 tvg-id="GolfChannel.us@SD",Golf Channel -https://fl31.moveonjoy.com/GOLF/index.m3u8 +https://fl7.moveonjoy.com/GOLF/index.m3u8 #EXTINF:-1 tvg-id="",Great American Country -https://fl31.moveonjoy.com/Great_American_Country/index.m3u8 +https://fl7.moveonjoy.com/Great_American_Country/index.m3u8 #EXTINF:-1 tvg-id="Grit.us",Grit -https://fl31.moveonjoy.com/GRIT_TV/index.m3u8 +https://fl7.moveonjoy.com/GRIT_TV/index.m3u8 #EXTINF:-1 tvg-id="HallmarkChannel.us@East",Hallmark Channel East -https://fl31.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="HallmarkDrama.us",Hallmark Drama (720p) -https://fl31.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_DRAMA/index.m3u8 #EXTINF:-1 tvg-id="HallmarkMoviesMysteries.us@East",Hallmark Movies Mysteries East -https://fl31.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 +https://fl7.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8 #EXTINF:-1 tvg-id="History.us@East",History -https://fl31.moveonjoy.com/history_channel/index.m3u8 +https://fl7.moveonjoy.com/history_channel/index.m3u8 #EXTINF:-1 tvg-id="HSN.us",HSN -https://fl31.moveonjoy.com/HSN/index.m3u8 +https://fl7.moveonjoy.com/HSN/index.m3u8 #EXTINF:-1 tvg-id="INSP.us",INSP -https://fl31.moveonjoy.com/INSP/index.m3u8 +https://fl7.moveonjoy.com/INSP/index.m3u8 #EXTINF:-1 tvg-id="IONPlus.us@East",ION Plus East (720p) -https://fl31.moveonjoy.com/ION_Plus/index.m3u8 +https://fl7.moveonjoy.com/ION_Plus/index.m3u8 #EXTINF:-1 tvg-id="IONTV.us@East",ION TV East -https://fl31.moveonjoy.com/ION_TV/index.m3u8 +https://fl7.moveonjoy.com/ION_TV/index.m3u8 #EXTINF:-1 tvg-id="Lifetime.us@East",Lifetime East -https://fl31.moveonjoy.com/LIFETIME/index.m3u8 +https://fl7.moveonjoy.com/LIFETIME/index.m3u8 #EXTINF:-1 tvg-id="LifetimeMovies.us@East",Lifetime Movies East -https://fl31.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/LIFETIME_MOVIE_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="LoveNature.ca",Love Nature -https://fl31.moveonjoy.com/LOVE_NATURE/index.m3u8 +https://fl7.moveonjoy.com/LOVE_NATURE/index.m3u8 #EXTINF:-1 tvg-id="",MAV TV (720p) -https://fl31.moveonjoy.com/MAV_TV/index.m3u8 +https://fl7.moveonjoy.com/MAV_TV/index.m3u8 #EXTINF:-1 tvg-id="MeTV.us",MeTV -https://fl31.moveonjoy.com/ME_TV/index.m3u8 +https://fl7.moveonjoy.com/ME_TV/index.m3u8 #EXTINF:-1 tvg-id="MGMPlus.us@East",MGM+ East -https://fl31.moveonjoy.com/EPIX/index.m3u8 +https://fl7.moveonjoy.com/EPIX/index.m3u8 #EXTINF:-1 tvg-id="MGMPlusMarquee.us",MGM+ Marquee -https://fl31.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 +https://fl7.moveonjoy.com/EPIX_DRIVE_IN/index.m3u8 #EXTINF:-1 tvg-id="MilitaryHistory.us",Military History -https://fl31.moveonjoy.com/Military_History/index.m3u8 +https://fl7.moveonjoy.com/Military_History/index.m3u8 #EXTINF:-1 tvg-id="MLBNetwork.us",MLB Network -https://fl31.moveonjoy.com/MLB_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/MLB_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="MSG.us",MSG -https://fl31.moveonjoy.com/MSG/index.m3u8 +https://fl7.moveonjoy.com/MSG/index.m3u8 #EXTINF:-1 tvg-id="MTV2.us@East",MTV2 (720p) -https://fl31.moveonjoy.com/MTV_2/index.m3u8 +https://fl7.moveonjoy.com/MTV_2/index.m3u8 #EXTINF:-1 tvg-id="MTVClassic.us@East",MTV Classic (360p) -https://fl31.moveonjoy.com/MTV_CLASSIC/index.m3u8 +https://fl7.moveonjoy.com/MTV_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="MTV.us@East",MTV East -https://fl31.moveonjoy.com/MTV/index.m3u8 +https://fl7.moveonjoy.com/MTV/index.m3u8 #EXTINF:-1 tvg-id="MTVLive.us",MTV Live (720p) -https://fl31.moveonjoy.com/MTV_LIVE/index.m3u8 +https://fl7.moveonjoy.com/MTV_LIVE/index.m3u8 #EXTINF:-1 tvg-id="MTVU.us",mtvU (480p) -https://fl31.moveonjoy.com/MTV_U/index.m3u8 +https://fl7.moveonjoy.com/MTV_U/index.m3u8 #EXTINF:-1 tvg-id="Much.ca",Much (720p) -https://fl31.moveonjoy.com/MUCH/index.m3u8 +https://fl7.moveonjoy.com/MUCH/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographic.us@East",National Geographic East -https://fl31.moveonjoy.com/National_Geographic/index.m3u8 +https://fl7.moveonjoy.com/National_Geographic/index.m3u8 #EXTINF:-1 tvg-id="NationalGeographicWild.us@East",National Geographic Wild East -https://fl31.moveonjoy.com/Nat_Geo_Wild/index.m3u8 +https://fl7.moveonjoy.com/Nat_Geo_Wild/index.m3u8 #EXTINF:-1 tvg-id="NBATV.us",NBA TV -https://fl31.moveonjoy.com/NBA_TV/index.m3u8 +https://fl7.moveonjoy.com/NBA_TV/index.m3u8 #EXTINF:-1 tvg-id="NewsNation.us@East",News Nation (720p) -https://fl31.moveonjoy.com/NEWS_NATION/index.m3u8 +https://fl7.moveonjoy.com/NEWS_NATION/index.m3u8 #EXTINF:-1 tvg-id="NFLNetwork.us",NFL Network -https://fl31.moveonjoy.com/NFL_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/NFL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NFLRedZone.us",NFL RedZone -https://fl31.moveonjoy.com/NFL_RedZone/index.m3u8 +https://fl7.moveonjoy.com/NFL_RedZone/index.m3u8 #EXTINF:-1 tvg-id="NHLNetwork.us",NHL Network (720p) -https://fl31.moveonjoy.com/NHL_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/NHL_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="NickJr.us@East",Nick Jr. East (720p) -https://fl31.moveonjoy.com/NICK_JR/index.m3u8 +https://fl7.moveonjoy.com/NICK_JR/index.m3u8 #EXTINF:-1 tvg-id="NickMusic.us",Nick Music (720p) -https://fl31.moveonjoy.com/NICK_MUSIC/index.m3u8 +https://fl7.moveonjoy.com/NICK_MUSIC/index.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.us@East",Nickelodeon East -https://fl31.moveonjoy.com/NICKELODEON/index.m3u8 +https://fl7.moveonjoy.com/NICKELODEON/index.m3u8 #EXTINF:-1 tvg-id="Nicktoons.us@East",Nicktoons East -https://fl31.moveonjoy.com/NICKTOONS/index.m3u8 +https://fl7.moveonjoy.com/NICKTOONS/index.m3u8 #EXTINF:-1 tvg-id="OutdoorChannel.us",Outdoor Channel -https://fl31.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/OUTDOOR_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="OuterMax.us@East",OuterMax East (720p) -https://fl31.moveonjoy.com/OUTER_MAX/index.m3u8 +https://fl7.moveonjoy.com/OUTER_MAX/index.m3u8 #EXTINF:-1 tvg-id="OutsideTV.us",Outside TV -https://fl31.moveonjoy.com/OUTSIDE_TV/index.m3u8 +https://fl7.moveonjoy.com/OUTSIDE_TV/index.m3u8 #EXTINF:-1 tvg-id="Ovation.us",Ovation (1080p) -https://fl31.moveonjoy.com/Ovation/index.m3u8 +https://fl7.moveonjoy.com/Ovation/index.m3u8 #EXTINF:-1 tvg-id="Oxygen.us@East",Oxygen East -https://fl31.moveonjoy.com/OXYGEN/index.m3u8 +https://fl7.moveonjoy.com/OXYGEN/index.m3u8 #EXTINF:-1 tvg-id="ParamountNetwork.us@East",Paramount Network East -https://fl31.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="PopTV.us",Pop TV -https://fl31.moveonjoy.com/Pop_TV/index.m3u8 +https://fl7.moveonjoy.com/Pop_TV/index.m3u8 #EXTINF:-1 tvg-id="PursuitChannel.us",Pursuit Channel (720p) -https://fl31.moveonjoy.com/Pursuit_Channel/index.m3u8 +https://fl7.moveonjoy.com/Pursuit_Channel/index.m3u8 #EXTINF:-1 tvg-id="QVC.us",QVC (720p) -https://fl31.moveonjoy.com/QVC/index.m3u8 +https://fl7.moveonjoy.com/QVC/index.m3u8 #EXTINF:-1 tvg-id="Reelz.us",Reelz (720p) -https://fl31.moveonjoy.com/REELZ/index.m3u8 +https://fl7.moveonjoy.com/REELZ/index.m3u8 #EXTINF:-1 tvg-id="Revolt.us",Revolt -https://fl31.moveonjoy.com/REVOLT/index.m3u8 +https://fl7.moveonjoy.com/REVOLT/index.m3u8 #EXTINF:-1 tvg-id="Showtime2.us@East",Showtime 2 East -https://fl31.moveonjoy.com/SHOWTIME_2/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_2/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@East",Showtime East -https://fl31.moveonjoy.com/SHOWTIME/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeNext.us@East",Showtime Next East -https://fl31.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_NEXT/index.m3u8 #EXTINF:-1 tvg-id="Showtime.us@West",Showtime West (1080p) -https://fl31.moveonjoy.com/SHOWTIME_WEST/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_WEST/index.m3u8 #EXTINF:-1 tvg-id="ShowtimeWomen.us@East",Showtime Women East -https://fl31.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 +https://fl7.moveonjoy.com/SHOWTIME_WOMEN/index.m3u8 #EXTINF:-1 tvg-id="SmithsonianChannel.us@East",Smithsonian Channel East -https://fl31.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/SMITHSONIAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SonyChannel.mx",Sony Channel -https://fl31.moveonjoy.com/Sony_Movie_Channel/index.m3u8 +https://fl7.moveonjoy.com/Sony_Movie_Channel/index.m3u8 #EXTINF:-1 tvg-id="SportsmanChannel.us",Sportsman Channel -https://fl31.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/SPORTSMAN_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="SportsNetNewYork.us",SportsNet New York (540p) -https://fl31.moveonjoy.com/SNY/index.m3u8 +https://fl7.moveonjoy.com/SNY/index.m3u8 #EXTINF:-1 tvg-id="StartTV.us",Start TV -https://fl31.moveonjoy.com/Start_Tv/index.m3u8 +https://fl7.moveonjoy.com/Start_Tv/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@East",Starz East -https://fl31.moveonjoy.com/STARZ/index.m3u8 +https://fl7.moveonjoy.com/STARZ/index.m3u8 #EXTINF:-1 tvg-id="StarzEncoreClassic.us@East",Starz Encore Classic East -https://fl31.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 +https://fl7.moveonjoy.com/STARZ_ENCORE_CLASSIC/index.m3u8 #EXTINF:-1 tvg-id="Starz.us@West",Starz West -https://fl31.moveonjoy.com/STARZ_WEST/index.m3u8 +https://fl7.moveonjoy.com/STARZ_WEST/index.m3u8 #EXTINF:-1 tvg-id="StoriesbyAMC.us@EastHD",Stories by AMC (1080p) -http://fl31.moveonjoy.com/AMC_NETWORK/index.m3u8 +http://fl7.moveonjoy.com/AMC_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="SundanceTV.us@East",Sundance TV East -https://fl31.moveonjoy.com/SUNDANCE/index.m3u8 +https://fl7.moveonjoy.com/SUNDANCE/index.m3u8 #EXTINF:-1 tvg-id="Syfy.us@East",Syfy East -https://fl31.moveonjoy.com/SYFY/index.m3u8 +https://fl7.moveonjoy.com/SYFY/index.m3u8 #EXTINF:-1 tvg-id="TeenNick.us",TeenNick -https://fl31.moveonjoy.com/Teen_Nick/index.m3u8 +https://fl7.moveonjoy.com/Teen_Nick/index.m3u8 #EXTINF:-1 tvg-id="TennisChannel.us",Tennis Channel -https://fl31.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 +https://fl7.moveonjoy.com/TENNIS_CHANNEL/index.m3u8 #EXTINF:-1 tvg-id="TheCowboyChannel.us",The Cowboy Channel -https://fl31.moveonjoy.com/Cowboy_Channel/index.m3u8 +https://fl7.moveonjoy.com/Cowboy_Channel/index.m3u8 #EXTINF:-1 tvg-id="TSN1.ca",TSN1 (1080p) -https://fl31.moveonjoy.com/TSN_1/index.m3u8 +https://fl7.moveonjoy.com/TSN_1/index.m3u8 #EXTINF:-1 tvg-id="TSN2.ca",TSN2 -https://fl31.moveonjoy.com/TSN_2/index.m3u8 +https://fl7.moveonjoy.com/TSN_2/index.m3u8 #EXTINF:-1 tvg-id="TSN3.ca",TSN3 -https://fl31.moveonjoy.com/TSN_3/index.m3u8 +https://fl7.moveonjoy.com/TSN_3/index.m3u8 #EXTINF:-1 tvg-id="TSN4.ca",TSN4 -https://fl31.moveonjoy.com/TSN_4/index.m3u8 +https://fl7.moveonjoy.com/TSN_4/index.m3u8 #EXTINF:-1 tvg-id="TSN5.ca",TSN5 -https://fl31.moveonjoy.com/TSN_5/index.m3u8 +https://fl7.moveonjoy.com/TSN_5/index.m3u8 #EXTINF:-1 tvg-id="TVLand.us@East",TV Land -https://fl31.moveonjoy.com/TV_LAND/index.m3u8 +https://fl7.moveonjoy.com/TV_LAND/index.m3u8 #EXTINF:-1 tvg-id="TVOne.us",TV One -https://fl31.moveonjoy.com/TV_ONE/index.m3u8 +https://fl7.moveonjoy.com/TV_ONE/index.m3u8 #EXTINF:-1 tvg-id="TVJ.jm",TVJ (720p) -https://fl31.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 +https://fl7.moveonjoy.com/TVJ_CARIBBEAN/index.m3u8 #EXTINF:-1 tvg-id="UpTV.us",Up TV (1080p) -https://fl31.moveonjoy.com/Up_Tv/index.m3u8 +https://fl7.moveonjoy.com/Up_Tv/index.m3u8 #EXTINF:-1 tvg-id="USANetwork.us@East",USA Network (720p) -http://fl31.moveonjoy.com/USA_NETWORK/index.m3u8 +http://fl7.moveonjoy.com/USA_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="VH1.us@East",VH1 East -https://fl31.moveonjoy.com/VH1/index.m3u8 +https://fl7.moveonjoy.com/VH1/index.m3u8 #EXTINF:-1 tvg-id="VICETV.us",VICE TV (720p) -https://fl31.moveonjoy.com/VICELAND/index.m3u8 +https://fl7.moveonjoy.com/VICELAND/index.m3u8 #EXTINF:-1 tvg-id="WNetwork.ca@East",W Network (720p) -https://fl31.moveonjoy.com/W_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/W_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WeTV.us@East",We TV East -https://fl31.moveonjoy.com/WE_TV/index.m3u8 +https://fl7.moveonjoy.com/WE_TV/index.m3u8 #EXTINF:-1 tvg-id="WFLADT1.us@SD",WFLA-DT1 -https://fl31.moveonjoy.com/FL_Tampa_NBC/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_NBC/index.m3u8 #EXTINF:-1 tvg-id="WFLXDT1.us@SD",WFLX-DT1 -https://fl31.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 +https://fl7.moveonjoy.com/FL_West_Palm_Beach_FOX/index.m3u8 #EXTINF:-1 tvg-id="WFTSDT1.us@SD",WFTS-DT1 -https://fl31.moveonjoy.com/FL_Tampa_ABC/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_ABC/index.m3u8 #EXTINF:-1 tvg-id="WGNDT1.us",WGN-DT1 (720p) -https://fl31.moveonjoy.com/WGN/index.m3u8 +https://fl7.moveonjoy.com/WGN/index.m3u8 #EXTINF:-1 tvg-id="Willow.us",Willow -https://fl31.moveonjoy.com/WILLOW_CRICKET/index.m3u8 +https://fl7.moveonjoy.com/WILLOW_CRICKET/index.m3u8 #EXTINF:-1 tvg-id="WKCFDT1.us@SD",WKCF-DT1 -https://fl31.moveonjoy.com/CW_ORLANDO/index.m3u8 +https://fl7.moveonjoy.com/CW_ORLANDO/index.m3u8 #EXTINF:-1 tvg-id="WNBCDT1.us",WNBC-DT1 -https://fl31.moveonjoy.com/NBC_EAST/index.m3u8 +https://fl7.moveonjoy.com/NBC_EAST/index.m3u8 #EXTINF:-1 tvg-id="WorldFishingNetwork.us",World Fishing Network -https://fl31.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/WORLD_FISHING_NETWORK/index.m3u8 #EXTINF:-1 tvg-id="WPECDT1.us@SD",WPEC-DT1 -https://fl31.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 +https://fl7.moveonjoy.com/FL_West_Palm_Beach_CBS/index.m3u8 #EXTINF:-1 tvg-id="WTOGDT1.us@SD",WTOG-DT1 -https://fl31.moveonjoy.com/FL_Tampa_CW44/index.m3u8 +https://fl7.moveonjoy.com/FL_Tampa_CW44/index.m3u8 #EXTINF:-1 tvg-id="WVGNLD1.vi@SD",WVGN-LD1 -https://fl31.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 +https://fl7.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 #EXTINF:-1 tvg-id="YesNetwork.us",Yes Network -https://fl31.moveonjoy.com/YES_NETWORK/index.m3u8 +https://fl7.moveonjoy.com/YES_NETWORK/index.m3u8 From 278b963bf31e7f6a953bbf55c6afe343f6e8d8da Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 23:05:35 +0200 Subject: [PATCH 17/51] Update us.m3u --- streams/us.m3u | 4 ---- 1 file changed, 4 deletions(-) diff --git a/streams/us.m3u b/streams/us.m3u index 4d36b3be04..4aa37e7b97 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1034,8 +1034,6 @@ https://2-fss-1.streamhoster.com/pl_154/205722-2251224-1/playlist.m3u8 https://e5.thetvapp.to/hls/DisneyChannelEast/tracks-v2a1/mono.m3u8? #EXTINF:-1 tvg-id="TVAsia.us@SD",TV Asia (1080p) https://amg00206-amg00206c1-distrotv-us-6886.playouts.now.amagi.tv/24-25-6886.m3u8 -#EXTINF:-1 tvg-id="WOFLDT1.us@SD",WOFL-DT1 (720p) -https://fl25.moveonjoy.com/FOX_EAST/index.m3u8 #EXTINF:-1 tvg-id="WPIXDT1.us@SD",WPIX-DT1 https://e1.thetvapp.to/hls/WPIX/tracks-v2a1/mono.m3u8? #EXTINF:-1 tvg-id="FailArmy.us@Spain",FailArmy Spain @@ -1044,8 +1042,6 @@ http://stitcher-ipv4.pluto.tv/v1/stitch/embed/hls/channel/5f1abf5fafb5ee0007d4d0 https://livehub-voidnet.onrender.com/cluster/streamcore/us/NBC_REDIS.m3u8 #EXTINF:-1 tvg-id="WJLPDT1.us@SD",WJLP-DT1 https://e5.thetvapp.to/hls/metv-wjlp-new-jerseynew-york/tracks-v2a1/mono.m3u8? -#EXTINF:-1 tvg-id="WCBSDT1.us@SD",WCBS-DT1 (720p) -https://fl25.moveonjoy.com/CBSEAST/index.m3u8 #EXTINF:-1 tvg-id="Charge.us",Charge! (1080p) https://fast-channels.sinclairstoryline.com/CHARGE/index.m3u8 #EXTINF:-1 tvg-id="TheWalkTV.us",The Walk TV (720p) From 6634656e847076dadf3b0f41845915baaee664ae Mon Sep 17 00:00:00 2001 From: archrootsda Date: Sun, 5 Oct 2025 23:07:06 +0200 Subject: [PATCH 18/51] Update us_moveonjoy.m3u --- streams/us_moveonjoy.m3u | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index db44891ce1..5bad51b758 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -303,3 +303,7 @@ https://fl7.moveonjoy.com/FL_Tampa_CW44/index.m3u8 https://fl7.moveonjoy.com/Virgin_Islands_NBC/index.m3u8 #EXTINF:-1 tvg-id="YesNetwork.us",Yes Network https://fl7.moveonjoy.com/YES_NETWORK/index.m3u8 +#EXTINF:-1 tvg-id="WOFLDT1.us@SD",WOFL-DT1 (720p) +https://fl7.moveonjoy.com/FOX_EAST/index.m3u8 +#EXTINF:-1 tvg-id="WCBSDT1.us@SD",WCBS-DT1 (720p) +https://fl7.moveonjoy.com/CBSEAST/index.m3u8 From ad0681bb233af081e845c75ba4ef27f40b3a0674 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 00:12:58 +0000 Subject: [PATCH 19/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18266274466) workflow. closes #27771, closes #27652, closes #27687, closes #27517, closes #27778, closes #27777, closes #27776, closes #27774, closes #27773, closes #27772, closes #27770, closes #27768, closes #27767, closes #27766, closes #27765, closes #27763, closes #27762, closes #27760, closes #27759, closes #27756, closes #27755, closes #27754, closes #27752, closes #27750, closes #27749, closes #27748, closes #27747, closes #27746, closes #27745, closes #27744, closes #27743, closes #27742, closes #27741, closes #27740, closes #27739, closes #27738, closes #27737, closes #27736, closes #27735, closes #27734, closes #27733, closes #27732, closes #27730, closes #27729, closes #27728, closes #27727, closes #27726, closes #27725, closes #27724, closes #27723, closes #27722, closes #27721, closes #27720, closes #27719, closes #27718, closes #27717, closes #27716, closes #27715, closes #27714, closes #27711, closes #27710, closes #27709, closes #27707, closes #27706, closes #27705, closes #27704, closes #27703, closes #27700, closes #27698, closes #27697, closes #27695, closes #27694, closes #27693, closes #27692, closes #27691, closes #27690, closes #27689, closes #27688, closes #27686, closes #27685, closes #27684, closes #27683, closes #27682, closes #27675, closes #27674, closes #27672, closes #27671, closes #27670, closes #27669, closes #27668, closes #27666, closes #27665, closes #27664, closes #27663, closes #27662, closes #27661, closes #27660, closes #27659, closes #27658, closes #27657, closes #27651, closes #27650, closes #27649, closes #27648, closes #27647, closes #27646, closes #27645, closes #27644, closes #27642, closes #27641, closes #27640, closes #27639, closes #27637, closes #27636, closes #27635, closes #27634, closes #27633, closes #27632, closes #27631, closes #27629, closes #27628, closes #27627, closes #27626, closes #27625, closes #27624, closes #27623, closes #27622, closes #27621, closes #27620, closes #27619, closes #27618, closes #27617, closes #27616, closes #27615, closes #27614, closes #27613, closes #27612, closes #27611, closes #27610, closes #27609, closes #27608, closes #27607, closes #27606, closes #27605, closes #27604, closes #27603, closes #27602, closes #27601, closes #27600, closes #27599, closes #27598, closes #27597, closes #27596, closes #27595, closes #27594, closes #27593, closes #27592, closes #27591, closes #27590, closes #27589, closes #27588, closes #27587, closes #27586, closes #27585, closes #27583, closes #27582, closes #27581, closes #27580, closes #27579, closes #27578, closes #27577, closes #27576, closes #27575, closes #27574, closes #27573, closes #27572, closes #27571, closes #27570, closes #27569, closes #27568, closes #27567, closes #27565, closes #27564, closes #27561, closes #27559, closes #27558, closes #27557, closes #27556, closes #27555, closes #27554, closes #27553, closes #27552, closes #27551, closes #27550, closes #27549, closes #27548, closes #27547, closes #27546, closes #27545, closes #27544, closes #27543, closes #27542, closes #27541, closes #27540, closes #27539, closes #27538, closes #27537, closes #27536, closes #27535, closes #27534, closes #27533, closes #27532, closes #27531, closes #27530, closes #27529, closes #27528, closes #27527, closes #27526, closes #27525, closes #27524, closes #27523, closes #27522, closes #27521, closes #27520, closes #27519, closes #27518, closes #27516, closes #27515, closes #27514, closes #27481, closes #27451, closes #27100 --- streams/bf.m3u | 22 ++++++++++++++++++++- streams/bi.m3u | 4 +++- streams/bj.m3u | 8 ++++++++ streams/bw.m3u | 6 ++++++ streams/cd.m3u | 8 ++++++++ streams/cf.m3u | 3 +++ streams/cg.m3u | 2 ++ streams/ci.m3u | 6 ++++++ streams/cm.m3u | 24 +++++++++++++++++++++++ streams/cn.m3u | 6 ++++++ streams/dj.m3u | 2 ++ streams/dz.m3u | 22 +++++++++++++++++++++ streams/eg.m3u | 12 ++++++++++++ streams/fr.m3u | 8 ++++++++ streams/gm.m3u | 4 ++++ streams/gn.m3u | 12 ++++++++++++ streams/gq.m3u | 2 ++ streams/in.m3u | 2 ++ streams/ke.m3u | 42 +++++++++++++++++++++++++++++++++++++++- streams/lr.m3u | 2 ++ streams/ma.m3u | 4 ++++ streams/ml.m3u | 16 +++++++++++++++ streams/mz.m3u | 4 ++++ streams/na.m3u | 2 ++ streams/ne.m3u | 22 +++++++++++++++++++++ streams/ng.m3u | 12 ++++++++++++ streams/pe.m3u | 22 ++++++++++++++++++--- streams/rw.m3u | 6 ++++++ streams/sa.m3u | 2 ++ streams/sd.m3u | 2 ++ streams/sn.m3u | 12 ++++++++++++ streams/so.m3u | 2 ++ streams/td.m3u | 2 ++ streams/tg.m3u | 4 ++++ streams/tn.m3u | 8 ++++++++ streams/tz.m3u | 26 +++++++++++++++++++++++++ streams/ug.m3u | 40 ++++++++++++++++++++++++++++++++++++++ streams/uk.m3u | 8 ++++++++ streams/us.m3u | 24 +++++++++++++++++++++++ streams/us_moveonjoy.m3u | 2 -- streams/za.m3u | 16 +++++++++++++++ streams/zm.m3u | 32 +++++++++++++++++++++++++++++- streams/zw.m3u | 6 ++++++ 43 files changed, 462 insertions(+), 9 deletions(-) create mode 100644 streams/cf.m3u diff --git a/streams/bf.m3u b/streams/bf.m3u index 15c9191e1f..f8ae34f5d6 100644 --- a/streams/bf.m3u +++ b/streams/bf.m3u @@ -1,9 +1,29 @@ #EXTM3U #EXTINF:-1 tvg-id="BF1.bf@SD",BF1 -https://cdn-u.bozztv.com/usn1/cdntulix-astv33/bf1tv/playlist.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/bf1/playlist.m3u8 #EXTINF:-1 tvg-id="BurkinaInfoTV.bf",Burkina Info TV (540p) http://69.64.57.208/burkinainfo/index.m3u8 #EXTINF:-1 tvg-id="RTB.bf",RTB (360p) [Not 24/7] https://edge12.vedge.infomaniak.com/livecast/ik:rtblive1_8/manifest.m3u8 #EXTINF:-1 tvg-id="RTB3.bf",RTB 3 https://edge13.vedge.infomaniak.com/livecast/ik:rtb3-1/manifest.m3u8 +#EXTINF:-1 tvg-id="SavaneTV.bf@SD",Savane TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/savanetv/playlist.m3u8 +#EXTINF:-1 tvg-id="3TV.bf@SD",3TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/3tv/playlist.m3u8 +#EXTINF:-1 tvg-id="BurkinaInfoTV.bf@SD",Burkina Info TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/burkinainfo/playlist.m3u8 +#EXTINF:-1 tvg-id="RTB3.bf@SD",RTB 3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/rtb3/playlist.m3u8 +#EXTINF:-1 tvg-id="TVMaria.bf@SD",TV Maria +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/tv-maria/playlist.m3u8 +#EXTINF:-1 tvg-id="ImpactTV.bf@SD",Impact TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/impacttv/playlist.m3u8 +#EXTINF:-1 tvg-id="CVK.bf@SD",CVK +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/cvk/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal3.bf@SD",Canal 3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/canal3/playlist.m3u8 +#EXTINF:-1 tvg-id="RTBZenith.bf@SD",RTB Zenith +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/rtbzenith/playlist.m3u8 +#EXTINF:-1 tvg-id="RTB.bf@SD",RTB +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/rtb/playlist.m3u8 diff --git a/streams/bi.m3u b/streams/bi.m3u index fcd718794a..e0b3056fa9 100644 --- a/streams/bi.m3u +++ b/streams/bi.m3u @@ -1 +1,3 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="RTNBTV.bi@SD",RTNB TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/rtnb2/playlist.m3u8 diff --git a/streams/bj.m3u b/streams/bj.m3u index aa084a8479..c9aa06f0de 100644 --- a/streams/bj.m3u +++ b/streams/bj.m3u @@ -17,3 +17,11 @@ https://strhls.streamakaci.tv/ortb/ortb1-multi/playlist.m3u8 https://stream.it-innov.com/powertv/index.fmp4.m3u8 #EXTINF:-1 tvg-id="TVCBenin.bj",TVC Bénin (720p) https://live.tvcbenin.com/direct/729c37a1d3319ee21991227b1f84c687.sdp/playlist.m3u8 +#EXTINF:-1 tvg-id="TVCBenin.bj@SD",TVC Benin +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/tvcbenin/playlist.m3u8 +#EXTINF:-1 tvg-id="EdenTV.bj@SD",Eden TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/edentv/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal3Benin.bj@SD",Canal 3 Benin +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/canal3benin/playlist.m3u8 +#EXTINF:-1 tvg-id="ORTBTV.bj@SD",ORTB TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/ortb/playlist.m3u8 diff --git a/streams/bw.m3u b/streams/bw.m3u index a3f6e288ad..bdf7e610d3 100644 --- a/streams/bw.m3u +++ b/streams/bw.m3u @@ -1,3 +1,9 @@ #EXTM3U #EXTINF:-1 tvg-id="BTV1.bw@SD",BTV 1 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/btv1/playlist.m3u8 +#EXTINF:-1 tvg-id="BTVNews.bw@SD",BTV News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/btvnews/playlist.m3u8 +#EXTINF:-1 tvg-id="YTV.bw",YTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/ytvbotswana/playlist.m3u8 +#EXTINF:-1 tvg-id="BTV2.bw",BTV 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/btv2/playlist.m3u8 diff --git a/streams/cd.m3u b/streams/cd.m3u index 56c7be41a0..9079e544aa 100644 --- a/streams/cd.m3u +++ b/streams/cd.m3u @@ -49,3 +49,11 @@ http://69.64.57.208/rtnc/playlist.m3u8 http://51.254.199.122:8080/e-cableRTNC3/index.m3u8 #EXTINF:-1 tvg-id="RTVS1.cd@SD",RTVS1 http://51.254.199.122:8080/RTVS1/index.m3u8 +#EXTINF:-1 tvg-id="BOneTV.cd@SD",B-One TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/b-one/playlist.m3u8 +#EXTINF:-1 tvg-id="Kin24.cd@SD",Kin24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/kin24/playlist.m3u8 +#EXTINF:-1 tvg-id="RTGAWorld.cd@SD",RTGA World +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/rtga/playlist.m3u8 +#EXTINF:-1 tvg-id="CanalCVVInternational.cd@SD",Canal CVV International +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/cvvtv/playlist.m3u8 diff --git a/streams/cf.m3u b/streams/cf.m3u new file mode 100644 index 0000000000..426047fc5f --- /dev/null +++ b/streams/cf.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="TVCentrafricaine.cf",TV Centrafricaine +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/tcf/playlist.m3u8 diff --git a/streams/cg.m3u b/streams/cg.m3u index fca3aae4f1..d582661538 100644 --- a/streams/cg.m3u +++ b/streams/cg.m3u @@ -13,3 +13,5 @@ http://69.64.57.208/telecongo/playlist.m3u8 http://trn03.bozztv.com/gin-telecongo/index.m3u8 #EXTINF:-1 tvg-id="TeleCongo.cg",Télé Congo (720p) http://51.254.199.122:8080/telecongo/index.m3u8 +#EXTINF:-1 tvg-id="TeleCongo.cg@SD",Tele Congo +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/telecongo/playlist.m3u8 diff --git a/streams/ci.m3u b/streams/ci.m3u index d8c543fc40..462b396dc0 100644 --- a/streams/ci.m3u +++ b/streams/ci.m3u @@ -47,3 +47,9 @@ http://69.64.57.208/la3/index.m3u8 https://cdn140m.panaccess.com/HLS/RTVC/index.m3u8 #EXTINF:-1 tvg-id="TVAlBayane.ci",TV Al Bayane (360p) http://69.64.57.208/albayanetv/index.m3u8 +#EXTINF:-1 tvg-id="BenieTV.ci@SD",Benie TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/benietv/playlist.m3u8 +#EXTINF:-1 tvg-id="7Info.ci@SD",7 Info +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/7info/playlist.m3u8 +#EXTINF:-1 tvg-id="RTI1.ci@SD",RTI 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/rti/playlist.m3u8 diff --git a/streams/cm.m3u b/streams/cm.m3u index 2c1bf13a60..33ec8c36b0 100644 --- a/streams/cm.m3u +++ b/streams/cm.m3u @@ -31,3 +31,27 @@ http://connectiktv.ddns.net:5000/plextv/@plextv/playlist.m3u8 https://stream.it-innov.com/tr24/index.m3u8 #EXTINF:-1 tvg-id="Vision4.cm",Vision 4 (360p) https://cdn-globecast.akamaized.net/live/eds/vision4/hls_video/index.m3u8 +#EXTINF:-1 tvg-id="RevivalChannel.cm@SD",Revival Channel +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/revivalchannel/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal2Movies.cm@SD",Canal 2 Movies +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/canal2movies/playlist.m3u8 +#EXTINF:-1 tvg-id="CAM10TV.cm@SD",CAM 10 TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/cam10tv/playlist.m3u8 +#EXTINF:-1 tvg-id="BalafonTV.cm@SD",Balafon TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/balafontv/playlist.m3u8 +#EXTINF:-1 tvg-id="MyMovieFrench.cm@SD",My Movie French +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/mymoviesfrench/playlist.m3u8 +#EXTINF:-1 tvg-id="STV.cm@SD",STV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/stvcameroon/playlist.m3u8 +#EXTINF:-1 tvg-id="Bnews1.cm@SD",Bnews1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/bnews1/playlist.m3u8 +#EXTINF:-1 tvg-id="AfriqueMedia.cm@SD",Afrique Media +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/afriquemedia/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal2International.cm@SD",Canal 2 International +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/canal2international/playlist.m3u8 +#EXTINF:-1 tvg-id="CRTVSportsandEntertainment.cm@SD",CRTV Sports and Entertainment +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/crtvsports/playlist.m3u8 +#EXTINF:-1 tvg-id="CRTVNews.cm@SD",CRTV News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/crtvnews/playlist.m3u8 +#EXTINF:-1 tvg-id="CRTV.cm@SD",CRTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/crtv/playlist.m3u8 diff --git a/streams/cn.m3u b/streams/cn.m3u index 5903f6ea8d..0d9a27a016 100644 --- a/streams/cn.m3u +++ b/streams/cn.m3u @@ -1399,3 +1399,9 @@ http://hlsal-ldvt.qing.mgtv.com/nn_live/nn_x64/dWlwPTEyNy4wLjAuMSZ1aWQ9cWluZy1jb https://tvlive.i0834.cn/nmip-media/channellive/channel115044/playlist.m3u8 #EXTINF:-1 tvg-id="ZhejiangSatelliteTV.cn",Zhejiang Satellite TV https://play-qukan.cztv.com/live/1758879019692345.m3u8 +#EXTINF:-1 tvg-id="STBongo.cn@SD",ST Bongo +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/stbongo/playlist.m3u8 +#EXTINF:-1 tvg-id="STRemboTV.cn@SD",ST Rembo TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/rembotv/playlist.m3u8 +#EXTINF:-1 tvg-id="CCTV4Europe.cn@SD",CCTV-4 Europe +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/cctv4/playlist.m3u8 diff --git a/streams/dj.m3u b/streams/dj.m3u index 926cc0b83a..cac6818bac 100644 --- a/streams/dj.m3u +++ b/streams/dj.m3u @@ -3,3 +3,5 @@ https://dvrfl06.bozztv.com/astv-djibouti/index.m3u8 #EXTINF:-1 tvg-id="RTD4.dj@SD",RTD 4 http://dvrfl05.bozztv.com/gin-rtddjibouti/index.m3u8 +#EXTINF:-1 tvg-id="RTD4.dj@SD",RTD 4 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/rtddjibouti/playlist.m3u8 diff --git a/streams/dz.m3u b/streams/dz.m3u index 643213e98e..8138a8e367 100644 --- a/streams/dz.m3u +++ b/streams/dz.m3u @@ -29,3 +29,25 @@ http://149.62.177.98:8000/play/a01w/index.m3u8 http://149.62.177.98:8000/play/a01x/index.m3u8 #EXTINF:-1 tvg-id="TV9.dz@SD",TV9 El-Barlamaniya (1080p) http://149.62.177.98:8000/play/a01y/index.m3u8 +#EXTINF:-1 tvg-id="ZAHRATV.dz@SD",ZAHRA TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/zahratv/playlist.m3u8 +#EXTINF:-1 tvg-id="SamiraTV.dz@SD",Samira TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/samiratv/playlist.m3u8 +#EXTINF:-1 tvg-id="OneTV.dz@SD",One TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/onetv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElDjazairN1.dz@SD",El Djazair N1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/eldjazairn1/playlist.m3u8 +#EXTINF:-1 tvg-id="ElHeddafTV.dz@SD",El-Heddaf TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elheddaftv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElHayatTV.dz@SD",El Hayat TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elbiladtv/playlist.m3u8 +#EXTINF:-1 tvg-id="BahiaTV.dz@SD",Bahia TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/bahiatv/playlist.m3u8 +#EXTINF:-1 tvg-id="EnnaharTV.dz@SD",Ennahar TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/ennahartv/playlist.m3u8 +#EXTINF:-1 tvg-id="EchoroukTV.dz@SD",Echorouk TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/echorouktv/playlist.m3u8 +#EXTINF:-1 tvg-id="EchoroukNews.dz@SD",Echorouk News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/echorouknews/playlist.m3u8 +#EXTINF:-1 tvg-id="TV2.dz@SD",TV2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/canalalgerie/playlist.m3u8 diff --git a/streams/eg.m3u b/streams/eg.m3u index 30c8bcddc4..d154d56660 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -72,3 +72,15 @@ https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/alhayatcinema/playlist https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/ctv/playlist.m3u8 #EXTINF:-1 tvg-id="SadaElbaladDrama.eg@SD",Sada Elbalad Drama https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/sadaalbaladdrama/playlist.m3u8 +#EXTINF:-1 tvg-id="AlKaheraWalNas2.eg@SD",Al Kahera Wal Nas 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alkaherawalnas2/playlist.m3u8 +#EXTINF:-1 tvg-id="ERTU1.eg@SD",ERTU 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/aloula/playlist.m3u8 +#EXTINF:-1 tvg-id="AlShamsTV.eg@SD",Al Shams TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alshams/playlist.m3u8 +#EXTINF:-1 tvg-id="AlHadathAlyoum.eg@SD",AlHadath Alyoum +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/alhadathalyoum/playlist.m3u8 +#EXTINF:-1 tvg-id="EgyptianTV.eg@SD",Egyptian TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/egyptiantvhd/playlist.m3u8 +#EXTINF:-1 tvg-id="AghapyTV.eg@SD",Aghapy TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/aghapytv/playlist.m3u8 diff --git a/streams/fr.m3u b/streams/fr.m3u index 705fe9b782..ed56b3ff3b 100644 --- a/streams/fr.m3u +++ b/streams/fr.m3u @@ -359,3 +359,11 @@ https://viamotionhsi.netplus.ch/live/eds/canalplusclair/browser-HLS8/canalpluscl https://viamotionhsi.netplus.ch/live/eds/paramount/browser-HLS8/paramount.m3u8 #EXTINF:-1 tvg-id="FashionTVParisLOriginal.fr@SD",FashionTV Paris L'Original (1080p) https://edge-fast3.evrideo.tv/bfdbb576-83f7-11f0-9f89-0200170e3e04_1000028043_HLS/manifest.m3u8 +#EXTINF:-1 tvg-id="Africa24.fr@SD",Africa 24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/africa24/playlist.m3u8 +#EXTINF:-1 tvg-id="DBMTV.fr@SD",DBM TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/dbmtv/playlist.m3u8 +#EXTINF:-1 tvg-id="Telesud.fr@SD",Telesud +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/telesud/playlist.m3u8 +#EXTINF:-1 tvg-id="BSmartTV.fr@SD",B Smart TV (320p) +https://raw.githubusercontent.com/Sibprod/streams/main/ressources/dm/py/hls/bsmart.m3u8 diff --git a/streams/gm.m3u b/streams/gm.m3u index 5e83fbc187..ecd92392c3 100644 --- a/streams/gm.m3u +++ b/streams/gm.m3u @@ -5,3 +5,7 @@ http://69.64.57.208/grts/playlist.m3u8 https://dvrfl06.bozztv.com/astv-ptvgambia/index.m3u8 #EXTINF:-1 tvg-id="QTVGambia.gm",QTV Gambia (720p) [Not 24/7] https://player.qtv.gm/hls/live.stream.m3u8 +#EXTINF:-1 tvg-id="QTVGambia.gm@SD",QTV Gambia +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/qtvgambia/playlist.m3u8 +#EXTINF:-1 tvg-id="GRTSTV.gm@SD",GRTS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/grts/playlist.m3u8 diff --git a/streams/gn.m3u b/streams/gn.m3u index 1bd11b8903..cb3508c63f 100644 --- a/streams/gn.m3u +++ b/streams/gn.m3u @@ -11,3 +11,15 @@ https://guineetvdirect.online:3842/live/kabacktvlive.m3u8 https://edge13.vedge.infomaniak.com/livecast/ik:kalactv/chunklist_w280736538.m3u8 #EXTINF:-1 tvg-id="RTG1.gn",RTG 1 http://69.64.57.208/rtg/playlist.m3u8 +#EXTINF:-1 tvg-id="WestAfricaTV.gn@SD",West Africa TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/westafricatv/playlist.m3u8 +#EXTINF:-1 tvg-id="KabackTV.gn@SD",Kaback TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/kabactv/playlist.m3u8 +#EXTINF:-1 tvg-id="CISTV.gn@SD",CIS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/cistv/playlist.m3u8 +#EXTINF:-1 tvg-id="RTG1.gn@SD",RTG 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/rtg1/playlist.m3u8 +#EXTINF:-1 tvg-id="FassoTVKankan.gn@SD",Fasso TV Kankan +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/fassotv/playlist.m3u8 +#EXTINF:-1 tvg-id="GuineeTV1.gn@SD",Guinee TV1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/gtv1/playlist.m3u8 diff --git a/streams/gq.m3u b/streams/gq.m3u index 3b2c8c99cd..bcb573887c 100644 --- a/streams/gq.m3u +++ b/streams/gq.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="SolTV.gq",SolTV (720p) https://stream.solmediaeg.com/soltv/soltv.m3u8 +#EXTINF:-1 tvg-id="TVGE.gq@SD",TVGE +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/tvge/playlist.m3u8 diff --git a/streams/in.m3u b/streams/in.m3u index a8b793ec49..5286f67231 100644 --- a/streams/in.m3u +++ b/streams/in.m3u @@ -1326,3 +1326,5 @@ https://live.dinesh29.com.np/stream/jiotvplus/jayamax/master.m3u8 https://live.dinesh29.com.np/stream/jiotvplus/aajtak/master.m3u8 #EXTINF:-1 tvg-id="FlowersTV.in@SD",Flowers TV (576p) http://93.119.105.61:80/play/live.php?mac=00:1A:79:00:28:53&stream=443062&extension=ts&play_token=FPh4kuMnod +#EXTINF:-1 tvg-id="AngelTV.in@Africa",Angel TV Africa +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/angeltv/playlist.m3u8 diff --git a/streams/ke.m3u b/streams/ke.m3u index 1b7f16b5ac..8a75e26b69 100644 --- a/streams/ke.m3u +++ b/streams/ke.m3u @@ -34,7 +34,7 @@ https://74937-castr.akamaized.net/5ea49827ff3b5d7b22708777/live_cd93fa8063f411ec #EXTINF:-1 tvg-id="JCMTV.ke",JCM TV (720p) [Not 24/7] https://goliveafrica.media:9998/live/646c92d07b16c/index.m3u8 #EXTINF:-1 tvg-id="K24.ke",K24 (720p) -https://5de06ce62a0b5.streamlock.net/k24/myStream/playlist.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/k24/playlist.m3u8 #EXTINF:-1 tvg-id="KassTV.ke",Kass TV (720p) [Not 24/7] https://goliveafrica.media:9998/live/62f643cdca8cf/index.m3u8 #EXTINF:-1 tvg-id="LolweTV.ke",Lolwe TV (576p) [Not 24/7] @@ -77,3 +77,43 @@ https://goliveafrica.media:9998/live/64a26e4dd21a3/index.m3u8 https://goliveafrica.media:9998/live/62580d78ac508/index.m3u8 #EXTINF:-1 tvg-id="YOUNIBMediaTV.ke",YOUNIB Media TV (720p) [Not 24/7] https://goliveafrica.media:9998/live/6257fbe7383d6/index.m3u8 +#EXTINF:-1 tvg-id="JCDHTV.ke@SD",JCDH TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/jcdh/playlist.m3u8 +#EXTINF:-1 tvg-id="TV47Kenya.ke@SD",TV47 Kenya +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/tv47/playlist.m3u8 +#EXTINF:-1 tvg-id="MahdiTV.ke@SD",Mahdi TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/mahdi/playlist.m3u8 +#EXTINF:-1 tvg-id="KirkTV.ke@SD",Kirk TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/kirktv/playlist.m3u8 +#EXTINF:-1 tvg-id="FamilyTV.ke@SD",Family TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/familytv/playlist.m3u8 +#EXTINF:-1 tvg-id="TinkerTV.ke@SD",Tinker TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/tinkertv/playlist.m3u8 +#EXTINF:-1 tvg-id="CapuchinTV.ke@SD",Capuchin TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/capuchintv/playlist.m3u8 +#EXTINF:-1 tvg-id="KamemeTV.ke@SD",Kameme TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/kamemetv/playlist.m3u8 +#EXTINF:-1 tvg-id="AkiliKids.ke@SD",Akili Kids! +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/akilikids/playlist.m3u8 +#EXTINF:-1 tvg-id="HorizonTV.ke@SD",Horizon TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/horizontv/playlist.m3u8 +#EXTINF:-1 tvg-id="PPPTV.ke@SD",PPP TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/ppptv/playlist.m3u8 +#EXTINF:-1 tvg-id="MBCITV.ke@SD",MBCI TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/pangmbcitv/playlist.m3u8 +#EXTINF:-1 tvg-id="CitizenTV.ke@SD",Citizen TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/citizen/playlist.m3u8 +#EXTINF:-1 tvg-id="AlHudaTV.ke@SD",Al Huda TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/alhudtv/playlist.m3u8 +#EXTINF:-1 tvg-id="AviationTV.ke@SD",Aviation TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/aviationtv/playlist.m3u8 +#EXTINF:-1 tvg-id="KBCChannel1.ke@SD",KBC Channel 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/kbc/playlist.m3u8 +#EXTINF:-1 tvg-id="ShifuTV.ke@SD",Shifu TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/shifutv/playlist.m3u8 +#EXTINF:-1 tvg-id="KTN.ke@SD",KTN +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/ktnhome/playlist.m3u8 +#EXTINF:-1 tvg-id="NTVKenya.ke@SD",NTV Kenya +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/ntvken/playlist.m3u8 +#EXTINF:-1 tvg-id="NuruTV.ke@SD",Nuru TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/nurutv/playlist.m3u8 diff --git a/streams/lr.m3u b/streams/lr.m3u index 4ca47acc8c..0522953d75 100644 --- a/streams/lr.m3u +++ b/streams/lr.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="LNTV.lr@SD",LNTV https://stream.ecable.tv/lntv/tracks-v1a1/mono.m3u8 +#EXTINF:-1 tvg-id="LNTV.lr",LNTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/lntv/playlist.m3u8 diff --git a/streams/ma.m3u b/streams/ma.m3u index be272f3cc3..270058bbdc 100644 --- a/streams/ma.m3u +++ b/streams/ma.m3u @@ -33,3 +33,7 @@ https://streaming2.medi1tv.com/live/smil:medi1tv.smil/playlist.m3u8 https://136044159.r.cdnsun.net/storychannel.m3u8 #EXTINF:-1 tvg-id="ChadaTV.ma",Chada TV (720p) https://edge13.vedge.infomaniak.com/livecast/ik:chadatv/manifest.m3u8 +#EXTINF:-1 tvg-id="Medi1TVAfrique.ma@SD",Medi1TV Afrique +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/meditv/playlist.m3u8 +#EXTINF:-1 tvg-id="2M.ma@SD",2M +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119051/2mmaroc/playlist.m3u8 diff --git a/streams/ml.m3u b/streams/ml.m3u index cd64c11e37..c75af6e807 100644 --- a/streams/ml.m3u +++ b/streams/ml.m3u @@ -13,3 +13,19 @@ http://69.64.57.208/ortm/playlist.m3u8 http://69.64.57.208/tm2/playlist.m3u8 #EXTINF:-1 tvg-id="TM1TV.ml",TM1 (360p) [Not 24/7] http://69.64.57.208/tm1/playlist.m3u8 +#EXTINF:-1 tvg-id="RenouveauTV.ml@SD",Renouveau TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/renouveautv/playlist.m3u8 +#EXTINF:-1 tvg-id="AfricableTV.ml@SD",Africable TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/africable/playlist.m3u8 +#EXTINF:-1 tvg-id="TM1TV.ml@SD",TM1 TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/tm1/playlist.m3u8 +#EXTINF:-1 tvg-id="CheriflaTV.ml@SD",Cherifla TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/cheriflatv/playlist.m3u8 +#EXTINF:-1 tvg-id="BalanzanTV.ml@SD",Balanzan TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/balanzatv/playlist.m3u8 +#EXTINF:-1 tvg-id="NietaTV.ml@SD",Nieta TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/nietatv/playlist.m3u8 +#EXTINF:-1 tvg-id="ORTM2.ml@SD",ORTM 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/ortm2/playlist.m3u8 +#EXTINF:-1 tvg-id="ORTM1.ml@SD",ORTM 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/ortm1/playlist.m3u8 diff --git a/streams/mz.m3u b/streams/mz.m3u index 9ebba34f86..64e85c5425 100644 --- a/streams/mz.m3u +++ b/streams/mz.m3u @@ -9,3 +9,7 @@ http://196.28.226.121:1935/live/smil:Channel1.smil/playlist.m3u8 http://online.tvm.co.mz:1935/live/smil:Channel1.smil/playlist.m3u8 #EXTINF:-1 tvg-id="TVMInternacional.mz",TVM Internacional (480p) [Not 24/7] http://online.tvm.co.mz:1935/live/smil:Channel2.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="TVMTelescola.mz@SD",TVM Telescola +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/telescola/playlist.m3u8 +#EXTINF:-1 tvg-id="TVM.mz@SD",TVM +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/tvm/playlist.m3u8 diff --git a/streams/na.m3u b/streams/na.m3u index 126592ab01..7e4717eb34 100644 --- a/streams/na.m3u +++ b/streams/na.m3u @@ -3,3 +3,5 @@ https://s-pl-01.mediatool.tv/playout/ntv-abr/index.m3u8 #EXTINF:-1 tvg-id="NBC1.na@SD",NBC 1 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/nbc1/playlist.m3u8 +#EXTINF:-1 tvg-id="NBC2.na@SD",NBC 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/nbc2/playlist.m3u8 diff --git a/streams/ne.m3u b/streams/ne.m3u index b49a2082c3..ba06b201db 100644 --- a/streams/ne.m3u +++ b/streams/ne.m3u @@ -9,3 +9,25 @@ http://69.64.57.208/telesahel/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/taltv/playlist.m3u8 #EXTINF:-1 tvg-id="TeleSahel.ne@SD",Tele Sahel https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/telesahel/playlist.m3u8 +#EXTINF:-1 tvg-id="FideliteTV.ne@SD",Fidelite TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/fidelite/playlist.m3u8 +#EXTINF:-1 tvg-id="Bonferey.ne@SD",Bonferey +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/bonferey/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal3Monde.ne@SD",Canal 3 Monde +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/canal3monde/playlist.m3u8 +#EXTINF:-1 tvg-id="LiptakoTV.ne@SD",Liptako TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/liptako/playlist.m3u8 +#EXTINF:-1 tvg-id="EsperanceTV.ne@SD",Esperance TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/esperance/playlist.m3u8 +#EXTINF:-1 tvg-id="TenereTV.ne",Tenere TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/tenere/playlist.m3u8 +#EXTINF:-1 tvg-id="DouniaTV.ne",Dounia TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/dounia/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal3Niger.ne",Canal 3 Niger +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/canal3niger/playlist.m3u8 +#EXTINF:-1 tvg-id="SaraouniaTV.ne",Saraounia TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/saraounia/playlist.m3u8 +#EXTINF:-1 tvg-id="AnfaniTV.ne",Anfani TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/anfani/playlist.m3u8 +#EXTINF:-1 tvg-id="TambaraTV.ne",Tambara TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/tambara/playlist.m3u8 diff --git a/streams/ng.m3u b/streams/ng.m3u index 783e5d5304..65ce6d33a6 100644 --- a/streams/ng.m3u +++ b/streams/ng.m3u @@ -145,3 +145,15 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/flametv/playlist.m3 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/tvcnews/playlist.m3u8 #EXTINF:-1 tvg-id="ChannelsTV.ng@SD",Channels TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/channelstv/playlist.m3u8 +#EXTINF:-1 tvg-id="SalvationTV.ng@SD",Salvation TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/salvationtv/playlist.m3u8 +#EXTINF:-1 tvg-id="SynagogueTV.ng@SD",Synagogue TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/synagoguetv/playlist.m3u8 +#EXTINF:-1 tvg-id="BrideTV.ng@SD",Bride TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/endtimemessagetv/playlist.m3u8 +#EXTINF:-1 tvg-id="EncounterJesusTV.ng@SD",Encounter Jesus TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/encounterjesustv/playlist.m3u8 +#EXTINF:-1 tvg-id="FullLifeTV.ng@SD",Full Life TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/fulllifetv/playlist.m3u8 +#EXTINF:-1 tvg-id="ChosenTVEnglish.ng@SD",Chosen TV English +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/chosentv/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index 927277f12d..76cea01160 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -1,6 +1,4 @@ #EXTM3U -#EXTINF:-1 tvg-id="AgroTV.pe",Agro TV (Apurimac) (720p) [Not 24/7] -https://ed21ov.live.opencaster.com/pAtGzcAnwziC/index.m3u8 #EXTINF:-1 tvg-id="AmericaTelevision.pe@SD",America Television http://181.188.216.5:18000/play/a014/index.m3u8 #EXTINF:-1 tvg-id="AngienetTV.pe@SD",Angienet TV @@ -167,7 +165,25 @@ https://ott1.hdlatam.tv/live_abr/webtvVisionSur/playlist.m3u8 https://live.obslivestream.com/vivatv/index.m3u8 #EXTINF:-1 tvg-id="VNP.pe",VNP https://videoserver.tmcreativos.com:19360/visionnoticias/visionnoticias.m3u8 -#EXTINF:-1 tvg-id="TVPeru.pe" http-referrer="http://tvperu.gob.pe/",TV Peru (720p) +#EXTINF:-1 tvg-id="TVPeru.pe",TV Peru (720p) http://181.188.216.5:18000/play/a0qn/index.m3u8 #EXTINF:-1 tvg-id="CanalN.pe@SD",Canal N http://181.188.216.5:18000/play/a01p/index.m3u8 +#EXTINF:-1 tvg-id="BHTV.pe" http-referrer="http://www.bhtv.pe/",BHTV (1080p) +https://sc1.wasidata.com/Bhtv/index.fmp4.m3u8 +#EXTINF:-1 tvg-id="AmericaTelevision.pe" http-referrer="http://americatv.com.pe/",America Television (1080p) +http://38.183.182.166:8000/play/a0rb/index.m3u8 +#EXTINF:-1 tvg-id="RPPTV.pe" http-referrer="http://rpp.pe",RPP TV (480p) +http://38.183.182.166:8000/play/a13g/index.m3u8 +#EXTINF:-1 tvg-id="WillaxTV.pe" http-referrer="http://willax.pe",Willax TV (720p) +http://38.183.182.166:8000/play/a0zn/index.m3u8 +#EXTINF:-1 tvg-id="PBO.pe",PBO (1080p) +http://38.183.182.166:8000/play/a13k/index.m3u8 +#EXTINF:-1 tvg-id="PanamericanaTV.pe" http-referrer="http://panamericana.pe/",Panamericana TV (1080p) +http://38.183.182.166:8000/play/a0ii/index.m3u8 +#EXTINF:-1 tvg-id="L1Max.pe" http-referrer="http://www.l1max.com/",L1 Max (1080p) +http://38.183.182.166:8000/play/a12t/index.m3u8 +#EXTINF:-1 tvg-id="GolPeru.pe",Gol Peru (1080p) +http://38.183.182.166:8000/play/a120/index.m3u8 +#EXTINF:-1 tvg-id="TVPeru.pe" http-referrer="http://tvperu.gob.pe",TV Peru (1080p) +http://38.183.182.166:8000/play/a12u/index.m3u8 diff --git a/streams/rw.m3u b/streams/rw.m3u index 370ccaeddd..d727dd32ca 100644 --- a/streams/rw.m3u +++ b/streams/rw.m3u @@ -23,3 +23,9 @@ https://frn.rtsp.me/jDzHciIUzTOuXiUaI-Vg1w/1738881610/hls/BtBbfbnK.m3u8 https://live.tv1.rw/live/tv1rwanda_480/index.m3u8 #EXTINF:-1 tvg-id="TV10.rw",TV10 (720p) https://5c46fa289c89f.streamlock.net/pub1live/mystream/playlist.m3u8 +#EXTINF:-1 tvg-id="BTNTV.rw@SD",BTN TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/btn/playlist.m3u8 +#EXTINF:-1 tvg-id="KC2.rw@SD",KC2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/kc2tv/playlist.m3u8 +#EXTINF:-1 tvg-id="RwandaTV.rw@SD",Rwanda TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/rwandatv/playlist.m3u8 diff --git a/streams/sa.m3u b/streams/sa.m3u index c7d961194a..98b0b7d7d4 100644 --- a/streams/sa.m3u +++ b/streams/sa.m3u @@ -146,3 +146,5 @@ https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/rotanacomedy/playlist. https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/rotanadrama/playlist.m3u8 #EXTINF:-1 tvg-id="RotanaClassic.sa@SD",Rotana Classic https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/rotanazaman/playlist.m3u8 +#EXTINF:-1 tvg-id="AlSunnahAlNabawiyahTV.sa@SD",Al Sunnah Al Nabawiyah TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/alsunnah/playlist.m3u8 diff --git a/streams/sd.m3u b/streams/sd.m3u index 71e4c879ab..9905dc74f2 100644 --- a/streams/sd.m3u +++ b/streams/sd.m3u @@ -7,3 +7,5 @@ http://82.212.74.98:8000/live/7815.m3u8 https://hls.dabangasudan.org/hls/stream.m3u8 #EXTINF:-1 tvg-id="SudanTV.sd",Sudan TV (360p) https://cdn-globecast.akamaized.net/live/eds/sudan_tv/hls_roku/index.m3u8 +#EXTINF:-1 tvg-id="SudanEduTV.sd@SD",Sudan Edu TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120913/sudanbasicedu/playlist.m3u8 diff --git a/streams/sn.m3u b/streams/sn.m3u index 1dd13232b2..7054b0669e 100644 --- a/streams/sn.m3u +++ b/streams/sn.m3u @@ -59,3 +59,15 @@ http://69.64.57.208/walftv/playlist.m3u8 https://strhls.streamakaci.tv/yakaartv/yakaartv-multi/playlist.m3u8 #EXTINF:-1 tvg-id="YegleTV.sn",Yeglé TV (1080p) https://endour.net/hls/Yegle-tv/index.m3u8 +#EXTINF:-1 tvg-id="BantambaTV.sn@SD",Bantamba TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/bantambatv/playlist.m3u8 +#EXTINF:-1 tvg-id="WalfTV.sn@SD",Walf TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/walftv/playlist.m3u8 +#EXTINF:-1 tvg-id="TFM.sn@SD",TFM +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/tfm/playlist.m3u8 +#EXTINF:-1 tvg-id="RTS2.sn@SD",RTS 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/rts2/playlist.m3u8 +#EXTINF:-1 tvg-id="RTS1.sn@SD",RTS 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/rts1/playlist.m3u8 +#EXTINF:-1 tvg-id="SenTV.sn@SD",Sen TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/sentv/playlist.m3u8 diff --git a/streams/so.m3u b/streams/so.m3u index 83b0c8380c..5836522af8 100644 --- a/streams/so.m3u +++ b/streams/so.m3u @@ -19,3 +19,5 @@ http://cdn.mediavisionuae.com:1935/live/sbctv.stream/playlist.m3u8 https://ap02.iqplay.tv:8082/iqb8002/s2tve/playlist.m3u8 #EXTINF:-1 tvg-id="SomaliNationalTV.so",Somali National TV (576p) https://ap02.iqplay.tv:8082/iqb8002/s4ne/playlist.m3u8 +#EXTINF:-1 tvg-id="SomalilandNationalTV.so@SD",Somaliland National TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/slntv/playlist.m3u8 diff --git a/streams/td.m3u b/streams/td.m3u index f9c0e8cfd1..5a10b28d03 100644 --- a/streams/td.m3u +++ b/streams/td.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="TeleTchad.td",Tele Tchad (1080p) https://strhlslb01.streamakaci.tv/str_tchad_tchad/str_tchad_multi/playlist.m3u8 +#EXTINF:-1 tvg-id="TeleTchad.td@SD",Tele Tchad +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/teletchad/playlist.m3u8 diff --git a/streams/tg.m3u b/streams/tg.m3u index e168c19c90..41559efb96 100644 --- a/streams/tg.m3u +++ b/streams/tg.m3u @@ -23,3 +23,7 @@ https://wmoy82n4y2a7-hls-live.5centscdn.com/sostv/live.stream/playlist.m3u8 https://cdn140m.panaccess.com/HLS/Espoir47/index.m3u8 #EXTINF:-1 tvg-id="TVT.tg",TVT (720p) [Not 24/7] http://69.64.57.208/tvt/playlist.m3u8 +#EXTINF:-1 tvg-id="NWInfo.tg@SD",NW Info +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/newworldinfo/playlist.m3u8 +#EXTINF:-1 tvg-id="TVT.tg@SD",TVT +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120427/tvt1/playlist.m3u8 diff --git a/streams/tn.m3u b/streams/tn.m3u index 9776af6eb4..251889d1fb 100644 --- a/streams/tn.m3u +++ b/streams/tn.m3u @@ -11,3 +11,11 @@ https://streaming.toutech.net/live/jtv/index.m3u8 https://cdn.live.easybroadcast.io/abr_corp/63_mosaique-fm_rn56tgl/playlist_dvr.m3u8 #EXTINF:-1 tvg-id="NessmaElJadida.tn@SD",Nessma El Jadida https://fl1002.bozztv.com/ga-nessmatv/tracks-v1a1/mono.m3u8 +#EXTINF:-1 tvg-id="HannibalTV.tn@SD",Hannibal TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/hannibaltv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElhiwarEttounsiTV.tn@SD",Elhiwar Ettounsi TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/elhiwarettounsi/playlist.m3u8 +#EXTINF:-1 tvg-id="AlJanoubiyaTV.tn@SD",Al Janoubiya TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/aljanoubiatv/playlist.m3u8 +#EXTINF:-1 tvg-id="AlInsenTV.tn@SD",Al Insen TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/alinsentv/playlist.m3u8 diff --git a/streams/tz.m3u b/streams/tz.m3u index 5ed09d3fbc..1f014f8e2a 100644 --- a/streams/tz.m3u +++ b/streams/tz.m3u @@ -7,3 +7,29 @@ http://138.68.138.119:8080/live/5a8993709ea19/index.m3u8 http://68.183.41.209:8080/live/5d9a537c64b9c/index.m3u8 #EXTINF:-1 tvg-id="ITV.tz@SD",ITV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/itv/playlist.m3u8 +#EXTINF:-1 tvg-id="WasafiTV.tz@SD",Wasafi TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/wasafitv/playlist.m3u8 +#EXTINF:-1 tvg-id="ChannelTenPlus.tz@SD",Channel Ten + +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/channeltenpluscband/playlist.m3u8 +#EXTINF:-1 tvg-id="AriseShineTV.tz@SD",Arise & Shine TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/ariseandshine/playlist.m3u8 +#EXTINF:-1 tvg-id="FurahaTV.tz@SD",Furaha TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/furahatv/playlist.m3u8 +#EXTINF:-1 tvg-id="EfathaTV.tz@SD",Efatha TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/efathatv/playlist.m3u8 +#EXTINF:-1 tvg-id="TanzaniaSafariChannel.tz@SD",Tanzania Safari Channel +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/safaritv/playlist.m3u8 +#EXTINF:-1 tvg-id="WRMTV.tz@SD",WRM TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/wrm/playlist.m3u8 +#EXTINF:-1 tvg-id="StarTV.tz@SD",Star TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/startv/playlist.m3u8 +#EXTINF:-1 tvg-id="MamboTVSwahili.tz@SD",Mambo TV Swahili +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/mambotv/playlist.m3u8 +#EXTINF:-1 tvg-id="TV3.tz@SD",TV3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/tv3-sd/playlist.m3u8 +#EXTINF:-1 tvg-id="TBC1.tz@SD",TBC1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/tbc1/playlist.m3u8 +#EXTINF:-1 tvg-id="ChannelTen.tz@SD",Channel Ten +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/channelten/playlist.m3u8 +#EXTINF:-1 tvg-id="HopeChannelTanzania.tz@SD",Hope Channel Tanzania +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/hctanzania/playlist.m3u8 diff --git a/streams/ug.m3u b/streams/ug.m3u index 322a01e974..2ba5c0eadc 100644 --- a/streams/ug.m3u +++ b/streams/ug.m3u @@ -59,3 +59,43 @@ https://panel.freedomflixtv.org:3900/hybrid/play.m3u8 https://stream.hydeinnovations.com/tvwest-flussonic/index.m3u8 #EXTINF:-1 tvg-id="WanLuoTV.ug",Wan Luo TV (576p) https://stream.hydeinnovations.com/luotv-flussonic/index.m3u8 +#EXTINF:-1 tvg-id="WestnileTV.ug@SD",Westnile TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/westnile/playlist.m3u8 +#EXTINF:-1 tvg-id="BabaTV.ug@SD",Baba TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/babatv/playlist.m3u8 +#EXTINF:-1 tvg-id="KBSTV.ug@SD",KBS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/kbstv/playlist.m3u8 +#EXTINF:-1 tvg-id="KSTVUganda.ug@SD",KSTV Uganda +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/kstv/playlist.m3u8 +#EXTINF:-1 tvg-id="KTV.ug@SD",KTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/ktv/playlist.m3u8 +#EXTINF:-1 tvg-id="ChamukaTV.ug@SD",Chamuka TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/chamukatv/playlist.m3u8 +#EXTINF:-1 tvg-id="TopTV.ug@SD",Top TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/toptv/playlist.m3u8 +#EXTINF:-1 tvg-id="Channel44Uganda.ug@SD",Channel 44 Uganda +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/channel44/playlist.m3u8 +#EXTINF:-1 tvg-id="SaltTV.ug@SD",Salt TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/salttv/playlist.m3u8 +#EXTINF:-1 tvg-id="SparkTV.ug@SD",Spark TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/sparktv/playlist.m3u8 +#EXTINF:-1 tvg-id="TVWest.ug@SD",TV West +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/tvwest/playlist.m3u8 +#EXTINF:-1 tvg-id="BBSTV.ug@SD",BBS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/bbstv/playlist.m3u8 +#EXTINF:-1 tvg-id="BukeddeTV2.ug@SD",Bukedde TV 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/bukkede2/playlist.m3u8 +#EXTINF:-1 tvg-id="BukeddeTV1.ug@SD",Bukedde TV 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/bukkede1/playlist.m3u8 +#EXTINF:-1 tvg-id="NBSTV.ug@SD",NBS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/nbs/playlist.m3u8 +#EXTINF:-1 tvg-id="NTVUganda.ug@SD",NTV Uganda +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/ntvuganda/playlist.m3u8 +#EXTINF:-1 tvg-id="UBCTV.ug@SD",UBC TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/ubc/playlist.m3u8 +#EXTINF:-1 tvg-id="UCTV.ug@SD",UCTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/uctv/playlist.m3u8 +#EXTINF:-1 tvg-id="SalamTV.ug@SD",Salam TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119694/salaamtv/playlist.m3u8 +#EXTINF:-1 tvg-id="HopeChannelUganda.ug@SD",Hope Channel Uganda +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/hcuganda/playlist.m3u8 diff --git a/streams/uk.m3u b/streams/uk.m3u index 6826565eb5..dab31d176b 100644 --- a/streams/uk.m3u +++ b/streams/uk.m3u @@ -332,3 +332,11 @@ https://wildearth-ono.amagi.tv/playlist/amg01290-wildearth-oando/playlist.m3u8 https://jmp2.uk/stvp-GB340000289 #EXTINF:-1 tvg-id="AriseNews.uk@SD",Arise News https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/arisenews/playlist.m3u8 +#EXTINF:-1 tvg-id="MiracleTV.uk@SD",Miracle TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/miracletv/playlist.m3u8 +#EXTINF:-1 tvg-id="KICCTV.uk@SD",KICC TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/kicctv/playlist.m3u8 +#EXTINF:-1 tvg-id="VoxAfrica.uk@SD",VoxAfrica +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/voxafrica/playlist.m3u8 +#EXTINF:-1 tvg-id="HornCableTV.uk@SD",Horn Cable TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/horncabletv/playlist.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index 4d36b3be04..05471bc92d 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1052,3 +1052,27 @@ https://fast-channels.sinclairstoryline.com/CHARGE/index.m3u8 https://cdn-unified-hls.streamspot.com/ingest1/8b0796adaf/playlist.m3u8?origin=1 #EXTINF:-1 tvg-id="TheWayTV.us@SD",The Way TV https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/thewaytv/playlist.m3u8 +#EXTINF:-1 tvg-id="AlkarmaTVPraise.us@SD",Alkarma TV Praise +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alkarmapraise/playlist.m3u8 +#EXTINF:-1 tvg-id="ChristianYouthChannelCYC.us@SD",Christian Youth Channel CYC +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/cyc/playlist.m3u8 +#EXTINF:-1 tvg-id="AlmagdTV.us@SD",Almagd TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/almagdtv/playlist.m3u8 +#EXTINF:-1 tvg-id="CSat.us@SD",C Sat +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/csat/playlist.m3u8 +#EXTINF:-1 tvg-id="AlkarmaTVMiddleEast.us@SD",Alkarma TV Middle East +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alkarmame/playlist.m3u8 +#EXTINF:-1 tvg-id="AlkarmaTVNorthAmerica.us@SD",Alkarma TV North America +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alkarmausa/playlist.m3u8 +#EXTINF:-1 tvg-id="BibleExplorations.us@SD",Bible Explorations +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/bibleexplorationstv/playlist.m3u8 +#EXTINF:-1 tvg-id="SBNTVInternational.us@SD",SBN TV International +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/sonlife/playlist.m3u8 +#EXTINF:-1 tvg-id="FanDuelTV.us@SD",FanDuel TV (720p) +https://d2jl8r92tdc3f1.cloudfront.net/out/v1/59419700344b4625b7cb0693ba265ea3/TVGindex_1.m3u8 +#EXTINF:-1 tvg-id="WNETDT1.us",WNET-DT1 +https://e5.thetvapp.to/hls/WNET/index.m3u8 +#EXTINF:-1 tvg-id="AlHayatTV.us@SD",Al Hayat TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120913/alhayat/playlist.m3u8 +#EXTINF:-1 tvg-id="WNJUDT1.us@SD",WNJU-DT1 (360p) +https://e5.thetvapp.to/hls/TelemundoEast/tracks-v2a1/mono.m3u8 diff --git a/streams/us_moveonjoy.m3u b/streams/us_moveonjoy.m3u index 873eed4a58..5f1f152dbf 100644 --- a/streams/us_moveonjoy.m3u +++ b/streams/us_moveonjoy.m3u @@ -9,8 +9,6 @@ https://fl25.moveonjoy.com/AMC_NETWORK/index.m3u8 https://fl25.moveonjoy.com/Antenna_TV/index.m3u8 #EXTINF:-1 tvg-id="Aspire.us",Aspire https://fl25.moveonjoy.com/Aspire/index.m3u8 -#EXTINF:-1 tvg-id="AXSTV.us",AXS TV -https://fl25.moveonjoy.com/Axs_TV/index.m3u8 #EXTINF:-1 tvg-id="BBCAmerica.us@East",BBC America East https://fl25.moveonjoy.com/BBC_AMERICA/index.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk@NorthAmerica",BBC News North America diff --git a/streams/za.m3u b/streams/za.m3u index 5b8852e63c..386df8f807 100644 --- a/streams/za.m3u +++ b/streams/za.m3u @@ -45,3 +45,19 @@ https://restream.churchtv247.co.za/Apostle/Hggc@24/1.m3u8 https://tbn-jw.cdn.vustreams.com/live/tbn-africa/live.isml/master.m3u8 #EXTINF:-1 tvg-id="ZeeBollymovies.za@SD",Zee Bollymovies (1080p) https://amg17931-zee-amg17931c8-samsung-th-6526.playouts.now.amagi.tv/playlist.m3u8 +#EXTINF:-1 tvg-id="EzekielTV.za@SD",Ezekiel TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/ezekieltv/playlist.m3u8 +#EXTINF:-1 tvg-id="Pulse.za@SD",Pulse +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/pulsemusictv/playlist.m3u8 +#EXTINF:-1 tvg-id="CapeTownTV.za@SD",Cape Town TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/capetowntv/playlist.m3u8 +#EXTINF:-1 tvg-id="SowetoTV.za@SD",Soweto TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/sowetotv/playlist.m3u8 +#EXTINF:-1 tvg-id="1KZNTV.za@SD",1KZN TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/1kzntv/playlist.m3u8 +#EXTINF:-1 tvg-id="eNewsChannelAfrica.za@SD",eNews Channel Africa +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/enca/playlist.m3u8 +#EXTINF:-1 tvg-id="SABCNews.za@SD",SABC News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/sabcnews/playlist.m3u8 +#EXTINF:-1 tvg-id="LN24SA.za@SD",LN24SA +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/l24international/playlist.m3u8 diff --git a/streams/zm.m3u b/streams/zm.m3u index fcd718794a..68e5b00b68 100644 --- a/streams/zm.m3u +++ b/streams/zm.m3u @@ -1 +1,31 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="CrownTV.zm@SD",Crown TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/crowntv/playlist.m3u8 +#EXTINF:-1 tvg-id="RevelationTV.zm@SD",Revelation TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/revelationtv/playlist.m3u8 +#EXTINF:-1 tvg-id="KBN.zm@SD",KBN +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/kbn/playlist.m3u8 +#EXTINF:-1 tvg-id="PrimeTV.zm@SD",Prime TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/primetv/playlist.m3u8 +#EXTINF:-1 tvg-id="ZNBCTV4.zm@SD",ZNBC TV 4 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119690/znbc4/playlist.m3u8 +#EXTINF:-1 tvg-id="ZNBCTV3.zm@SD",ZNBC TV 3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/znbc3/playlist.m3u8 +#EXTINF:-1 tvg-id="ZNBCTV2.zm@SD",ZNBC TV 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/znbc2/playlist.m3u8 +#EXTINF:-1 tvg-id="ZANISTV.zm@SD",ZANIS TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/zanis/playlist.m3u8 +#EXTINF:-1 tvg-id="ZNBCTV1.zm@SD",ZNBC TV 1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/znbc1/playlist.m3u8 +#EXTINF:-1 tvg-id="ParliamentTV.zm@SD",Parliament TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/parliamenttv/playlist.m3u8 +#EXTINF:-1 tvg-id="MOZOTV.zm@SD",MOZO TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/mozotv/playlist.m3u8 +#EXTINF:-1 tvg-id="QTVZambia.zm@SD",Q TV Zambia +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/qtv/playlist.m3u8 +#EXTINF:-1 tvg-id="NAC28TV.zm@SD",NAC 28 TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/nac28tv/playlist.m3u8 +#EXTINF:-1 tvg-id="BeatsTV.zm@SD",Beats TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/beatstv/playlist.m3u8 +#EXTINF:-1 tvg-id="SunFMTV.zm@SD",Sun FM TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119689/suntv/playlist.m3u8 diff --git a/streams/zw.m3u b/streams/zw.m3u index dfbcfbf00b..0436397268 100644 --- a/streams/zw.m3u +++ b/streams/zw.m3u @@ -1,3 +1,9 @@ #EXTM3U #EXTINF:-1 tvg-id="YadahTV.zw@SD",Yadah TV (576p) [Not 24/7] https://viewmedia7219.bozztv.com/wmedia/viewmedia100/web_018/Stream/playlist.m3u8 +#EXTINF:-1 tvg-id="YadahTV.zw@SD",Yadah TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/yadahtvplus/playlist.m3u8 +#EXTINF:-1 tvg-id="3Ktv.zw@SD",3Ktv +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/3ktv/playlist.m3u8 +#EXTINF:-1 tvg-id="ZBCTV.zw@SD",ZBC TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/zbctv/playlist.m3u8 From 7a96f9c757774cb41293fc5a2bf020fab5e05c38 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 00:12:58 +0000 Subject: [PATCH 20/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18266274466) workflow. --- PLAYLISTS.md | 73 +++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 957f0f7642..732fe57229 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -27,32 +27,32 @@ Same thing, but split up into separate files: Business68https://iptv-org.github.io/iptv/categories/business.m3u Classic45https://iptv-org.github.io/iptv/categories/classic.m3u Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u - Cooking35https://iptv-org.github.io/iptv/categories/cooking.m3u - Culture165https://iptv-org.github.io/iptv/categories/culture.m3u + Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u + Culture169https://iptv-org.github.io/iptv/categories/culture.m3u Documentary122https://iptv-org.github.io/iptv/categories/documentary.m3u - Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment621https://iptv-org.github.io/iptv/categories/entertainment.m3u - Family53https://iptv-org.github.io/iptv/categories/family.m3u - General2385https://iptv-org.github.io/iptv/categories/general.m3u + Education176https://iptv-org.github.io/iptv/categories/education.m3u + Entertainment635https://iptv-org.github.io/iptv/categories/entertainment.m3u + Family54https://iptv-org.github.io/iptv/categories/family.m3u + General2435https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids268https://iptv-org.github.io/iptv/categories/kids.m3u - Legislative187https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle104https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies371https://iptv-org.github.io/iptv/categories/movies.m3u + Kids269https://iptv-org.github.io/iptv/categories/kids.m3u + Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u + Lifestyle106https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Movies372https://iptv-org.github.io/iptv/categories/movies.m3u Music632https://iptv-org.github.io/iptv/categories/music.m3u - News818https://iptv-org.github.io/iptv/categories/news.m3u - Outdoor45https://iptv-org.github.io/iptv/categories/outdoor.m3u + News837https://iptv-org.github.io/iptv/categories/news.m3u + Outdoor44https://iptv-org.github.io/iptv/categories/outdoor.m3u Public26https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u - Religious687https://iptv-org.github.io/iptv/categories/religious.m3u + Religious721https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u Series258https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u - Sports295https://iptv-org.github.io/iptv/categories/sports.m3u - Travel41https://iptv-org.github.io/iptv/categories/travel.m3u + Sports302https://iptv-org.github.io/iptv/categories/sports.m3u + Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3691https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3701https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -81,12 +81,12 @@ Same thing, but split up into separate files: Acoli1https://iptv-org.github.io/iptv/languages/ach.m3u Adhola1https://iptv-org.github.io/iptv/languages/adh.m3u Afar2https://iptv-org.github.io/iptv/languages/aar.m3u - Afrikaans4https://iptv-org.github.io/iptv/languages/afr.m3u + Afrikaans5https://iptv-org.github.io/iptv/languages/afr.m3u Albanian42https://iptv-org.github.io/iptv/languages/sqi.m3u Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic6https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic406https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic434https://iptv-org.github.io/iptv/languages/ara.m3u Armenian8https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -125,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2330https://iptv-org.github.io/iptv/languages/eng.m3u + English2402https://iptv-org.github.io/iptv/languages/eng.m3u Estonian8https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -133,13 +133,13 @@ Same thing, but split up into separate files: Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u Finnish16https://iptv-org.github.io/iptv/languages/fin.m3u Fon3https://iptv-org.github.io/iptv/languages/fon.m3u - French479https://iptv-org.github.io/iptv/languages/fra.m3u + French519https://iptv-org.github.io/iptv/languages/fra.m3u Fulah3https://iptv-org.github.io/iptv/languages/ful.m3u Gaelic2https://iptv-org.github.io/iptv/languages/gla.m3u - Ganda5https://iptv-org.github.io/iptv/languages/lug.m3u + Ganda12https://iptv-org.github.io/iptv/languages/lug.m3u Gen1https://iptv-org.github.io/iptv/languages/gej.m3u Georgian22https://iptv-org.github.io/iptv/languages/kat.m3u - German332https://iptv-org.github.io/iptv/languages/deu.m3u + German333https://iptv-org.github.io/iptv/languages/deu.m3u Gikuyu3https://iptv-org.github.io/iptv/languages/kik.m3u Goan Konkani1https://iptv-org.github.io/iptv/languages/gom.m3u Gourmanchéma1https://iptv-org.github.io/iptv/languages/gux.m3u @@ -148,7 +148,7 @@ Same thing, but split up into separate files: Gujarati10https://iptv-org.github.io/iptv/languages/guj.m3u Gun1https://iptv-org.github.io/iptv/languages/guw.m3u Haitian13https://iptv-org.github.io/iptv/languages/hat.m3u - Hausa3https://iptv-org.github.io/iptv/languages/hau.m3u + Hausa7https://iptv-org.github.io/iptv/languages/hau.m3u Hebrew15https://iptv-org.github.io/iptv/languages/heb.m3u Hindi214https://iptv-org.github.io/iptv/languages/hin.m3u Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u @@ -170,6 +170,7 @@ Same thing, but split up into separate files: Khorasani Turkish1https://iptv-org.github.io/iptv/languages/kmz.m3u Kinyarwanda9https://iptv-org.github.io/iptv/languages/kin.m3u Kirghiz13https://iptv-org.github.io/iptv/languages/kir.m3u + Kiswahili2https://iptv-org.github.io/iptv/languages/swh.m3u Kituba (Congo)1https://iptv-org.github.io/iptv/languages/mkw.m3u Konabéré1https://iptv-org.github.io/iptv/languages/bbo.m3u Kongo2https://iptv-org.github.io/iptv/languages/kon.m3u @@ -182,10 +183,11 @@ Same thing, but split up into separate files: Latin4https://iptv-org.github.io/iptv/languages/lat.m3u Latvian7https://iptv-org.github.io/iptv/languages/lav.m3u Letzeburgesch12https://iptv-org.github.io/iptv/languages/ltz.m3u - Lingala5https://iptv-org.github.io/iptv/languages/lin.m3u + Lingala6https://iptv-org.github.io/iptv/languages/lin.m3u Lithuanian5https://iptv-org.github.io/iptv/languages/lit.m3u Lobi1https://iptv-org.github.io/iptv/languages/lob.m3u Luba-Lulua1https://iptv-org.github.io/iptv/languages/lua.m3u + Lusengo1https://iptv-org.github.io/iptv/languages/lse.m3u Lushai1https://iptv-org.github.io/iptv/languages/lus.m3u Lyélé1https://iptv-org.github.io/iptv/languages/lee.m3u Macedonian33https://iptv-org.github.io/iptv/languages/mkd.m3u @@ -206,9 +208,10 @@ Same thing, but split up into separate files: Montenegrin1https://iptv-org.github.io/iptv/languages/cnr.m3u Morisyen3https://iptv-org.github.io/iptv/languages/mfe.m3u Moroccan Sign Language1https://iptv-org.github.io/iptv/languages/xms.m3u - Mossi2https://iptv-org.github.io/iptv/languages/mos.m3u + Mossi3https://iptv-org.github.io/iptv/languages/mos.m3u Mycenaean Greek1https://iptv-org.github.io/iptv/languages/gmy.m3u Nepali7https://iptv-org.github.io/iptv/languages/nep.m3u + North Ndebele1https://iptv-org.github.io/iptv/languages/nde.m3u Northern Dagara1https://iptv-org.github.io/iptv/languages/dgi.m3u Norwegian9https://iptv-org.github.io/iptv/languages/nor.m3u Nyankole1https://iptv-org.github.io/iptv/languages/nyn.m3u @@ -219,26 +222,29 @@ Same thing, but split up into separate files: Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u Persian226https://iptv-org.github.io/iptv/languages/fas.m3u Polish67https://iptv-org.github.io/iptv/languages/pol.m3u - Portuguese253https://iptv-org.github.io/iptv/languages/por.m3u + Portuguese254https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian105https://iptv-org.github.io/iptv/languages/ron.m3u + Rundi1https://iptv-org.github.io/iptv/languages/run.m3u Russian357https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u Samoan2https://iptv-org.github.io/iptv/languages/smo.m3u + Sango1https://iptv-org.github.io/iptv/languages/sag.m3u Santali1https://iptv-org.github.io/iptv/languages/sat.m3u Serbian52https://iptv-org.github.io/iptv/languages/srp.m3u Serbo-Croatian1https://iptv-org.github.io/iptv/languages/hbs.m3u + Shona1https://iptv-org.github.io/iptv/languages/sna.m3u Sinhala13https://iptv-org.github.io/iptv/languages/sin.m3u Slovak47https://iptv-org.github.io/iptv/languages/slk.m3u Slovenian13https://iptv-org.github.io/iptv/languages/slv.m3u - Somali15https://iptv-org.github.io/iptv/languages/som.m3u + Somali17https://iptv-org.github.io/iptv/languages/som.m3u South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1711https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1717https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u - Swahili20https://iptv-org.github.io/iptv/languages/swa.m3u + Swahili37https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u Swedish12https://iptv-org.github.io/iptv/languages/swe.m3u Tachawit2https://iptv-org.github.io/iptv/languages/shy.m3u @@ -258,7 +264,7 @@ Same thing, but split up into separate files: Tigrinya1https://iptv-org.github.io/iptv/languages/tir.m3u Tooro1https://iptv-org.github.io/iptv/languages/ttj.m3u Tsonga1https://iptv-org.github.io/iptv/languages/tso.m3u - Tswana1https://iptv-org.github.io/iptv/languages/tsn.m3u + Tswana4https://iptv-org.github.io/iptv/languages/tsn.m3u Tumzabt1https://iptv-org.github.io/iptv/languages/mzb.m3u Turkish263https://iptv-org.github.io/iptv/languages/tur.m3u Turkmen8https://iptv-org.github.io/iptv/languages/tuk.m3u @@ -270,13 +276,14 @@ Same thing, but split up into separate files: Vietnamese82https://iptv-org.github.io/iptv/languages/vie.m3u Welsh1https://iptv-org.github.io/iptv/languages/cym.m3u Western Frisian1https://iptv-org.github.io/iptv/languages/fry.m3u + Western Niger Fulfulde4https://iptv-org.github.io/iptv/languages/fuh.m3u Wolof11https://iptv-org.github.io/iptv/languages/wol.m3u Xhosa1https://iptv-org.github.io/iptv/languages/xho.m3u Yakut1https://iptv-org.github.io/iptv/languages/sah.m3u Yoruba2https://iptv-org.github.io/iptv/languages/yor.m3u Yucatec Maya1https://iptv-org.github.io/iptv/languages/yua.m3u Yue Chinese5https://iptv-org.github.io/iptv/languages/yue.m3u - Zarma1https://iptv-org.github.io/iptv/languages/dje.m3u + Zarma4https://iptv-org.github.io/iptv/languages/dje.m3u Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u Undefined2181https://iptv-org.github.io/iptv/languages/undefined.m3u @@ -448,6 +455,7 @@ Same thing, but split up into separate files: - 🇧🇳 Brunei https://iptv-org.github.io/iptv/countries/bn.m3u - 🇧🇬 Bulgaria https://iptv-org.github.io/iptv/countries/bg.m3u - 🇧🇫 Burkina Faso https://iptv-org.github.io/iptv/countries/bf.m3u +- 🇧🇮 Burundi https://iptv-org.github.io/iptv/countries/bi.m3u - 🇰🇭 Cambodia https://iptv-org.github.io/iptv/countries/kh.m3u - 🇨🇲 Cameroon https://iptv-org.github.io/iptv/countries/cm.m3u - 🇨🇦 Canada https://iptv-org.github.io/iptv/countries/ca.m3u @@ -489,6 +497,7 @@ Same thing, but split up into separate files: - Saskatchewan https://iptv-org.github.io/iptv/subdivisions/ca-sk.m3u - Regina https://iptv-org.github.io/iptv/cities/careg.m3u - 🇨🇻 Cape Verde https://iptv-org.github.io/iptv/countries/cv.m3u +- 🇨🇫 Central African Republic https://iptv-org.github.io/iptv/countries/cf.m3u - 🇹🇩 Chad https://iptv-org.github.io/iptv/countries/td.m3u - 🇨🇱 Chile https://iptv-org.github.io/iptv/countries/cl.m3u - La Araucania https://iptv-org.github.io/iptv/subdivisions/cl-ar.m3u @@ -768,7 +777,6 @@ Same thing, but split up into separate files: - Itapua https://iptv-org.github.io/iptv/subdivisions/py-7.m3u - Encarnacion https://iptv-org.github.io/iptv/cities/pyeno.m3u - 🇵🇪 Peru https://iptv-org.github.io/iptv/countries/pe.m3u - - Apurimac https://iptv-org.github.io/iptv/subdivisions/pe-apu.m3u - Arequipa https://iptv-org.github.io/iptv/subdivisions/pe-are.m3u - Arequipa https://iptv-org.github.io/iptv/cities/peaqp.m3u - Junin https://iptv-org.github.io/iptv/subdivisions/pe-jun.m3u @@ -1271,6 +1279,7 @@ Same thing, but split up into separate files: - 🇻🇳 Vietnam https://iptv-org.github.io/iptv/countries/vn.m3u - 🇪🇭 Western Sahara https://iptv-org.github.io/iptv/countries/eh.m3u - 🇾🇪 Yemen https://iptv-org.github.io/iptv/countries/ye.m3u +- 🇿🇲 Zambia https://iptv-org.github.io/iptv/countries/zm.m3u - 🇿🇼 Zimbabwe https://iptv-org.github.io/iptv/countries/zw.m3u - 🌐 International https://iptv-org.github.io/iptv/countries/int.m3u - Undefined https://iptv-org.github.io/iptv/countries/undefined.m3u From acc74c1f12dcf53fe88dd7985fc866008d78f42a Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 00:13:07 +0000 Subject: [PATCH 21/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18297980259) workflow. closes #27797, closes #27795, closes #27794, closes #27793, closes #27791, closes #27790, closes #27789, closes #27787, closes #27775, closes #27757, closes #27751, closes #27713, closes #27708, closes #27699, closes #27667, closes #27655 --- streams/ar.m3u | 2 ++ streams/bi.m3u | 2 ++ streams/cl.m3u | 6 ++++++ streams/co.m3u | 2 ++ streams/cy.m3u | 2 ++ streams/ga.m3u | 2 ++ streams/gn.m3u | 2 ++ streams/in.m3u | 4 +++- streams/ly.m3u | 2 ++ streams/ng.m3u | 2 ++ streams/pe.m3u | 14 +++++++------- streams/us.m3u | 6 ++++++ 12 files changed, 38 insertions(+), 8 deletions(-) diff --git a/streams/ar.m3u b/streams/ar.m3u index 158c30e659..2c0ac9e289 100644 --- a/streams/ar.m3u +++ b/streams/ar.m3u @@ -198,3 +198,5 @@ https://stmv6.voxtvhd.com.br/cineclasico/cineclasico/playlist.m3u8 https://stmv6.voxtvhd.com.br/cineterror/cineterror/playlist.m3u8 #EXTINF:-1 tvg-id="DisneyChannelLatinAmerica.ar",Disney Channel Latin America (1080p) http://201.230.121.186:8000/play/a0fb/index.m3u8 +#EXTINF:-1 tvg-id="DisneyJrLatinAmerica.ar@South",Disney Jr. Latin America South (480p) +http://38.183.182.166:8000/play/a0j9/index.m3u8 diff --git a/streams/bi.m3u b/streams/bi.m3u index e0b3056fa9..e94f31d383 100644 --- a/streams/bi.m3u +++ b/streams/bi.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="RTNBTV.bi@SD",RTNB TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/rtnb2/playlist.m3u8 +#EXTINF:-1 tvg-id="RemaTV.bi@SD",Rema TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119691/rematv/playlist.m3u8 diff --git a/streams/cl.m3u b/streams/cl.m3u index dd53dd2a72..ce1ac1fcc8 100644 --- a/streams/cl.m3u +++ b/streams/cl.m3u @@ -187,3 +187,9 @@ https://5ff3d9babae13.streamlock.net/jwagpqxehu/jwagpqxehu/playlist.m3u8 https://unlimited1-us.dps.live/vtv/vtv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="VTVValledeAconcagua.cl",VTV Valle de Aconcagua (720p) [Not 24/7] https://unlimited6-cl.dps.live/vtv/vtv.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="Canal13.cl" http-referrer="http://www.13.cl/",Canal 13 (1080p) +http://38.250.127.17:9800/play/a067/index.m3u8 +#EXTINF:-1 tvg-id="ChileVision.cl" http-referrer="http://www.chilevision.cl/",ChileVision (1080p) +http://38.250.127.17:9800/play/a05h/index.m3u8 +#EXTINF:-1 tvg-id="CanalClaro.cl",Canal Claro (480p) +http://181.188.216.5:18000/play/a09l/index.m3u8 diff --git a/streams/co.m3u b/streams/co.m3u index 3b89934cc2..259d99601e 100644 --- a/streams/co.m3u +++ b/streams/co.m3u @@ -158,3 +158,5 @@ http://192.144.113.132:1935/live/ViveTV/playlist.m3u8 #EXTINF:-1 tvg-id="Zoom.co" http-referrer="https://canalzoom.org/senal-en-vivo",Zoom (1080p) #EXTVLCOPT:http-referrer=https://canalzoom.org/senal-en-vivo https://canalzoom.smoothcloud.co:3027/live/canalzoombr1live.m3u8 +#EXTINF:-1 tvg-id="CanalRCN.co" http-referrer="https://www.canalrcn.com/",Canal RCN (480p) +http://38.183.182.166:8000/play/a10i/index.m3u8 diff --git a/streams/cy.m3u b/streams/cy.m3u index 3c41fed0f0..64e2211442 100644 --- a/streams/cy.m3u +++ b/streams/cy.m3u @@ -47,3 +47,5 @@ https://sl2.sigmatv.com/hls/live.m3u8 https://sc-kuzeykibrissmarttv.ercdn.net/tv2020/bantp1/playlist.m3u8 #EXTINF:-1 tvg-id="VouliTV.cy",Vouli TV (1080p) [Not 24/7] https://dev.aftermind.xyz/edge-hls/unitrust/voulitv/index.m3u8?token=8TXWzhY3h6jrzqEqx +#EXTINF:-1 tvg-id="Sat7Arabic.cy@SD",Sat 7 Arabic +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119687/sat7/playlist.m3u8 diff --git a/streams/ga.m3u b/streams/ga.m3u index e16b94a2bc..0457c3f75c 100644 --- a/streams/ga.m3u +++ b/streams/ga.m3u @@ -1,3 +1,5 @@ #EXTM3U #EXTINF:-1 tvg-id="Gabon1ere.ga",Gabon 1ere (1080p) https://vps112773.serveur-vps.net/hls/stream.m3u8 +#EXTINF:-1 tvg-id="Gabon1ere.ga@SD",Gabon 1ere +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/gabon1ere/playlist.m3u8 diff --git a/streams/gn.m3u b/streams/gn.m3u index cb3508c63f..5efcb387a0 100644 --- a/streams/gn.m3u +++ b/streams/gn.m3u @@ -23,3 +23,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/rtg1/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/fassotv/playlist.m3u8 #EXTINF:-1 tvg-id="GuineeTV1.gn@SD",Guinee TV1 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/gtv1/playlist.m3u8 +#EXTINF:-1 tvg-id="RTG2.gn@SD",RTG 2 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/rtg2/playlist.m3u8 diff --git a/streams/in.m3u b/streams/in.m3u index 5286f67231..80b7b5c3ec 100644 --- a/streams/in.m3u +++ b/streams/in.m3u @@ -1129,7 +1129,7 @@ https://live.dinesh29.com.np/stream/jiotvplus/stargoldthrills/master.m3u8 #EXTINF:-1 tvg-id="StarGoldRomance.in@SD",Star Gold Romance (576p) https://live.dinesh29.com.np/stream/jiotvplus/stargoldromance/master.m3u8 #EXTINF:-1 tvg-id="StarGoldSelect.in@HD",Star Gold Select HD (1080p) -https://live.dinesh29.com.np/stream/jiotvplus/stargold2hd/master.m3u8 +https://live.dinesh29.com.np/stream/jiotvplus/stargoldselecthd/master.m3u8 #EXTINF:-1 tvg-id="StarGold.in@HD",Star Gold HD (1080p) https://live.dinesh29.com.np/stream/jiotvplus/stargoldhd/master.m3u8 #EXTINF:-1 tvg-id="StarBharat.in@HD",Star Bharat HD (1080p) @@ -1328,3 +1328,5 @@ https://live.dinesh29.com.np/stream/jiotvplus/aajtak/master.m3u8 http://93.119.105.61:80/play/live.php?mac=00:1A:79:00:28:53&stream=443062&extension=ts&play_token=FPh4kuMnod #EXTINF:-1 tvg-id="AngelTV.in@Africa",Angel TV Africa https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/angeltv/playlist.m3u8 +#EXTINF:-1 tvg-id="Tunes6.in@SD",Tunes 6 (576p) +https://live.dinesh29.com.np/stream/jiotvplus/tunes6/master.m3u8 diff --git a/streams/ly.m3u b/streams/ly.m3u index 064be138ed..8691d84a22 100644 --- a/streams/ly.m3u +++ b/streams/ly.m3u @@ -17,3 +17,5 @@ https://tip.stream.tanasuh.tv:4434/live/smil:tanasuhtv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="WasatTV.ly" http-referrer="https://alwasat.ly/",Wasat TV (1080p) #EXTVLCOPT:http-referrer=https://alwasat.ly/ https://alwasattv.hibridcdn.net/alwasattv/alwasat_abr/playlist.m3u8 +#EXTINF:-1 tvg-id="LibyaAlrasmiaChannel.ly@SD",Libya Alrasmia Channel +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/libyaalrasmia/playlist.m3u8 diff --git a/streams/ng.m3u b/streams/ng.m3u index 65ce6d33a6..db99a39887 100644 --- a/streams/ng.m3u +++ b/streams/ng.m3u @@ -157,3 +157,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/encounterjesustv/pl https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/fulllifetv/playlist.m3u8 #EXTINF:-1 tvg-id="ChosenTVEnglish.ng@SD",Chosen TV English https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/chosentv/playlist.m3u8 +#EXTINF:-1 tvg-id="SunnaTVSavana.ng@SD",Sunna TV Savana +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/sunnatvsavana/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index 76cea01160..51558674e8 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -169,21 +169,21 @@ https://videoserver.tmcreativos.com:19360/visionnoticias/visionnoticias.m3u8 http://181.188.216.5:18000/play/a0qn/index.m3u8 #EXTINF:-1 tvg-id="CanalN.pe@SD",Canal N http://181.188.216.5:18000/play/a01p/index.m3u8 -#EXTINF:-1 tvg-id="BHTV.pe" http-referrer="http://www.bhtv.pe/",BHTV (1080p) +#EXTINF:-1 tvg-id="BHTV.pe",BHTV (1080p) https://sc1.wasidata.com/Bhtv/index.fmp4.m3u8 -#EXTINF:-1 tvg-id="AmericaTelevision.pe" http-referrer="http://americatv.com.pe/",America Television (1080p) +#EXTINF:-1 tvg-id="AmericaTelevision.pe",America Television (1080p) http://38.183.182.166:8000/play/a0rb/index.m3u8 -#EXTINF:-1 tvg-id="RPPTV.pe" http-referrer="http://rpp.pe",RPP TV (480p) +#EXTINF:-1 tvg-id="RPPTV.pe",RPP TV (480p) http://38.183.182.166:8000/play/a13g/index.m3u8 -#EXTINF:-1 tvg-id="WillaxTV.pe" http-referrer="http://willax.pe",Willax TV (720p) +#EXTINF:-1 tvg-id="WillaxTV.pe",Willax TV (720p) http://38.183.182.166:8000/play/a0zn/index.m3u8 #EXTINF:-1 tvg-id="PBO.pe",PBO (1080p) http://38.183.182.166:8000/play/a13k/index.m3u8 -#EXTINF:-1 tvg-id="PanamericanaTV.pe" http-referrer="http://panamericana.pe/",Panamericana TV (1080p) +#EXTINF:-1 tvg-id="PanamericanaTV.pe",Panamericana TV (1080p) http://38.183.182.166:8000/play/a0ii/index.m3u8 -#EXTINF:-1 tvg-id="L1Max.pe" http-referrer="http://www.l1max.com/",L1 Max (1080p) +#EXTINF:-1 tvg-id="L1Max.pe",L1 Max (1080p) http://38.183.182.166:8000/play/a12t/index.m3u8 #EXTINF:-1 tvg-id="GolPeru.pe",Gol Peru (1080p) http://38.183.182.166:8000/play/a120/index.m3u8 -#EXTINF:-1 tvg-id="TVPeru.pe" http-referrer="http://tvperu.gob.pe",TV Peru (1080p) +#EXTINF:-1 tvg-id="TVPeru.pe",TV Peru (1080p) http://38.183.182.166:8000/play/a12u/index.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index 05471bc92d..674cc2e225 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1076,3 +1076,9 @@ https://e5.thetvapp.to/hls/WNET/index.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120913/alhayat/playlist.m3u8 #EXTINF:-1 tvg-id="WNJUDT1.us@SD",WNJU-DT1 (360p) https://e5.thetvapp.to/hls/TelemundoEast/tracks-v2a1/mono.m3u8 +#EXTINF:-1 tvg-id="NationalGeographicLatinAmerica.us@South" http-referrer="http://www.nationalgeographicla.com/",National Geographic Latin America South (1080p) +http://38.183.182.166:8000/play/a0vd/index.m3u8 +#EXTINF:-1 tvg-id="StarChannelLatinAmerica.us@South",Star Channel Latin America South (1080p) +http://181.188.216.5:18000/play/a0pm/index.m3u8 +#EXTINF:-1 tvg-id="ElbesharaGTV.us@SD",Elbeshara GTV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/elbeshara/playlist.m3u8 From 0659397a795fe736c5b827a6cb249b38ad865a54 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 00:13:07 +0000 Subject: [PATCH 22/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18297980259) workflow. --- PLAYLISTS.md | 56 ++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 732fe57229..b2acbc0487 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -22,37 +22,37 @@ Same thing, but split up into separate files: CategoryChannelsPlaylist - Animation58https://iptv-org.github.io/iptv/categories/animation.m3u + Animation59https://iptv-org.github.io/iptv/categories/animation.m3u Auto18https://iptv-org.github.io/iptv/categories/auto.m3u - Business68https://iptv-org.github.io/iptv/categories/business.m3u + Business67https://iptv-org.github.io/iptv/categories/business.m3u Classic45https://iptv-org.github.io/iptv/categories/classic.m3u Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u - Culture169https://iptv-org.github.io/iptv/categories/culture.m3u - Documentary122https://iptv-org.github.io/iptv/categories/documentary.m3u - Education176https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment635https://iptv-org.github.io/iptv/categories/entertainment.m3u + Culture168https://iptv-org.github.io/iptv/categories/culture.m3u + Documentary124https://iptv-org.github.io/iptv/categories/documentary.m3u + Education175https://iptv-org.github.io/iptv/categories/education.m3u + Entertainment637https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General2435https://iptv-org.github.io/iptv/categories/general.m3u + General2428https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids269https://iptv-org.github.io/iptv/categories/kids.m3u + Kids270https://iptv-org.github.io/iptv/categories/kids.m3u Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u Lifestyle106https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies372https://iptv-org.github.io/iptv/categories/movies.m3u - Music632https://iptv-org.github.io/iptv/categories/music.m3u - News837https://iptv-org.github.io/iptv/categories/news.m3u - Outdoor44https://iptv-org.github.io/iptv/categories/outdoor.m3u + Movies374https://iptv-org.github.io/iptv/categories/movies.m3u + Music633https://iptv-org.github.io/iptv/categories/music.m3u + News832https://iptv-org.github.io/iptv/categories/news.m3u + Outdoor43https://iptv-org.github.io/iptv/categories/outdoor.m3u Public26https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u Religious721https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u - Series258https://iptv-org.github.io/iptv/categories/series.m3u + Series261https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u - Sports302https://iptv-org.github.io/iptv/categories/sports.m3u + Sports300https://iptv-org.github.io/iptv/categories/sports.m3u Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3701https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3693https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -86,8 +86,8 @@ Same thing, but split up into separate files: Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic6https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic434https://iptv-org.github.io/iptv/languages/ara.m3u - Armenian8https://iptv-org.github.io/iptv/languages/hye.m3u + Arabic440https://iptv-org.github.io/iptv/languages/ara.m3u + Armenian7https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u Ayizo Gbe1https://iptv-org.github.io/iptv/languages/ayb.m3u @@ -103,7 +103,7 @@ Same thing, but split up into separate files: Bisa1https://iptv-org.github.io/iptv/languages/bib.m3u Bosnian14https://iptv-org.github.io/iptv/languages/bos.m3u Buamu1https://iptv-org.github.io/iptv/languages/box.m3u - Bulgarian25https://iptv-org.github.io/iptv/languages/bul.m3u + Bulgarian24https://iptv-org.github.io/iptv/languages/bul.m3u Burmese6https://iptv-org.github.io/iptv/languages/mya.m3u Catalan55https://iptv-org.github.io/iptv/languages/cat.m3u Central Atlas Tamazight1https://iptv-org.github.io/iptv/languages/tzm.m3u @@ -112,7 +112,7 @@ Same thing, but split up into separate files: Chewa1https://iptv-org.github.io/iptv/languages/nya.m3u Chhattisgarhi1https://iptv-org.github.io/iptv/languages/hne.m3u Chiga1https://iptv-org.github.io/iptv/languages/cgg.m3u - Chinese214https://iptv-org.github.io/iptv/languages/zho.m3u + Chinese215https://iptv-org.github.io/iptv/languages/zho.m3u Croatian27https://iptv-org.github.io/iptv/languages/hrv.m3u Czech38https://iptv-org.github.io/iptv/languages/ces.m3u Danish12https://iptv-org.github.io/iptv/languages/dan.m3u @@ -125,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2402https://iptv-org.github.io/iptv/languages/eng.m3u + English2401https://iptv-org.github.io/iptv/languages/eng.m3u Estonian8https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -133,7 +133,7 @@ Same thing, but split up into separate files: Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u Finnish16https://iptv-org.github.io/iptv/languages/fin.m3u Fon3https://iptv-org.github.io/iptv/languages/fon.m3u - French519https://iptv-org.github.io/iptv/languages/fra.m3u + French521https://iptv-org.github.io/iptv/languages/fra.m3u Fulah3https://iptv-org.github.io/iptv/languages/ful.m3u Gaelic2https://iptv-org.github.io/iptv/languages/gla.m3u Ganda12https://iptv-org.github.io/iptv/languages/lug.m3u @@ -148,7 +148,7 @@ Same thing, but split up into separate files: Gujarati10https://iptv-org.github.io/iptv/languages/guj.m3u Gun1https://iptv-org.github.io/iptv/languages/guw.m3u Haitian13https://iptv-org.github.io/iptv/languages/hat.m3u - Hausa7https://iptv-org.github.io/iptv/languages/hau.m3u + Hausa8https://iptv-org.github.io/iptv/languages/hau.m3u Hebrew15https://iptv-org.github.io/iptv/languages/heb.m3u Hindi214https://iptv-org.github.io/iptv/languages/hin.m3u Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u @@ -226,7 +226,7 @@ Same thing, but split up into separate files: Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian105https://iptv-org.github.io/iptv/languages/ron.m3u - Rundi1https://iptv-org.github.io/iptv/languages/run.m3u + Rundi2https://iptv-org.github.io/iptv/languages/run.m3u Russian357https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u Samoan2https://iptv-org.github.io/iptv/languages/smo.m3u @@ -242,9 +242,9 @@ Same thing, but split up into separate files: South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1717https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1724https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u - Swahili37https://iptv-org.github.io/iptv/languages/swa.m3u + Swahili38https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u Swedish12https://iptv-org.github.io/iptv/languages/swe.m3u Tachawit2https://iptv-org.github.io/iptv/languages/shy.m3u @@ -254,7 +254,7 @@ Same thing, but split up into separate files: Tajik15https://iptv-org.github.io/iptv/languages/tgk.m3u Tamashek1https://iptv-org.github.io/iptv/languages/tmh.m3u Tamasheq2https://iptv-org.github.io/iptv/languages/taq.m3u - Tamil93https://iptv-org.github.io/iptv/languages/tam.m3u + Tamil94https://iptv-org.github.io/iptv/languages/tam.m3u Tarifit1https://iptv-org.github.io/iptv/languages/rif.m3u Tatar1https://iptv-org.github.io/iptv/languages/tat.m3u Telugu54https://iptv-org.github.io/iptv/languages/tel.m3u @@ -266,7 +266,7 @@ Same thing, but split up into separate files: Tsonga1https://iptv-org.github.io/iptv/languages/tso.m3u Tswana4https://iptv-org.github.io/iptv/languages/tsn.m3u Tumzabt1https://iptv-org.github.io/iptv/languages/mzb.m3u - Turkish263https://iptv-org.github.io/iptv/languages/tur.m3u + Turkish233https://iptv-org.github.io/iptv/languages/tur.m3u Turkmen8https://iptv-org.github.io/iptv/languages/tuk.m3u Uighur3https://iptv-org.github.io/iptv/languages/uig.m3u Ukrainian58https://iptv-org.github.io/iptv/languages/ukr.m3u @@ -285,7 +285,7 @@ Same thing, but split up into separate files: Yue Chinese5https://iptv-org.github.io/iptv/languages/yue.m3u Zarma4https://iptv-org.github.io/iptv/languages/dje.m3u Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u - Undefined2181https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined2177https://iptv-org.github.io/iptv/languages/undefined.m3u From cffafb16fb2486459adcd7351a2b023331b72aab Mon Sep 17 00:00:00 2001 From: archrootsda Date: Tue, 7 Oct 2025 16:47:22 +0200 Subject: [PATCH 23/51] Update es.m3u added new links --- streams/es.m3u | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/streams/es.m3u b/streams/es.m3u index 15559deddd..d760b346ef 100644 --- a/streams/es.m3u +++ b/streams/es.m3u @@ -528,5 +528,49 @@ https://rtvelivestream-rtveplayplus.rtve.es/rtvesec/int/tvei_eu_main_1080.m3u8 https://rtvelivestream-rtveplayplus.rtve.es/rtvesec/int/tvei_asia_main_1080.m3u8 #EXTINF:-1 tvg-id="CanalExtremaduraSatelite.es@SD",Canal Extremadura Satelite (1080p) https://canalextremadura-live.flumotion.cloud/canalextremadura/live_all/playlist.m3u8 -#EXTINF:-1 tvg-id="ClanInternacional.es@SD",Clan Internacional (1080p) [Geo-blocked] +#EXTINF:-1 tvg-id="ClanInternacional.es@SD",Clan Internacional Americas (1080p) [Geo-blocked] https://rtvelivestream-rtveplayplus.rtve.es/rtvesec/int/clan_int_main_1080.m3u8 +#EXTINF:-1 tvg-id="Atreseries.es@SD",Atreseries (1080p) +http://176.65.146.237:8401/play/a0ae/index.m3u8 +#EXTINF:-1 tvg-id="AndaluciaTelevision.es",Andalucía Televisión (1080p) +http://176.65.146.237:8401/play/a09g/index.m3u8 +#EXTINF:-1 tvg-id="Antena3.es@SD",Antena 3 (1080p) +http://176.65.146.237:8401/play/a0ae/index.m3u8 +#EXTINF:-1 tvg-id="BomCine.es",Bom Cine (1080p) +http://176.65.146.237:8401/play/a09d/index.m3u8 +#EXTINF:-1 tvg-id="BeMad.es",Be Mad (1080p) +http://176.65.146.237:8401/play/a0aj/index.m3u8 +#EXTINF:-1 tvg-id="CanalSur.es",Canal Sur (1080p) +http://176.65.146.237:8401/play/a09c/index.m3u8 +#EXTINF:-1 tvg-id="Cuatro.es",Cuatro (1080p) +http://176.65.146.237:8401/play/a09s/index.m3u8 +#EXTINF:-1 tvg-id="Divinity.es",Divinity (1080p) +http://176.65.146.237:8401/play/a09q/index.m3u8 +#EXTINF:-1 tvg-id="Energy.es",Energy (1080p) +http://176.65.146.237:8401/play/a0ac/index.m3u8 +#EXTINF:-1 tvg-id="FactoriadeFiccion.es", FDF (1080p) +http://176.65.146.237:8401/play/a09p/index.m3u8 +#EXTINF:-1 tvg-id="La1.es@UHD",La 1 UHD (2160p) +http://176.65.146.237:8401/play/a09u/index.m3u8 +#EXTINF:-1 tvg-id="LaSexta.es",La Sexta (1080p) +http://176.65.146.237:8401/play/a0af/index.m3u8 +#EXTINF:-1 tvg-id="Mega.es",Mega (1080p) +http://176.65.146.237:8401/play/a0a5/index.m3u8 +#EXTINF:-1 tvg-id="Neox.es",Neox (1080p) +http://176.65.146.237:8401/play/a0ag/index.m3u8 +#EXTINF:-1 tvg-id="Nova.es",Nova (1080p) +http://176.65.146.237:8401/play/a0ah/index.m3u8 +#EXTINF:-1 tvg-id="ParamountNetwork.es",Paramount Network Spain (1080p) +http://176.65.146.237:8401/play/a09i/index.m3u8 +#EXTINF:-1 tvg-id="RealMadridTV.es",Real Madrid TV (1080p) +http://176.65.146.237:8401/play/a0ak/index.m3u8 +#EXTINF:-1 tvg-id="Squirrel.es",Squirrel (1080p) +http://176.65.146.237:8401/play/a09h/index.m3u8 +#EXTINF:-1 tvg-id="TEN.es",TEN (1080p) +http://176.65.146.237:8401/play/a0al/index.m3u8 +#EXTINF:-1 tvg-id="Trece.es",Trece (1080p) +http://176.65.146.237:8401/play/a0al/index.m3u8 +#EXTINF:-1 tvg-id="Telecinco.es",Telecinco (1080p) +http://176.65.146.237:8401/play/a09r/index.m3u8 +#EXTINF:-1 tvg-id="VEO7.es",VEO7 (1080p) +http://176.65.146.237:8401/play/a09k/index.m3u8 From 7199daa1e8571c1f7830f804b43585133c271e18 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Tue, 7 Oct 2025 16:54:20 +0200 Subject: [PATCH 24/51] Update es.m3u --- streams/es.m3u | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/streams/es.m3u b/streams/es.m3u index d760b346ef..a62852f533 100644 --- a/streams/es.m3u +++ b/streams/es.m3u @@ -531,7 +531,7 @@ https://canalextremadura-live.flumotion.cloud/canalextremadura/live_all/playlist #EXTINF:-1 tvg-id="ClanInternacional.es@SD",Clan Internacional Americas (1080p) [Geo-blocked] https://rtvelivestream-rtveplayplus.rtve.es/rtvesec/int/clan_int_main_1080.m3u8 #EXTINF:-1 tvg-id="Atreseries.es@SD",Atreseries (1080p) -http://176.65.146.237:8401/play/a0ae/index.m3u8 +http://176.65.146.237:8401/play/a0ai/index.m3u8 #EXTINF:-1 tvg-id="AndaluciaTelevision.es",Andalucía Televisión (1080p) http://176.65.146.237:8401/play/a09g/index.m3u8 #EXTINF:-1 tvg-id="Antena3.es@SD",Antena 3 (1080p) @@ -548,7 +548,7 @@ http://176.65.146.237:8401/play/a09s/index.m3u8 http://176.65.146.237:8401/play/a09q/index.m3u8 #EXTINF:-1 tvg-id="Energy.es",Energy (1080p) http://176.65.146.237:8401/play/a0ac/index.m3u8 -#EXTINF:-1 tvg-id="FactoriadeFiccion.es", FDF (1080p) +#EXTINF:-1 tvg-id="FactoriadeFiccion.es",FDF (1080p) http://176.65.146.237:8401/play/a09p/index.m3u8 #EXTINF:-1 tvg-id="La1.es@UHD",La 1 UHD (2160p) http://176.65.146.237:8401/play/a09u/index.m3u8 @@ -569,7 +569,7 @@ http://176.65.146.237:8401/play/a09h/index.m3u8 #EXTINF:-1 tvg-id="TEN.es",TEN (1080p) http://176.65.146.237:8401/play/a0al/index.m3u8 #EXTINF:-1 tvg-id="Trece.es",Trece (1080p) -http://176.65.146.237:8401/play/a0al/index.m3u8 +http://176.65.146.237:8401/play/a0ai/index.m3u8 #EXTINF:-1 tvg-id="Telecinco.es",Telecinco (1080p) http://176.65.146.237:8401/play/a09r/index.m3u8 #EXTINF:-1 tvg-id="VEO7.es",VEO7 (1080p) From b1109a5b1bb2a69807e9e8325b3de4b3e5797df7 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Tue, 7 Oct 2025 17:13:59 +0200 Subject: [PATCH 25/51] Update es.m3u --- streams/es.m3u | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streams/es.m3u b/streams/es.m3u index a62852f533..8072280c7e 100644 --- a/streams/es.m3u +++ b/streams/es.m3u @@ -569,7 +569,7 @@ http://176.65.146.237:8401/play/a09h/index.m3u8 #EXTINF:-1 tvg-id="TEN.es",TEN (1080p) http://176.65.146.237:8401/play/a0al/index.m3u8 #EXTINF:-1 tvg-id="Trece.es",Trece (1080p) -http://176.65.146.237:8401/play/a0ai/index.m3u8 +http://176.65.146.237:8401/play/a0a9/index.m3u8 #EXTINF:-1 tvg-id="Telecinco.es",Telecinco (1080p) http://176.65.146.237:8401/play/a09r/index.m3u8 #EXTINF:-1 tvg-id="VEO7.es",VEO7 (1080p) From a432920874656bb4c2281e86515e1fec49573046 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Tue, 7 Oct 2025 17:18:51 +0200 Subject: [PATCH 26/51] Update es.m3u --- streams/es.m3u | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streams/es.m3u b/streams/es.m3u index 8072280c7e..3a518f9ee8 100644 --- a/streams/es.m3u +++ b/streams/es.m3u @@ -572,5 +572,5 @@ http://176.65.146.237:8401/play/a0al/index.m3u8 http://176.65.146.237:8401/play/a0a9/index.m3u8 #EXTINF:-1 tvg-id="Telecinco.es",Telecinco (1080p) http://176.65.146.237:8401/play/a09r/index.m3u8 -#EXTINF:-1 tvg-id="VEO7.es",VEO7 (1080p) +#EXTINF:-1 tvg-id="Veo7.es",Veo7 (1080p) http://176.65.146.237:8401/play/a09k/index.m3u8 From a96ae0dafc98b12cea662eb61b3b3a4e0d5db283 Mon Sep 17 00:00:00 2001 From: archrootsda Date: Wed, 8 Oct 2025 00:24:58 +0200 Subject: [PATCH 27/51] Update ru.m3u --- streams/ru.m3u | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/streams/ru.m3u b/streams/ru.m3u index 76b7ad56fb..4e22585bc9 100644 --- a/streams/ru.m3u +++ b/streams/ru.m3u @@ -139,7 +139,7 @@ http://retc.educom.ru/mosobrtv/tv1/index.m3u8 http://retj.educom.ru/mosobrtv/tv1/index.m3u8 #EXTINF:-1 tvg-id="MoyaPlaneta.ru",Моя Планета http://194.143.148.28:8080/MoyaPlanetaHD/index.m3u8 -#EXTINF:-1 tvg-id="MTV.ru",МТВ (Волгоград) (720p) [Not 24/7] +#EXTINF:-1 tvg-id="MTVVolgograd.ru",МТВ (Волгоград) (720p) [Not 24/7] http://hls.volgograd1vtv.cdnvideo.ru/volgograd1vtv/volgograd1vtv.sdp/playlist.m3u8 #EXTINF:-1 tvg-id="MuzSoyuz.ru",Муз союз (576p) https://hls-tvsoyuz.cdnvideo.ru/tvsoyuz2/muzsoyuz.6fw0-58xp-acts-esy0/playlist.m3u8 From 4eae92f7f7298ffa4aa2ac2ad1eb5687adbc40b6 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 00:12:58 +0000 Subject: [PATCH 28/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18329633716) workflow. closes #27804, closes #27815, closes #27811, closes #27810, closes #27809, closes #27808, closes #27807, closes #27805, closes #27819, closes #27818, closes #27817, closes #27802, closes #27799, closes #27786, closes #27783 --- streams/ca.m3u | 2 +- streams/cl.m3u | 4 ++-- streams/co.m3u | 2 +- streams/ee.m3u | 2 ++ streams/eg.m3u | 2 +- streams/et.m3u | 2 ++ streams/id.m3u | 2 ++ streams/md.m3u | 28 ---------------------------- streams/uk.m3u | 2 ++ streams/us.m3u | 18 +++++++++++------- streams/za.m3u | 2 ++ 11 files changed, 26 insertions(+), 40 deletions(-) diff --git a/streams/ca.m3u b/streams/ca.m3u index 713ba8fa84..b86571933c 100644 --- a/streams/ca.m3u +++ b/streams/ca.m3u @@ -91,7 +91,7 @@ https://streamer12.vdn.dstreamone.net/saazoawaz/saazoawaz/playlist.m3u8 https://eu.streamjo.com/eetlive/eettv.m3u8 #EXTINF:-1 tvg-id="ErfanHalghehTV.ca",Erfan Halgheh TV (720p) https://hls.erfanhalgheh.live/hls/stream.m3u8 -#EXTINF:-1 tvg-id="EWTN.us@Canada",EWTN Canada (720p) [Not 24/7] +#EXTINF:-1 tvg-id="EWTN.us@Canada",EWTN Canada (720p) https://cdn3.wowza.com/1/YW5wSWZiRGd2eFlU/bGV0aVBq/hls/live/playlist.m3u8 #EXTINF:-1 tvg-id="FightNetwork.ca",Fight Network (1080p) https://d12a2vxqkkh1bo.cloudfront.net/hls/main.m3u8 diff --git a/streams/cl.m3u b/streams/cl.m3u index ce1ac1fcc8..0f08210089 100644 --- a/streams/cl.m3u +++ b/streams/cl.m3u @@ -187,9 +187,9 @@ https://5ff3d9babae13.streamlock.net/jwagpqxehu/jwagpqxehu/playlist.m3u8 https://unlimited1-us.dps.live/vtv/vtv.smil/playlist.m3u8 #EXTINF:-1 tvg-id="VTVValledeAconcagua.cl",VTV Valle de Aconcagua (720p) [Not 24/7] https://unlimited6-cl.dps.live/vtv/vtv.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="Canal13.cl" http-referrer="http://www.13.cl/",Canal 13 (1080p) +#EXTINF:-1 tvg-id="Canal13.cl",Canal 13 (1080p) http://38.250.127.17:9800/play/a067/index.m3u8 -#EXTINF:-1 tvg-id="ChileVision.cl" http-referrer="http://www.chilevision.cl/",ChileVision (1080p) +#EXTINF:-1 tvg-id="ChileVision.cl",ChileVision (1080p) http://38.250.127.17:9800/play/a05h/index.m3u8 #EXTINF:-1 tvg-id="CanalClaro.cl",Canal Claro (480p) http://181.188.216.5:18000/play/a09l/index.m3u8 diff --git a/streams/co.m3u b/streams/co.m3u index 259d99601e..0e6db3b45f 100644 --- a/streams/co.m3u +++ b/streams/co.m3u @@ -158,5 +158,5 @@ http://192.144.113.132:1935/live/ViveTV/playlist.m3u8 #EXTINF:-1 tvg-id="Zoom.co" http-referrer="https://canalzoom.org/senal-en-vivo",Zoom (1080p) #EXTVLCOPT:http-referrer=https://canalzoom.org/senal-en-vivo https://canalzoom.smoothcloud.co:3027/live/canalzoombr1live.m3u8 -#EXTINF:-1 tvg-id="CanalRCN.co" http-referrer="https://www.canalrcn.com/",Canal RCN (480p) +#EXTINF:-1 tvg-id="CanalRCN.co",Canal RCN (480p) http://38.183.182.166:8000/play/a10i/index.m3u8 diff --git a/streams/ee.m3u b/streams/ee.m3u index f26322a0be..f6c2dd4244 100644 --- a/streams/ee.m3u +++ b/streams/ee.m3u @@ -35,3 +35,5 @@ https://le02.euddn.net/6487956abb8faf0706d8c4c2465f54cb3625b812fec8e13d11668907f http://dc.tbnbaltia.eu:8088/dvr/rewind-21600.m3u8 #EXTINF:-1 tvg-id="TVN.ee",TVN (1080p) https://s4.telset.ee/tvn/index.m3u8?filter.tracks=v1a1&token=tvn_token +#EXTINF:-1 tvg-id="Nickelodeon.ee",Nickelodeon (576p) +http://195.64.140.147:10121/121 diff --git a/streams/eg.m3u b/streams/eg.m3u index 2e11130507..8b73dc55a3 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -49,7 +49,7 @@ https://mn-nl.mncdn.com/elsharq_live/live/playlist.m3u8 https://cdn.bestream.io:19360/elfaro1/elfaro1.m3u8 #EXTINF:-1 tvg-id="KoogiTV.eg",Koogi TV (1080p) https://5d658d7e9f562.streamlock.net/koogi.tv/koogi.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="MBC1Egypt.eg@SD",MBC 1 Egypt (1080p) +#EXTINF:-1 tvg-id="MBC1Egypt.eg@HD",MBC 1 Egypt (1080p) https://shd-gcp-live.edgenextcdn.net/live/bitmovin-mbc-1-na/eec141533c90dd34722c503a296dd0d8/index.m3u8 #EXTINF:-1 tvg-id="MBCMasr.eg",MBC Masr (1080p) https://mbc1-enc.edgenextcdn.net/out/v1/d5036cabf11e45bf9d0db410ca135c18/index.m3u8 diff --git a/streams/et.m3u b/streams/et.m3u index ebf32bfb74..2565b6320b 100644 --- a/streams/et.m3u +++ b/streams/et.m3u @@ -13,3 +13,5 @@ https://rumble.com/live-hls-dvr/4c14o3/playlist.m3u8 https://g4wlkqp8l23a-hls-live.5centscdn.com/MerejaTV/955ad3298db330b5ee880c2c9e6f23a0.sdp/playlist.m3u8 #EXTINF:-1 tvg-id="NesihaTV.et",Nesiha TV (720p) https://ffs3.gulfsat.com/Nesiha-TV/video.m3u8 +#EXTINF:-1 tvg-id="AddisMediaNetwork.et@SD",Addis Media Network +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/addismedianetwork/playlist.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index b7768f24d2..e04cd24979 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -293,3 +293,5 @@ http://122.248.43.242:1935/JAWAPOSTVBALI/_definst_/myStream/playlist.m3u8 https://hgmtv.com:19360/asthatv/asthatv.m3u8 #EXTINF:-1 tvg-id="BatamTV.id@SD",Batam TV (480p) [Not 24/7] http://122.248.43.242:1935/BATAMTV/_definst_/myStream/playlist.m3u8 +#EXTINF:-1 tvg-id="MadaniTV.id@SD" http-referrer="https://madanitv.net/livestream",Madani TV (720p) +https://stream.asianastream.com/madani/madanitv.smil/playlist.m3u8 diff --git a/streams/md.m3u b/streams/md.m3u index 4885dc4a9b..c79c057fb7 100644 --- a/streams/md.m3u +++ b/streams/md.m3u @@ -3,48 +3,26 @@ http://hls.protv.md/acasatv/acasatv.m3u8 #EXTINF:-1 tvg-id="BaltiTV.md",Bălţi TV (1080p) [Geo-blocked] http://77.89.199.174:8000/play/1024/index.m3u8 -#EXTINF:-1 tvg-id="BusuiocTV.md",Busuioc TV (1080p) -http://62.233.57.226:8001/play/a005 #EXTINF:-1 tvg-id="BusuiocTV.md",Busuioc TV (540p) [Not 24/7] https://busuioctv.iforward.eu/hls/busuioc.m3u8 -#EXTINF:-1 tvg-id="Cinema1.md",Cinema 1 (1080p) -http://62.233.57.226:8001/play/a00l00 #EXTINF:-1 tvg-id="DrochiaTV.md",Drochia TV (1080p) [Not 24/7] https://hls.drochia.tv/tv/web.m3u8 #EXTINF:-1 tvg-id="DuniaSinema.my",Dunia Sinema (1080p) https://unifi-live05.secureswiftcontent.com/UnifiHD/live27-1080FHD.m3u8 -#EXTINF:-1 tvg-id="ExclusivTV.md",Exclusiv TV (1080p) -http://62.233.57.226:8001/play/a00f -#EXTINF:-1 tvg-id="GRT.md",GRT (1080p) -http://62.233.57.226:8001/play/a00f00 #EXTINF:-1 tvg-id="Moldova1.md",Moldova 1 (1080p) https://v0.trm.md/static/streaming-playlists/hls/9b79338b-1870-4cd7-91d4-0f6ce5cac7ca/master.m3u8 #EXTINF:-1 tvg-id="Moldova2.md",Moldova 2 (1080p) -http://62.233.57.226:8001/play/a00a -#EXTINF:-1 tvg-id="Moldova2.md",Moldova 2 (1080p) https://v0.trm.md/static/streaming-playlists/hls/d5fafab0-9c37-4746-9e7a-b2d6c0427015/master.m3u8 #EXTINF:-1 tvg-id="MoldovaTV.md",Moldova TV (576p) [Not 24/7] http://89.38.8.130:39435 #EXTINF:-1 tvg-id="MoldovaTV.md@SD",Moldova TV https://moldovatv.ro/live-tv/live.m3u8 -#EXTINF:-1 tvg-id="N4.md",N4 (1080p) -http://62.233.57.226:8001/play/a007 #EXTINF:-1 tvg-id="N4.md",N4 (360p) [Not 24/7] https://web.sats.gstv.tech/cpl11/da8df281-1165-440a-8c86-959f71b695b6/N4web.m3u8 -#EXTINF:-1 tvg-id="NextTV.md",Next TV (1080p) -http://62.233.57.226:8001/play/a00h -#EXTINF:-1 tvg-id="NorocTV.md",Noroc TV (1080p) -http://62.233.57.226:8001/play/a00i00 #EXTINF:-1 tvg-id="NorocTV.md",Noroc TV (576p) [Not 24/7] https://live.noroc.tv/noroc/noroc.m3u8 -#EXTINF:-1 tvg-id="NTSTV.md",NTS TV (1080p) -http://62.233.57.226:8001/play/a00d -#EXTINF:-1 tvg-id="PremieraTV.md",Premiera TV (1080p) -http://62.233.57.226:8001/play/a009 #EXTINF:-1 tvg-id="PrivescEuTV.md",Privesc.Eu TV (2160p) https://cachestar.privesc.eu/liniar/moldova/playlist.m3u8 -#EXTINF:-1 tvg-id="PROTVChisinau.md",PRO TV Chisinau (1080p) -http://62.233.57.226:8001/play/a00g #EXTINF:-1 tvg-id="PROTVChisinau.md",PRO TV Chisinau (360p) http://stream.protv.md/live/sursa-2/index.m3u8 #EXTINF:-1 tvg-id="PublikaTV.md",Publika TV (720p) @@ -53,13 +31,9 @@ https://livebeta.publika.press/LIVE/P/6810.m3u8 https://realitatealive.md/tv/rlive.m3u8 #EXTINF:-1 tvg-id="SorTV.md",Sor TV (720p) http://188.237.212.16:8888/live/cameraFeed.m3u8 -#EXTINF:-1 tvg-id="StarTV.md",Star TV (1080p) -http://62.233.57.226:8001/play/a008 #EXTINF:-1 tvg-id="TeleM.md",TeleM (576p) https://tv.streambox.ro/hls/telem/index.m3u8 #EXTINF:-1 tvg-id="TezaurTV.md",Tezaur TV (1080p) -http://62.233.57.226:8001/play/a00j -#EXTINF:-1 tvg-id="TezaurTV.md",Tezaur TV (1080p) https://tezaurtv.md/wp-content/uploads/live/index.m3u8 #EXTINF:-1 tvg-id="TVNord.md",TV-Nord (1080p) https://6065d3147e895.streamlock.net:4444/npcl/live/playlist.m3u8 @@ -67,5 +41,3 @@ https://6065d3147e895.streamlock.net:4444/npcl/live/playlist.m3u8 https://tvr-tvrmoldova.cdn.zitec.com/live/tvrmoldova/main.m3u8 #EXTINF:-1 tvg-id="VoceaBasarabieiTV.md",Vocea Basarabiei TV (720p) [Not 24/7] https://storage.voceabasarabiei.md/vocea/vocea.m3u8 -#EXTINF:-1 tvg-id="ZonaM.md",Zona M (576p) -http://62.233.57.226:8001/play/a00e diff --git a/streams/uk.m3u b/streams/uk.m3u index dab31d176b..a666504d88 100644 --- a/streams/uk.m3u +++ b/streams/uk.m3u @@ -340,3 +340,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119194/kicctv/playlist.m3u https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/voxafrica/playlist.m3u8 #EXTINF:-1 tvg-id="HornCableTV.uk@SD",Horn Cable TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/horncabletv/playlist.m3u8 +#EXTINF:-1 tvg-id="ITV1.uk",ITV1 (1080p) +https://dttstream.zappr.stream/itv1.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index faed477b0b..49a7b4c1dd 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -202,7 +202,7 @@ https://live-us-cdn-1.tvstartupengine.com/live/playlist-prod-da1ba36f-39ba-4347- #EXTINF:-1 tvg-id="CatholicTV.us",Catholic TV https://catholictvhd-lh.akamaized.net/hls/live/2043390/CTVLiveHD/master.m3u8 #EXTINF:-1 tvg-id="CBNEspanol.us@SD",CBN Espanol (1080p) -https://fastly.live.brightcove.com/6376551608112/us-east-1/734546207001/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiczFpM3ZpLmVncmVzcy50N2M3emwiLCJhY2NvdW50X2lkIjoiNzM0NTQ2MjA3MDAxIiwiZWhuIjoiZmFzdGx5LmxpdmUuYnJpZ2h0Y292ZS5jb20iLCJpc3MiOiJibGl2ZS1wbGF5YmFjay1zb3VyY2UtYXBpIiwic3ViIjoicGF0aG1hcHRva2VuIiwiYXVkIjpbIjczNDU0NjIwNzAwMSJdLCJqdGkiOiI2Mzc2NTUxNjA4MTEyIn0.2FsY7zpProcebRUF-dcSfZhhOTqou5DzOGfvr_CeYEM/playlist-hls.m3u8 +https://fastly.live.brightcove.com/6380375173112/us-east-1/734546207001/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiczFpM3ZpLmVncmVzcy50N2M3emwiLCJhY2NvdW50X2lkIjoiNzM0NTQ2MjA3MDAxIiwiZWhuIjoiZmFzdGx5LmxpdmUuYnJpZ2h0Y292ZS5jb20iLCJpc3MiOiJibGl2ZS1wbGF5YmFjay1zb3VyY2UtYXBpIiwic3ViIjoicGF0aG1hcHRva2VuIiwiYXVkIjpbIjczNDU0NjIwNzAwMSJdLCJqdGkiOiI2MzgwMzc1MTczMTEyIn0.6G0g6pn30iXNuqgU65sl3NImj3ORhxGNdhHGja671ck/playlist-hls.m3u8 #EXTINF:-1 tvg-id="CBNFamily.us",CBN Family (1080p) https://bcovlive-a.akamaihd.net/r602a47f47fee47bb83239eb1b1e1ac83/us-east-1/734546207001/playlist.m3u8 #EXTINF:-1 tvg-id="CBNNews.us",CBN News National (1080p) @@ -311,11 +311,11 @@ https://cdn3.wowza.com/1/QjRzVXJtVml5SUVx/WGJRSWxz/hls/live/playlist.m3u8 https://cdn3.wowza.com/1/TUI5dU5ucnUxdGFD/ZFlVeGRl/hls/live/playlist.m3u8 #EXTINF:-1 tvg-id="EWTN.us@AfricaAsia",EWTN Africa Asia (720p) https://cdn3.wowza.com/1/ZVBYYXFLLzE0c3NC/Qk1FMURC/hls/live/playlist.m3u8 -#EXTINF:-1 tvg-id="EWTN.us@AsiaPacific",EWTN Asia-Pacific (720p) [Not 24/7] +#EXTINF:-1 tvg-id="EWTN.us@AsiaPacific",EWTN Asia-Pacific (720p) https://cdn3.wowza.com/1/QmVNUVhTNTZSS3Uz/YWQ0aHpi/hls/live/playlist.m3u8 -#EXTINF:-1 tvg-id="EWTN.us@SpainLatinAmerica",EWTN Spain & Latin America (720p) [Not 24/7] +#EXTINF:-1 tvg-id="EWTN.us@SpainLatinAmerica",EWTN Spain & Latin America (720p) https://cdn3.wowza.com/1/SmVrQmZCUXZhVDgz/b3J3MFJv/hls/live/playlist.m3u8 -#EXTINF:-1 tvg-id="EWTN.us@Europe",EWTN Europe (720p) [Not 24/7] +#EXTINF:-1 tvg-id="EWTN.us@Europe",EWTN Europe (720p) https://cdn3.wowza.com/1/T2NXeHF6UGlGbHY3/WFluRldQ/hls/live/playlist.m3u8 #EXTINF:-1 tvg-id="ExtremaTV.us",Extrema TV (720p) http://livestreamcdn.net:1935/ExtremaTV/ExtremaTV/playlist.m3u8 @@ -397,8 +397,6 @@ https://cors-proxy.cooks.fyi/https://streamer1.nexgen.bz/HISTORY2/index.m3u8 https://video1.getstreamhosting.com:1936/8326/8326/playlist.m3u8 #EXTINF:-1 tvg-id="HollyWire.us",HollyWire (720p) https://bozztv.com/hwotta/playlist/playlist.m3u8 -#EXTINF:-1 tvg-id="HopeChannelAfrica.us",Hope Channel Africa (1080p) -https://jstre.am/live/jsl:i1onRBELcGV.m3u8 #EXTINF:-1 tvg-id="HopeChannelInterAmerica.us",Hope Channel Inter-America https://jstre.am/live/jsl:EC0Mq0i6HJU.m3u8 #EXTINF:-1 tvg-id="HopeChannelInternational.us",Hope Channel International (1080p) @@ -1072,9 +1070,15 @@ https://e5.thetvapp.to/hls/WNET/index.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120913/alhayat/playlist.m3u8 #EXTINF:-1 tvg-id="WNJUDT1.us@SD",WNJU-DT1 (360p) https://e5.thetvapp.to/hls/TelemundoEast/tracks-v2a1/mono.m3u8 -#EXTINF:-1 tvg-id="NationalGeographicLatinAmerica.us@South" http-referrer="http://www.nationalgeographicla.com/",National Geographic Latin America South (1080p) +#EXTINF:-1 tvg-id="NationalGeographicLatinAmerica.us@South",National Geographic Latin America South (1080p) http://38.183.182.166:8000/play/a0vd/index.m3u8 #EXTINF:-1 tvg-id="StarChannelLatinAmerica.us@South",Star Channel Latin America South (1080p) http://181.188.216.5:18000/play/a0pm/index.m3u8 #EXTINF:-1 tvg-id="ElbesharaGTV.us@SD",Elbeshara GTV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/elbeshara/playlist.m3u8 +#EXTINF:-1 tvg-id="EBS.us@SD",EBS +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/ebstv/playlist.m3u8 +#EXTINF:-1 tvg-id="ESPNDeportes.us@SD",ESPN Deportes (1080p) [Not 24/7] +https://stream.mux.com/DyxPGQOWJuWUxJ7uY2lhrnI0102Z3lo3qUxlaW01zQ2Ozs.m3u8 +#EXTINF:-1 tvg-id="DirecTVSports.us" http-referrer="https://www.directvsports.com/",DirecTV Sports (1080p) +http://38.183.182.166:8000/play/a125/index.m3u8 diff --git a/streams/za.m3u b/streams/za.m3u index 386df8f807..e6d4b1ed25 100644 --- a/streams/za.m3u +++ b/streams/za.m3u @@ -1,4 +1,6 @@ #EXTM3U +#EXTINF:-1 tvg-id="HopeChannelAfrica.za@SD",Hope Channel Africa (1080p) +https://jstre.am/live/jsl:i1onRBELcGV.m3u8 #EXTINF:-1 tvg-id="AnytimeTV.za",Anytime TV (1080p) https://tv.anytimemedia.co.za:3673/hybrid/play.m3u8 #EXTINF:-1 tvg-id="BOKTV.za",BOKTV (720p) [Not 24/7] From 482c28c2682e4588643dc07fd190629ad3d49710 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 00:12:58 +0000 Subject: [PATCH 29/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18329633716) workflow. --- PLAYLISTS.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index b2acbc0487..65906ac578 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -22,33 +22,33 @@ Same thing, but split up into separate files: CategoryChannelsPlaylist - Animation59https://iptv-org.github.io/iptv/categories/animation.m3u + Animation60https://iptv-org.github.io/iptv/categories/animation.m3u Auto18https://iptv-org.github.io/iptv/categories/auto.m3u Business67https://iptv-org.github.io/iptv/categories/business.m3u Classic45https://iptv-org.github.io/iptv/categories/classic.m3u Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u - Culture168https://iptv-org.github.io/iptv/categories/culture.m3u + Culture169https://iptv-org.github.io/iptv/categories/culture.m3u Documentary124https://iptv-org.github.io/iptv/categories/documentary.m3u Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment637https://iptv-org.github.io/iptv/categories/entertainment.m3u + Entertainment635https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General2428https://iptv-org.github.io/iptv/categories/general.m3u + General2427https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids270https://iptv-org.github.io/iptv/categories/kids.m3u + Kids271https://iptv-org.github.io/iptv/categories/kids.m3u Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u Lifestyle106https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies374https://iptv-org.github.io/iptv/categories/movies.m3u + Movies373https://iptv-org.github.io/iptv/categories/movies.m3u Music633https://iptv-org.github.io/iptv/categories/music.m3u - News832https://iptv-org.github.io/iptv/categories/news.m3u + News831https://iptv-org.github.io/iptv/categories/news.m3u Outdoor43https://iptv-org.github.io/iptv/categories/outdoor.m3u Public26https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u - Religious721https://iptv-org.github.io/iptv/categories/religious.m3u + Religious722https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u Series261https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u - Sports300https://iptv-org.github.io/iptv/categories/sports.m3u + Sports301https://iptv-org.github.io/iptv/categories/sports.m3u Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u @@ -85,8 +85,8 @@ Same thing, but split up into separate files: Albanian42https://iptv-org.github.io/iptv/languages/sqi.m3u Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u - Amharic6https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic440https://iptv-org.github.io/iptv/languages/ara.m3u + Amharic8https://iptv-org.github.io/iptv/languages/amh.m3u + Arabic441https://iptv-org.github.io/iptv/languages/ara.m3u Armenian7https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -125,8 +125,8 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2401https://iptv-org.github.io/iptv/languages/eng.m3u - Estonian8https://iptv-org.github.io/iptv/languages/est.m3u + English2404https://iptv-org.github.io/iptv/languages/eng.m3u + Estonian9https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u Fataleka2https://iptv-org.github.io/iptv/languages/far.m3u @@ -154,7 +154,7 @@ Same thing, but split up into separate files: Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u Hungarian103https://iptv-org.github.io/iptv/languages/hun.m3u Icelandic5https://iptv-org.github.io/iptv/languages/isl.m3u - Indonesian138https://iptv-org.github.io/iptv/languages/ind.m3u + Indonesian139https://iptv-org.github.io/iptv/languages/ind.m3u Inuktitut1https://iptv-org.github.io/iptv/languages/iku.m3u Irish3https://iptv-org.github.io/iptv/languages/gle.m3u Isekiri1https://iptv-org.github.io/iptv/languages/its.m3u @@ -217,6 +217,7 @@ Same thing, but split up into separate files: Nyankole1https://iptv-org.github.io/iptv/languages/nyn.m3u Nyoro1https://iptv-org.github.io/iptv/languages/nyo.m3u Oriya (macrolanguage)14https://iptv-org.github.io/iptv/languages/ori.m3u + Oromo1https://iptv-org.github.io/iptv/languages/orm.m3u Panjabi30https://iptv-org.github.io/iptv/languages/pan.m3u Papiamento17https://iptv-org.github.io/iptv/languages/pap.m3u Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u @@ -225,9 +226,9 @@ Same thing, but split up into separate files: Portuguese254https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u - Romanian105https://iptv-org.github.io/iptv/languages/ron.m3u + Romanian98https://iptv-org.github.io/iptv/languages/ron.m3u Rundi2https://iptv-org.github.io/iptv/languages/run.m3u - Russian357https://iptv-org.github.io/iptv/languages/rus.m3u + Russian352https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u Samoan2https://iptv-org.github.io/iptv/languages/smo.m3u Sango1https://iptv-org.github.io/iptv/languages/sag.m3u @@ -242,7 +243,7 @@ Same thing, but split up into separate files: South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1724https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1725https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u Swahili38https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u @@ -285,7 +286,7 @@ Same thing, but split up into separate files: Yue Chinese5https://iptv-org.github.io/iptv/languages/yue.m3u Zarma4https://iptv-org.github.io/iptv/languages/dje.m3u Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u - Undefined2177https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined2176https://iptv-org.github.io/iptv/languages/undefined.m3u From eac29a0f1a8589684d9b84649b69b73fa39b7f64 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 20:40:22 +0300 Subject: [PATCH 30/51] Replace LF with CRLF --- .../__data__/expected/playlist_format/in.m3u | 6 +- .../.gh-pages/categories/general.m3u | 14 +-- .../.gh-pages/categories/legislative.m3u | 2 +- .../.gh-pages/categories/news.m3u | 6 +- .../.gh-pages/categories/undefined.m3u | 42 ++++----- .../.gh-pages/categories/weather.m3u | 6 +- .../.gh-pages/categories/xxx.m3u | 6 +- .../.gh-pages/cities/adcan.m3u | 6 +- .../.gh-pages/countries/ad.m3u | 6 +- .../.gh-pages/countries/ca.m3u | 10 +-- .../.gh-pages/countries/int.m3u | 18 ++-- .../.gh-pages/countries/ru.m3u | 6 +- .../.gh-pages/countries/undefined.m3u | 30 +++---- .../.gh-pages/index.category.m3u | 62 ++++++------- .../.gh-pages/index.country.m3u | 62 ++++++------- .../.gh-pages/index.language.m3u | 58 ++++++------ .../playlist_generate/.gh-pages/index.m3u | 58 ++++++------ .../.gh-pages/languages/eng.m3u | 6 +- .../.gh-pages/languages/rus.m3u | 6 +- .../.gh-pages/languages/undefined.m3u | 46 +++++----- .../playlist_generate/.gh-pages/raw/ca.m3u | 10 +-- .../playlist_generate/.gh-pages/raw/in.m3u | 6 +- .../playlist_generate/.gh-pages/raw/kg.m3u | 6 +- .../playlist_generate/.gh-pages/raw/uk.m3u | 6 +- .../.gh-pages/raw/unsorted.m3u | 30 +++---- .../.gh-pages/regions/afr.m3u | 10 +-- .../.gh-pages/regions/amer.m3u | 22 ++--- .../.gh-pages/regions/apac.m3u | 10 +-- .../.gh-pages/regions/arab.m3u | 10 +-- .../.gh-pages/regions/asean.m3u | 10 +-- .../.gh-pages/regions/asia.m3u | 18 ++-- .../.gh-pages/regions/carib.m3u | 10 +-- .../.gh-pages/regions/cas.m3u | 14 +-- .../.gh-pages/regions/cenamer.m3u | 10 +-- .../.gh-pages/regions/cis.m3u | 18 ++-- .../.gh-pages/regions/emea.m3u | 22 ++--- .../.gh-pages/regions/eur.m3u | 22 ++--- .../.gh-pages/regions/hispam.m3u | 10 +-- .../.gh-pages/regions/lac.m3u | 10 +-- .../.gh-pages/regions/latam.m3u | 10 +-- .../.gh-pages/regions/maghreb.m3u | 10 +-- .../.gh-pages/regions/mena.m3u | 10 +-- .../.gh-pages/regions/mideast.m3u | 10 +-- .../.gh-pages/regions/nam.m3u | 22 ++--- .../.gh-pages/regions/noram.m3u | 22 ++--- .../.gh-pages/regions/nord.m3u | 10 +-- .../.gh-pages/regions/oce.m3u | 10 +-- .../.gh-pages/regions/sas.m3u | 10 +-- .../.gh-pages/regions/southam.m3u | 10 +-- .../.gh-pages/regions/ssa.m3u | 10 +-- .../.gh-pages/regions/wafr.m3u | 10 +-- .../.gh-pages/regions/ww.m3u | 30 +++---- .../.gh-pages/sources/ad.m3u | 14 +-- .../.gh-pages/sources/ca.m3u | 10 +-- .../.gh-pages/sources/in.m3u | 6 +- .../.gh-pages/sources/kg.m3u | 6 +- .../.gh-pages/sources/uk.m3u | 6 +- .../.gh-pages/sources/unsorted.m3u | 30 +++---- .../.gh-pages/subdivisions/ad-02.m3u | 6 +- .../.gh-pages/subdivisions/ad-07.m3u | 6 +- .../.gh-pages/subdivisions/ca-on.m3u | 6 +- .../__data__/expected/playlist_update/cy.m3u | 6 +- tests/__data__/input/api_generate/ad.m3u | 10 +-- tests/__data__/input/api_generate/ca.m3u | 6 +- tests/__data__/input/api_generate/in.m3u | 6 +- tests/__data__/input/api_generate/uk.m3u | 6 +- .../__data__/input/api_generate/unsorted.m3u | 18 ++-- .../__data__/input/playlist_edit/playlist.m3u | 8 +- tests/__data__/input/playlist_format/in.m3u | 6 +- tests/__data__/input/playlist_format/nl.m3u | 34 +++---- tests/__data__/input/playlist_generate/ad.m3u | 18 ++-- tests/__data__/input/playlist_generate/ca.m3u | 10 +-- tests/__data__/input/playlist_generate/in.m3u | 6 +- tests/__data__/input/playlist_generate/kg.m3u | 6 +- tests/__data__/input/playlist_generate/uk.m3u | 6 +- .../input/playlist_generate/unsorted.m3u | 30 +++---- tests/__data__/input/playlist_test/ag.m3u | 8 +- tests/__data__/input/playlist_update/br.m3u | 12 +-- tests/__data__/input/playlist_update/cy.m3u | 14 +-- tests/__data__/input/playlist_update/uk.m3u | 10 +-- .../input/playlist_validate/us_blocked.m3u | 14 +-- .../input/playlist_validate/wrong_id.m3u | 18 ++-- tests/__data__/input/report_create/br.m3u | 12 +-- tests/__data__/input/report_create/cy.m3u | 10 +-- tests/__data__/input/report_create/uk.m3u | 10 +-- tests/__data__/input/report_create/us.m3u | 8 +- tests/commands/playlist/update.test.ts | 89 ++++++++++--------- 87 files changed, 682 insertions(+), 673 deletions(-) diff --git a/tests/__data__/expected/playlist_format/in.m3u b/tests/__data__/expected/playlist_format/in.m3u index 44a00ace12..2615da4e4c 100644 --- a/tests/__data__/expected/playlist_format/in.m3u +++ b/tests/__data__/expected/playlist_format/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] -https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] +https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/general.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/general.m3u index e9587edc70..d43fa35f64 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/general.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/general.m3u @@ -1,7 +1,7 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/legislative.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/legislative.m3u index fcd718794a..7452e53aad 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/legislative.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/legislative.m3u @@ -1 +1 @@ -#EXTM3U +#EXTM3U diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/news.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/news.m3u index cf4e62a9a5..85c75b78bf 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/news.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/news.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/undefined.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/undefined.m3u index 2a2adcdbe2..5373b79516 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/undefined.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/undefined.m3u @@ -1,21 +1,21 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/weather.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/weather.m3u index 4686c68f4b..03a6963a33 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/weather.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/weather.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/categories/xxx.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/categories/xxx.m3u index d1e3a69bcd..a6791d64b8 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/categories/xxx.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/categories/xxx.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV -https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV +https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/cities/adcan.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/cities/adcan.m3u index 92a59e8a10..e85626ca16 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/cities/adcan.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/cities/adcan.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ad.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ad.m3u index 92a59e8a10..e85626ca16 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ad.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ad.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ca.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ca.m3u index 8aeaaae90e..79ba1e61d2 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ca.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ca.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/countries/int.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/countries/int.m3u index 202cd4e3fa..8d37f3ba9b 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/countries/int.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/countries/int.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ru.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ru.m3u index cbfde92492..b701890a36 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/countries/ru.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/countries/ru.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/countries/undefined.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/countries/undefined.m3u index 1770572503..dd4df2992c 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/countries/undefined.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/countries/undefined.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTM3U +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/index.category.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/index.category.m3u index 3362671646..125eb49e67 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/index.category.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/index.category.m3u @@ -1,31 +1,31 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/index.country.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/index.country.m3u index c2e0db5d9c..8d8394b09d 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/index.country.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/index.country.m3u @@ -1,31 +1,31 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Andorra",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Canada",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Canada",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="Russia",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="International",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="International",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="International",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="International",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Andorra",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Canada",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Canada",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="Russia",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="International",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="International",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="International",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="International",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/index.language.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/index.language.m3u index 60b49b6b45..626893e3e9 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/index.language.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/index.language.m3u @@ -1,29 +1,29 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Catalan",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="English",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="Russian",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Undefined",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="Undefined",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Catalan",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="English",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="Russian",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Undefined",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="Undefined",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/index.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/index.m3u index da169ed076..255edf9a86 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/index.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/index.m3u @@ -1,29 +1,29 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/languages/eng.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/languages/eng.m3u index cf4e62a9a5..85c75b78bf 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/languages/eng.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/languages/eng.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/languages/rus.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/languages/rus.m3u index cbfde92492..b701890a36 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/languages/rus.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/languages/rus.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/languages/undefined.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/languages/undefined.m3u index c42bfbb582..1bca3048d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/languages/undefined.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/languages/undefined.m3u @@ -1,23 +1,23 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/ca.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/ca.m3u index 8aeaaae90e..79ba1e61d2 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/ca.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/ca.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/in.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/in.m3u index 4708e622d8..d2223daac4 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/in.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/kg.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/kg.m3u index a9387b8b44..847591ab04 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/kg.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/kg.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/uk.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/uk.m3u index cf4e62a9a5..85c75b78bf 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/uk.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/uk.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/unsorted.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/unsorted.m3u index b626b1cba0..530c218fa6 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/unsorted.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/unsorted.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV -https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV +https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/afr.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/afr.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/afr.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/afr.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/amer.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/amer.m3u index 226aaf5de9..450e02495f 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/amer.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/amer.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/apac.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/apac.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/apac.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/apac.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/arab.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/arab.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/arab.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/arab.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/asean.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/asean.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/asean.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/asean.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/asia.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/asia.m3u index 202cd4e3fa..8d37f3ba9b 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/asia.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/asia.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/carib.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/carib.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/carib.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/carib.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cas.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cas.m3u index 4e507cf645..56b1dd594c 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cas.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cas.m3u @@ -1,7 +1,7 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cenamer.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cenamer.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cenamer.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cenamer.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cis.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cis.m3u index 202cd4e3fa..8d37f3ba9b 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/cis.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/cis.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/emea.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/emea.m3u index 9a8e344397..3d0f820ccc 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/emea.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/emea.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/eur.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/eur.m3u index 9a8e344397..3d0f820ccc 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/eur.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/eur.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/hispam.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/hispam.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/hispam.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/hispam.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/lac.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/lac.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/lac.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/lac.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/latam.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/latam.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/latam.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/latam.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/maghreb.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/maghreb.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/maghreb.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/maghreb.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/mena.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/mena.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/mena.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/mena.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/mideast.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/mideast.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/mideast.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/mideast.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/nam.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/nam.m3u index 226aaf5de9..450e02495f 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/nam.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/nam.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/noram.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/noram.m3u index 226aaf5de9..450e02495f 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/noram.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/noram.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/nord.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/nord.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/nord.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/nord.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/oce.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/oce.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/oce.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/oce.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/sas.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/sas.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/sas.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/sas.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/southam.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/southam.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/southam.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/southam.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/ssa.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/ssa.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/ssa.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/ssa.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/wafr.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/wafr.m3u index c549c09ce1..15240af7d0 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/wafr.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/wafr.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/regions/ww.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/regions/ww.m3u index edb9b671dc..297163fc51 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/regions/ww.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/regions/ww.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/ad.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/ad.m3u index 2894094c7e..55aaf78b41 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/ad.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/ad.m3u @@ -1,7 +1,7 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/ca.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/ca.m3u index 8aeaaae90e..79ba1e61d2 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/ca.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/ca.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca" tvg-logo="" group-title="Undefined",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/in.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/in.m3u index 4708e622d8..d2223daac4 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/in.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/kg.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/kg.m3u index a9387b8b44..847591ab04 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/kg.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/kg.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="ElTR.kg" tvg-logo="https://i.ibb.co/r6czQwQ/365049798-774721644658455-5702658175909463406-n-2.png" group-title="General",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/uk.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/uk.m3u index cf4e62a9a5..85c75b78bf 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/uk.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/uk.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk" tvg-logo="https://raw.githubusercontent.com/Tapiosinn/tv-logos/master/countries/united-kingdom/bbc-news-uk.png" group-title="General;News",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/sources/unsorted.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/sources/unsorted.m3u index 05c8cb479f..52eb85ee4e 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/sources/unsorted.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/sources/unsorted.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 -#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV -https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Undefined" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="DunaWorld.hu" tvg-logo="https://i.imgur.com/uOBQJZS.png" group-title="Undefined",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTINF:-1 tvg-id="LDPRTV.ru" tvg-logo="https://iptvx.one/icn/ldpr-tv.png" group-title="General",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="VisitXTV.nl" tvg-logo="https://i.imgur.com/RJ9wbNF.jpg" group-title="XXX",Visit-X TV +https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-02.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-02.m3u index 92a59e8a10..e85626ca16 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-02.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-02.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-07.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-07.m3u index 92a59e8a10..e85626ca16 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-07.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ad-07.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ca-on.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ca-on.m3u index 4686c68f4b..03a6963a33 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ca-on.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/subdivisions/ca-on.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="MeteoMedia.ca" tvg-logo="https://s1.twnmm.com/images/en_ca/mobile/logos/twn-mobile-logo.png" group-title="Weather",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/expected/playlist_update/cy.m3u b/tests/__data__/expected/playlist_update/cy.m3u index 987825ca1d..13482713e9 100644 --- a/tests/__data__/expected/playlist_update/cy.m3u +++ b/tests/__data__/expected/playlist_update/cy.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="AdaTV.cy",AdaTV -https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="AdaTV.cy",AdaTV +https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 diff --git a/tests/__data__/input/api_generate/ad.m3u b/tests/__data__/input/api_generate/ad.m3u index 34aad90534..9cb32a9b9e 100644 --- a/tests/__data__/input/api_generate/ad.m3u +++ b/tests/__data__/input/api_generate/ad.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="Zoo.ad",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="AndorraTV.ad@SD",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTM3U +#EXTINF:-1 tvg-id="Zoo.ad",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="AndorraTV.ad@SD",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" diff --git a/tests/__data__/input/api_generate/ca.m3u b/tests/__data__/input/api_generate/ca.m3u index 9c198b6829..672601d7f7 100644 --- a/tests/__data__/input/api_generate/ca.m3u +++ b/tests/__data__/input/api_generate/ca.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="MeteoMedia.ca",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="MeteoMedia.ca",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/input/api_generate/in.m3u b/tests/__data__/input/api_generate/in.m3u index 62594eb4bf..c375e17ace 100644 --- a/tests/__data__/input/api_generate/in.m3u +++ b/tests/__data__/input/api_generate/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 diff --git a/tests/__data__/input/api_generate/uk.m3u b/tests/__data__/input/api_generate/uk.m3u index 5e8c7318e5..4a8a1f64ab 100644 --- a/tests/__data__/input/api_generate/uk.m3u +++ b/tests/__data__/input/api_generate/uk.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/input/api_generate/unsorted.m3u b/tests/__data__/input/api_generate/unsorted.m3u index 1a9c40b9fd..96f9299e2d 100644 --- a/tests/__data__/input/api_generate/unsorted.m3u +++ b/tests/__data__/input/api_generate/unsorted.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="LDPRTV.ru",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="VisitXTV.nl",Visit-X TV -https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 -#EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="LDPRTV.ru",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="VisitXTV.nl",Visit-X TV +https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 +#EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8 diff --git a/tests/__data__/input/playlist_edit/playlist.m3u b/tests/__data__/input/playlist_edit/playlist.m3u index 2ebf1ffa7a..0abd41b6f2 100644 --- a/tests/__data__/input/playlist_edit/playlist.m3u +++ b/tests/__data__/input/playlist_edit/playlist.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="HewadTV.af",Hewad TV (720p) [Not 24/7] -http://51.210.199.58/hls/stream.m3u8 -#EXTINF:-1 tvg-id="",Télévision française 1 (480p) +#EXTM3U +#EXTINF:-1 tvg-id="HewadTV.af",Hewad TV (720p) [Not 24/7] +http://51.210.199.58/hls/stream.m3u8 +#EXTINF:-1 tvg-id="",Télévision française 1 (480p) https://live.relentlessinnovations.net:1936/imantv/imantv/playlist.m3u8 \ No newline at end of file diff --git a/tests/__data__/input/playlist_format/in.m3u b/tests/__data__/input/playlist_format/in.m3u index 47c77da2e0..3d0bcd3596 100644 --- a/tests/__data__/input/playlist_format/in.m3u +++ b/tests/__data__/input/playlist_format/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="mn.in",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] -https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="mn.in",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] +https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 diff --git a/tests/__data__/input/playlist_format/nl.m3u b/tests/__data__/input/playlist_format/nl.m3u index b7819a6046..1d12f3b3e1 100644 --- a/tests/__data__/input/playlist_format/nl.m3u +++ b/tests/__data__/input/playlist_format/nl.m3u @@ -1,17 +1,17 @@ -#EXTM3U -#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 (302p) [Geo-blocked] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://stream.tvtap.net:8081/live/nl-npo2.stream/playlist.m3u8?|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 [Geo-blocked] -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8 -#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 (342p) -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 -#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked] -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo1/npo1.isml/.m3u8 -#EXTINF:-1 tvg-id="",NPO 2 (Duplicate) -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 (302p) [Geo-blocked] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://stream.tvtap.net:8081/live/nl-npo2.stream/playlist.m3u8?|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 [Geo-blocked] +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8 +#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 (342p) +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 +#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked] +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo1/npo1.isml/.m3u8 +#EXTINF:-1 tvg-id="",NPO 2 (Duplicate) +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 diff --git a/tests/__data__/input/playlist_generate/ad.m3u b/tests/__data__/input/playlist_generate/ad.m3u index 9a1c9e175a..3c3bcae1db 100644 --- a/tests/__data__/input/playlist_generate/ad.m3u +++ b/tests/__data__/input/playlist_generate/ad.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="Zoo.ad@HD",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="AndorraTV.ad@SD",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="AndorraTV.ad@HD",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="AndorraTV.ad",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv2 +#EXTM3U +#EXTINF:-1 tvg-id="Zoo.ad@HD",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="AndorraTV.ad@SD",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="AndorraTV.ad@HD",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="AndorraTV.ad",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv2 diff --git a/tests/__data__/input/playlist_generate/ca.m3u b/tests/__data__/input/playlist_generate/ca.m3u index aa108e4229..9fb032c001 100644 --- a/tests/__data__/input/playlist_generate/ca.m3u +++ b/tests/__data__/input/playlist_generate/ca.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="5AABTV.ca",5AAB TV -http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 -#EXTINF:-1 tvg-id="MeteoMedia.ca",Meteomedia -http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="5AABTV.ca",5AAB TV +http://158.69.124.9:1935/5aabtv/5aabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeteoMedia.ca",Meteomedia +http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8 diff --git a/tests/__data__/input/playlist_generate/in.m3u b/tests/__data__/input/playlist_generate/in.m3u index 62594eb4bf..c375e17ace 100644 --- a/tests/__data__/input/playlist_generate/in.m3u +++ b/tests/__data__/input/playlist_generate/in.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",Daawah TV -http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",Daawah TV +http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8 diff --git a/tests/__data__/input/playlist_generate/kg.m3u b/tests/__data__/input/playlist_generate/kg.m3u index 9c1d5a5755..9bf0832b51 100644 --- a/tests/__data__/input/playlist_generate/kg.m3u +++ b/tests/__data__/input/playlist_generate/kg.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="ElTR.kg",ЭлТР (480p) [Not 24/7] -http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="ElTR.kg",ЭлТР (480p) [Not 24/7] +http://gohoski.fvds.ru:3000/mediabay/162/index.m3u8 diff --git a/tests/__data__/input/playlist_generate/uk.m3u b/tests/__data__/input/playlist_generate/uk.m3u index 5e8c7318e5..4a8a1f64ab 100644 --- a/tests/__data__/input/playlist_generate/uk.m3u +++ b/tests/__data__/input/playlist_generate/uk.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 diff --git a/tests/__data__/input/playlist_generate/unsorted.m3u b/tests/__data__/input/playlist_generate/unsorted.m3u index f282942743..4310ac744a 100644 --- a/tests/__data__/input/playlist_generate/unsorted.m3u +++ b/tests/__data__/input/playlist_generate/unsorted.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="LDPRTV.ru",ЛДПР ТВ (1080p) -http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 -#EXTINF:-1 tvg-id="VisitXTV.nl",Visit-X TV -https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 -#EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="DunaWorld.hu",Duna World (576i) -http://146.59.85.40:89/dunaworld/index.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="LDPRTV.ru",ЛДПР ТВ (1080p) +http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8 +#EXTINF:-1 tvg-id="VisitXTV.nl",Visit-X TV +https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8 +#EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Andorra TV (720p) [Not 24/7] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="DunaWorld.hu",Duna World (576i) +http://146.59.85.40:89/dunaworld/index.m3u8 diff --git a/tests/__data__/input/playlist_test/ag.m3u b/tests/__data__/input/playlist_test/ag.m3u index 66b32b21d7..f4716e013b 100644 --- a/tests/__data__/input/playlist_test/ag.m3u +++ b/tests/__data__/input/playlist_test/ag.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="ABSTV.ag",ABS TV -https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145 -#EXTINF:-1 tvg-id="ABSTV.ag@HD",ABS TV (1080p) [Not 24/7] +#EXTM3U +#EXTINF:-1 tvg-id="ABSTV.ag",ABS TV +https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145 +#EXTINF:-1 tvg-id="ABSTV.ag@HD",ABS TV (1080p) [Not 24/7] https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/absliveantigua3 \ No newline at end of file diff --git a/tests/__data__/input/playlist_update/br.m3u b/tests/__data__/input/playlist_update/br.m3u index 6dcdaee152..31a8698610 100644 --- a/tests/__data__/input/playlist_update/br.m3u +++ b/tests/__data__/input/playlist_update/br.m3u @@ -1,6 +1,6 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",VTV [Not 24/7] -https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 -#EXTINF:-1 tvg-id="",Tele2000 [Not 24/7] -#EXTVLCOPT:http-referrer=https://example2.com/ -https://servilive.com:3126/live/tele2000live.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",VTV [Not 24/7] +https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 +#EXTINF:-1 tvg-id="",Tele2000 [Not 24/7] +#EXTVLCOPT:http-referrer=https://example2.com/ +https://servilive.com:3126/live/tele2000live.m3u8 diff --git a/tests/__data__/input/playlist_update/cy.m3u b/tests/__data__/input/playlist_update/cy.m3u index 439794ad78..03c605e3eb 100644 --- a/tests/__data__/input/playlist_update/cy.m3u +++ b/tests/__data__/input/playlist_update/cy.m3u @@ -1,7 +1,7 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",RIK HD Cyprus -http://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8 -#EXTINF:-1 tvg-id="",RIK 2 -http://l6.cloudskep.com/rikcy/rik2/playlist.m3u8 -#EXTINF:-1 tvg-id="AdaTV.cy",AdaTV -https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",RIK HD Cyprus +http://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8 +#EXTINF:-1 tvg-id="",RIK 2 +http://l6.cloudskep.com/rikcy/rik2/playlist.m3u8 +#EXTINF:-1 tvg-id="AdaTV.cy",AdaTV +https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 diff --git a/tests/__data__/input/playlist_update/uk.m3u b/tests/__data__/input/playlist_update/uk.m3u index c1deeea978..033f5a36b5 100644 --- a/tests/__data__/input/playlist_update/uk.m3u +++ b/tests/__data__/input/playlist_update/uk.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 diff --git a/tests/__data__/input/playlist_validate/us_blocked.m3u b/tests/__data__/input/playlist_validate/us_blocked.m3u index 2ffa2273b6..3a5e4bd531 100644 --- a/tests/__data__/input/playlist_validate/us_blocked.m3u +++ b/tests/__data__/input/playlist_validate/us_blocked.m3u @@ -1,7 +1,7 @@ -#EXTM3U -#EXTINF:-1 tvg-id="FoxSports2.us@Asia",Fox Sports 2 Asia (Thai) (720p) -https://example.com/playlist.m3u8 -#EXTINF:-1 tvg-id="TVN.pl",TVN -https://example.com/playlist2.m3u8 -#EXTINF:-1 tvg-id="EverydayHeroes.us",Everyday Heroes (720p) -https://a.jsrdn.com/broadcast/7b1451fa52/+0000/c.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="FoxSports2.us@Asia",Fox Sports 2 Asia (Thai) (720p) +https://example.com/playlist.m3u8 +#EXTINF:-1 tvg-id="TVN.pl",TVN +https://example.com/playlist2.m3u8 +#EXTINF:-1 tvg-id="EverydayHeroes.us",Everyday Heroes (720p) +https://a.jsrdn.com/broadcast/7b1451fa52/+0000/c.m3u8 diff --git a/tests/__data__/input/playlist_validate/wrong_id.m3u b/tests/__data__/input/playlist_validate/wrong_id.m3u index 817fb94d1d..94d9cc2bc8 100644 --- a/tests/__data__/input/playlist_validate/wrong_id.m3u +++ b/tests/__data__/input/playlist_validate/wrong_id.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="qib22lAq1L.us",ABC (720p) -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -https://example.com/playlist2.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="qib22lAq1L.us",ABC (720p) +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +https://example.com/playlist2.m3u8 diff --git a/tests/__data__/input/report_create/br.m3u b/tests/__data__/input/report_create/br.m3u index 6dcdaee152..31a8698610 100644 --- a/tests/__data__/input/report_create/br.m3u +++ b/tests/__data__/input/report_create/br.m3u @@ -1,6 +1,6 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",VTV [Not 24/7] -https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 -#EXTINF:-1 tvg-id="",Tele2000 [Not 24/7] -#EXTVLCOPT:http-referrer=https://example2.com/ -https://servilive.com:3126/live/tele2000live.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",VTV [Not 24/7] +https://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8 +#EXTINF:-1 tvg-id="",Tele2000 [Not 24/7] +#EXTVLCOPT:http-referrer=https://example2.com/ +https://servilive.com:3126/live/tele2000live.m3u8 diff --git a/tests/__data__/input/report_create/cy.m3u b/tests/__data__/input/report_create/cy.m3u index 581d0961b6..82d0b78d44 100644 --- a/tests/__data__/input/report_create/cy.m3u +++ b/tests/__data__/input/report_create/cy.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",RIK HD Cyprus -http://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8 -#EXTINF:-1 tvg-id="",RIK 2 -http://l6.cloudskep.com/rikcy/rik2/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="",RIK HD Cyprus +http://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8 +#EXTINF:-1 tvg-id="",RIK 2 +http://l6.cloudskep.com/rikcy/rik2/playlist.m3u8 diff --git a/tests/__data__/input/report_create/uk.m3u b/tests/__data__/input/report_create/uk.m3u index c1deeea978..033f5a36b5 100644 --- a/tests/__data__/input/report_create/uk.m3u +++ b/tests/__data__/input/report_create/uk.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 diff --git a/tests/__data__/input/report_create/us.m3u b/tests/__data__/input/report_create/us.m3u index 491b56b03c..6a617277d9 100644 --- a/tests/__data__/input/report_create/us.m3u +++ b/tests/__data__/input/report_create/us.m3u @@ -1,5 +1,5 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",TUTV -https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8 -#EXTINF:-1 tvg-id="IONTV.us@East",ION TV +#EXTM3U +#EXTINF:-1 tvg-id="",TUTV +https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8 +#EXTINF:-1 tvg-id="IONTV.us@East",ION TV http://fl3.moveonjoy.com/ION_TV/index.m3u8 \ No newline at end of file diff --git a/tests/commands/playlist/update.test.ts b/tests/commands/playlist/update.test.ts index db4258442d..d8552e3d25 100644 --- a/tests/commands/playlist/update.test.ts +++ b/tests/commands/playlist/update.test.ts @@ -1,40 +1,49 @@ -import { pathToFileURL } from 'node:url' -import { execSync } from 'child_process' -import * as fs from 'fs-extra' -import { glob } from 'glob' - -const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') - fs.copySync('tests/__data__/input/playlist_update', 'tests/__data__/output/streams') -}) - -describe('playlist:update', () => { - it('can update playlists', () => { - const cmd = `${ENV_VAR} npm run playlist:update --silent` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - const files = glob.sync('tests/__data__/expected/playlist_update/*.m3u').map(filepath => { - const fileUrl = pathToFileURL(filepath).toString() - const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_update/').toString() - - return fileUrl.replace(pathToRemove, '') - }) - - files.forEach(filepath => { - expect(content(`tests/__data__/output/streams/${filepath}`)).toBe( - content(`tests/__data__/expected/playlist_update/${filepath}`) - ) - }) - - expect(stdout).toBe( - 'OUTPUT=closes #14151, closes #14150, closes #14110, closes #14120, closes #14175, closes #14105, closes #14104, closes #14057, closes #14034, closes #13964, closes #13893, closes #13881, closes #13793, closes #13751, closes #13715\n' - ) - }) -}) - -function content(filepath: string) { - return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) -} +import { pathToFileURL } from 'node:url' +import { execSync } from 'child_process' +import * as fs from 'fs-extra' +import { glob } from 'glob' + +const ENV_VAR = + 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') + fs.copySync('tests/__data__/input/playlist_update', 'tests/__data__/output/streams') +}) + +describe('playlist:update', () => { + it('can update playlists', done => { + let cmd = `${ENV_VAR} npm run playlist:update` + if (!process.env.DEBUG) cmd += ' --silent' + try { + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + const files = glob.sync('tests/__data__/expected/playlist_update/*.m3u').map(filepath => { + const fileUrl = pathToFileURL(filepath).toString() + const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_update/').toString() + + return fileUrl.replace(pathToRemove, '') + }) + + files.forEach(filepath => { + expect(content(`tests/__data__/output/streams/${filepath}`)).toBe( + content(`tests/__data__/expected/playlist_update/${filepath}`) + ) + }) + + expect(stdout).toBe( + 'OUTPUT=closes #14151, closes #14150, closes #14110, closes #14120, closes #14175, closes #14105, closes #14104, closes #14057, closes #14034, closes #13964, closes #13893, closes #13881, closes #13793, closes #13751, closes #13715\n' + ) + + done() + } catch (err) { + if (process.env.DEBUG === 'true') console.log(cmd, err.stdout) + done(err) + } + }) +}) + +function content(filepath: string) { + return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) +} From b65f39e8ca69338c9523e388c72d9435c1052b21 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 20:40:42 +0300 Subject: [PATCH 31/51] Update tests/__data__ --- .../expected/api_generate/.api/streams.json | 130 +++++++++--------- .../__data__/expected/playlist_format/nl.m3u | 30 ++-- .../.gh-pages/languages/cat.m3u | 3 + .../playlist_generate/.gh-pages/raw/ad.m3u | 18 +-- .../__data__/expected/playlist_update/fr.m3u | 6 +- .../__data__/expected/playlist_update/uk.m3u | 26 ++-- .../__data__/expected/playlist_update/us.m3u | 22 +-- tests/__data__/input/data/channels.json | 91 ------------ tests/__data__/input/data/feeds.json | 16 +++ 9 files changed, 135 insertions(+), 207 deletions(-) create mode 100644 tests/__data__/expected/playlist_generate/.gh-pages/languages/cat.m3u diff --git a/tests/__data__/expected/api_generate/.api/streams.json b/tests/__data__/expected/api_generate/.api/streams.json index 4028ae31c1..ae19fcb60c 100644 --- a/tests/__data__/expected/api_generate/.api/streams.json +++ b/tests/__data__/expected/api_generate/.api/streams.json @@ -1,66 +1,66 @@ -[ - { - "channel": null, - "feed": null, - "title": "Daawah TV", - "url": "http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8", - "referrer": null, - "user_agent": null - }, - { - "channel": null, - "feed": null, - "title": "Andorra TV", - "url": "http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8", - "referrer": "http://imn.iq", - "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" - }, - { - "channel": "AndorraTV.ad", - "feed": "SD", - "title": "ATV", - "url": "https://iptv-all.lanesh4d0w.repl.co/andorra/atv|Referer=\"https://referer.xyz/\"|User-Agent=\"Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\"|Origin=\"https://origin.xyz\"", - "referrer": null, - "user_agent": null - }, - { - "channel": "BBCNews.uk", - "feed": null, - "title": "BBC News HD", - "url": "http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8", - "referrer": null, - "user_agent": null - }, - { - "channel": "LDPRTV.ru", - "feed": null, - "title": "ЛДПР ТВ", - "url": "http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8", - "referrer": null, - "user_agent": null - }, - { - "channel": "MeteoMedia.ca", - "feed": null, - "title": "Meteomedia", - "url": "http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8", - "referrer": null, - "user_agent": null - }, - { - "channel": "VisitXTV.nl", - "feed": null, - "title": "Visit-X TV", - "url": "https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8", - "referrer": null, - "user_agent": null - }, - { - "channel": "Zoo.ad", - "feed": null, - "title": "Zoo", - "url": "https://iptv-all.lanesh4d0w.repl.co/andorra/zoo", - "referrer": null, - "user_agent": null - } +[ + { + "channel": null, + "feed": null, + "title": "Daawah TV", + "url": "http://51.15.246.58:8081/daawahtv/daawahtv2/playlist.m3u8", + "referrer": null, + "user_agent": null + }, + { + "channel": null, + "feed": null, + "title": "Andorra TV", + "url": "http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index2.m3u8", + "referrer": "http://imn.iq", + "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" + }, + { + "channel": "AndorraTV.ad", + "feed": "SD", + "title": "ATV", + "url": "https://iptv-all.lanesh4d0w.repl.co/andorra/atv|Referer=\"https://referer.xyz/\"|User-Agent=\"Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\"|Origin=\"https://origin.xyz\"", + "referrer": null, + "user_agent": null + }, + { + "channel": "BBCNews.uk", + "feed": "SD", + "title": "BBC News HD", + "url": "http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8", + "referrer": null, + "user_agent": null + }, + { + "channel": "LDPRTV.ru", + "feed": "SD", + "title": "ЛДПР ТВ", + "url": "http://46.46.143.222:1935/live/mp4:ldpr.stream/blocked.m3u8", + "referrer": null, + "user_agent": null + }, + { + "channel": "MeteoMedia.ca", + "feed": "SD", + "title": "Meteomedia", + "url": "http://encodercdn1.frontline.ca/encoder181/output/Meteo_Media_720p/playlist.m3u8", + "referrer": null, + "user_agent": null + }, + { + "channel": "VisitXTV.nl", + "feed": "SD", + "title": "Visit-X TV", + "url": "https://stream.visit-x.tv/vxtv/ngrp:live_all/30fps.m3u8", + "referrer": null, + "user_agent": null + }, + { + "channel": "Zoo.ad", + "feed": "SD", + "title": "Zoo", + "url": "https://iptv-all.lanesh4d0w.repl.co/andorra/zoo", + "referrer": null, + "user_agent": null + } ] \ No newline at end of file diff --git a/tests/__data__/expected/playlist_format/nl.m3u b/tests/__data__/expected/playlist_format/nl.m3u index feaa913a84..bf18bfa6f1 100644 --- a/tests/__data__/expected/playlist_format/nl.m3u +++ b/tests/__data__/expected/playlist_format/nl.m3u @@ -1,15 +1,15 @@ -#EXTM3U -#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked] -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo1/npo1.isml/.m3u8 -#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 (342p) -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 -#EXTINF:-1 tvg-id="NPO2.nl" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",NPO 2 (302p) [Geo-blocked] -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -http://stream.tvtap.net:8081/live/nl-npo2.stream/playlist.m3u8?|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0+(iPhone;+CPU+iPhone+OS+17_7+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/18.0+Mobile/15E148+Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="NPO2.nl",NPO 2 [Geo-blocked] -http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="NPO1.nl@SD",NPO 1 (342p) [Geo-blocked] +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo1/npo1.isml/.m3u8 +#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 (342p) +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo2.isml/.m3u8 +#EXTINF:-1 tvg-id="NPO2.nl@SD" http-referrer="http://imn.iq" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",NPO 2 (302p) [Geo-blocked] +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +http://stream.tvtap.net:8081/live/nl-npo2.stream/playlist.m3u8?|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0+(iPhone;+CPU+iPhone+OS+17_7+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/18.0+Mobile/15E148+Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="NPO2.nl@SD",NPO 2 [Geo-blocked] +http://resolver.streaming.api.nos.nl/livestream?url=/live/npo/tvlive/npo2/npo22.isml/.m3u8 diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/languages/cat.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/languages/cat.m3u new file mode 100644 index 0000000000..e85626ca16 --- /dev/null +++ b/tests/__data__/expected/playlist_generate/.gh-pages/languages/cat.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv diff --git a/tests/__data__/expected/playlist_generate/.gh-pages/raw/ad.m3u b/tests/__data__/expected/playlist_generate/.gh-pages/raw/ad.m3u index 7e0f1c587c..07c75c55ac 100644 --- a/tests/__data__/expected/playlist_generate/.gh-pages/raw/ad.m3u +++ b/tests/__data__/expected/playlist_generate/.gh-pages/raw/ad.m3u @@ -1,9 +1,9 @@ -#EXTM3U -#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) -https://iptv-all.lanesh4d0w.repl.co/andorra/zoo -#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv -#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD -https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd -#EXTINF:-1 tvg-id="AndorraTV.ad" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV -https://iptv-all.lanesh4d0w.repl.co/andorra/atv2 +#EXTM3U +#EXTINF:-1 tvg-id="Zoo.ad@HD" tvg-logo="https://i.imgur.com/ciTJrnl.png" group-title="Undefined",Zoo (720p) +https://iptv-all.lanesh4d0w.repl.co/andorra/zoo +#EXTINF:-1 tvg-id="AndorraTV.ad@SD" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv +#EXTINF:-1 tvg-id="AndorraTV.ad@HD" tvg-logo="https://i.imgur.com/CnhTn8i.png" group-title="Undefined",ATV HD +https://iptv-all.lanesh4d0w.repl.co/andorra/atv_hd +#EXTINF:-1 tvg-id="AndorraTV.ad" tvg-logo="https://i.imgur.com/BnhTn8i.png" group-title="Undefined",ATV +https://iptv-all.lanesh4d0w.repl.co/andorra/atv2 diff --git a/tests/__data__/expected/playlist_update/fr.m3u b/tests/__data__/expected/playlist_update/fr.m3u index b460293dd4..fe6e40fbce 100644 --- a/tests/__data__/expected/playlist_update/fr.m3u +++ b/tests/__data__/expected/playlist_update/fr.m3u @@ -1,3 +1,3 @@ -#EXTM3U -#EXTINF:-1 tvg-id="TFX.fr" http-referrer="https://pkpakiplay.xyz/" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1",TFX -https://stitcher-ipv4.pluto.tv/v1/stitch/embed/hls/channel/64c109a4798def0008a6e03e/master.m3u8?advertisingId={PSID}&appVersion=unknown&deviceDNT={TARGETOPT}&deviceId={PSID}&deviceLat=0&deviceLon=0&deviceMake=samsung&deviceModel=samsung&deviceType=samsung-tvplus&deviceVersion=unknown&embedPartner=samsung-tvplus&profileFloor=&profileLimit=&samsung_app_domain={APP_DOMAIN}&samsung_app_name={APP_NAME}&us_privacy=1YNY +#EXTM3U +#EXTINF:-1 tvg-id="TFX.fr@SD" http-referrer="https://pkpakiplay.xyz/" http-user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1",TFX +https://stitcher-ipv4.pluto.tv/v1/stitch/embed/hls/channel/64c109a4798def0008a6e03e/master.m3u8?advertisingId={PSID}&appVersion=unknown&deviceDNT={TARGETOPT}&deviceId={PSID}&deviceLat=0&deviceLon=0&deviceMake=samsung&deviceModel=samsung&deviceType=samsung-tvplus&deviceVersion=unknown&embedPartner=samsung-tvplus&profileFloor=&profileLimit=&samsung_app_domain={APP_DOMAIN}&samsung_app_name={APP_NAME}&us_privacy=1YNY diff --git a/tests/__data__/expected/playlist_update/uk.m3u b/tests/__data__/expected/playlist_update/uk.m3u index deeb47af44..ab04109e58 100644 --- a/tests/__data__/expected/playlist_update/uk.m3u +++ b/tests/__data__/expected/playlist_update/uk.m3u @@ -1,13 +1,13 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 -#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] -http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 -#EXTINF:-1 tvg-id="BeanoTV.uk",Beano TV -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -https://a5b4bacecd47433dad06d3189fc7422e.mediatailor.us-east-1.amazonaws.com/v1/manifest/04fd913bb278d8775298c26fdca9d9841f37601f/RakutenTV-eu_BeanoTV/b1f233d5-847c-437d-aa4f-f73e67a85323/2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTM3U +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Not 24/7] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/index.m3u8 +#EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (480p) [Geo-blocked] +http://1111296894.rsc.cdn77.org/LS-ATL-54548-6/playlist.m3u8 +#EXTINF:-1 tvg-id="BeanoTV.uk@SD",Beano TV +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +https://a5b4bacecd47433dad06d3189fc7422e.mediatailor.us-east-1.amazonaws.com/v1/manifest/04fd913bb278d8775298c26fdca9d9841f37601f/RakutenTV-eu_BeanoTV/b1f233d5-847c-437d-aa4f-f73e67a85323/2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" diff --git a/tests/__data__/expected/playlist_update/us.m3u b/tests/__data__/expected/playlist_update/us.m3u index 9ec9bde318..8f57ccc7bf 100644 --- a/tests/__data__/expected/playlist_update/us.m3u +++ b/tests/__data__/expected/playlist_update/us.m3u @@ -1,11 +1,11 @@ -#EXTM3U -#EXTINF:-1 tvg-id="BBCAmerica.us@East" http-user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246",BBC America East (720p) -#EXTVLCOPT:http-referrer=http://imn.iq -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.manifest_type=mpd -#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha -#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| -https://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" -#EXTINF:-1 tvg-id="FastTV.us",Fast TV -https://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8 +#EXTM3U +#EXTINF:-1 tvg-id="BBCAmerica.us@East" http-user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246",BBC America East (720p) +#EXTVLCOPT:http-referrer=http://imn.iq +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.manifest_type=mpd +#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha +#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}| +https://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz" +#EXTINF:-1 tvg-id="FastTV.us@SD",Fast TV +https://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8 diff --git a/tests/__data__/input/data/channels.json b/tests/__data__/input/data/channels.json index 3f57ffe05c..1a80abb8d1 100644 --- a/tests/__data__/input/data/channels.json +++ b/tests/__data__/input/data/channels.json @@ -4,8 +4,6 @@ "name": "Andorra TV", "network": null, "country": "AD", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -14,8 +12,6 @@ "name": "BBC News", "network": null, "country": "UK", - "subdivision": null, - "city": null, "categories": [ "news", "general" @@ -27,8 +23,6 @@ "name": "Eve", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -37,8 +31,6 @@ "name": "Everyday Heroes", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -47,8 +39,6 @@ "name": "Fox Sports 1", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -57,8 +47,6 @@ "name": "Fox Sports 2", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -67,8 +55,6 @@ "name": "LDPR TV", "network": null, "country": "RU", - "subdivision": null, - "city": null, "categories": [ "general" ], @@ -79,8 +65,6 @@ "name": "Libyas Channel", "network": null, "country": "LY", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -89,8 +73,6 @@ "name": "MétéoMédia", "network": null, "country": "CA", - "subdivision": null, - "city": null, "categories": [ "weather" ], @@ -101,8 +83,6 @@ "name": "TVN", "network": null, "country": "PL", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -111,8 +91,6 @@ "name": "Visit-X TV", "network": null, "country": "NL", - "subdivision": null, - "city": null, "categories": [ "xxx" ], @@ -123,8 +101,6 @@ "name": "TUTV", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [ "general" ], @@ -139,8 +115,6 @@ "Malayala Manorama Group" ], "country": "IN", - "subdivision": null, - "city": null, "categories": [ "news" ], @@ -157,8 +131,6 @@ "network": null, "owners": [], "country": "MY", - "subdivision": null, - "city": null, "categories": [ "news" ], @@ -175,8 +147,6 @@ "network": null, "owners": [], "country": "US", - "subdivision": null, - "city": null, "categories": [ "news" ], @@ -195,8 +165,6 @@ "Grupo ATV" ], "country": "PE", - "subdivision": "PE-LIM", - "city": "Lima", "categories": [ "news" ], @@ -213,8 +181,6 @@ "network": null, "owners": [], "country": "UK", - "subdivision": null, - "city": "London", "categories": [ "series" ], @@ -235,8 +201,6 @@ "AT-X Inc" ], "country": "JP", - "subdivision": null, - "city": "Tokyo", "categories": [ "animation" ], @@ -255,8 +219,6 @@ "Living Media" ], "country": "IN", - "subdivision": null, - "city": "Noida", "categories": [ "news" ], @@ -273,8 +235,6 @@ "network": null, "owners": [], "country": "JP", - "subdivision": null, - "city": null, "categories": [ "weather" ], @@ -293,8 +253,6 @@ "Meth Lanka Private Limited" ], "country": "LK", - "subdivision": null, - "city": "Athurugiriya", "categories": [ "religious" ], @@ -311,8 +269,6 @@ "network": null, "owners": [], "country": "HU", - "subdivision": null, - "city": null, "categories": [ "sports" ], @@ -334,8 +290,6 @@ "MotorTrend" ], "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false, "launched": "2022-10-26", @@ -354,8 +308,6 @@ "Ministry of Finance" ], "country": "TH", - "subdivision": null, - "city": "Bangkok", "categories": [ "general" ], @@ -376,8 +328,6 @@ "Amarin Television" ], "country": "TH", - "subdivision": null, - "city": "Bangkok", "categories": [ "entertainment" ], @@ -396,8 +346,6 @@ "France Télévisions" ], "country": "FR", - "subdivision": null, - "city": "Paris", "categories": [ "general" ], @@ -416,8 +364,6 @@ "France Télévisions" ], "country": "FR", - "subdivision": null, - "city": "Paris", "categories": [ "general" ], @@ -436,8 +382,6 @@ "France Télévisions" ], "country": "FR", - "subdivision": null, - "city": "Paris", "categories": [ "general" ], @@ -456,8 +400,6 @@ "France Télévisions" ], "country": "FR", - "subdivision": null, - "city": "Paris", "categories": [ "general" ], @@ -476,8 +418,6 @@ "network": null, "owners": [], "country": "FR", - "subdivision": null, - "city": null, "categories": [ "entertainment" ], @@ -498,8 +438,6 @@ "TF1 Group" ], "country": "FR", - "subdivision": null, - "city": null, "categories": [ "movies" ], @@ -518,8 +456,6 @@ "Groupe TF1" ], "country": "FR", - "subdivision": null, - "city": null, "categories": [ "general" ], @@ -536,8 +472,6 @@ "network": null, "owners": [], "country": "FR", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false, "launched": null, @@ -554,8 +488,6 @@ "Malayala Manorama Group" ], "country": "IN", - "subdivision": null, - "city": "Kottayam", "categories": [ "news" ], @@ -574,8 +506,6 @@ "NBCUniversal" ], "country": "AU", - "subdivision": null, - "city": "New York City", "categories": [ "entertainment" ], @@ -590,8 +520,6 @@ "name": "Zoo", "network": null, "country": "CA", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -600,8 +528,6 @@ "name": "Duna World", "network": null, "country": "HU", - "subdivision": null, - "city": null, "categories": [ "General" ], @@ -622,15 +548,6 @@ "ElTR" ], "country": "KG", - "subdivision": null, - "city": "Bishkek", - "broadcast_area": [ - "r/CAS" - ], - "languages": [ - "kir", - "rus" - ], "categories": [ "general" ], @@ -645,8 +562,6 @@ "name": "ION TV", "network": null, "country": "US", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -655,8 +570,6 @@ "name": "NPO 1", "network": null, "country": "NL", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -665,8 +578,6 @@ "name": "NPO 2", "network": null, "country": "NL", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false }, @@ -675,8 +586,6 @@ "name": "5AAB TV", "network": null, "country": "CA", - "subdivision": null, - "city": null, "categories": [], "is_nsfw": false } diff --git a/tests/__data__/input/data/feeds.json b/tests/__data__/input/data/feeds.json index 1e28c47404..55dc9d1a7d 100644 --- a/tests/__data__/input/data/feeds.json +++ b/tests/__data__/input/data/feeds.json @@ -841,5 +841,21 @@ ], "languages": [], "video_format": "576i" + }, + { + "channel": "NPO2.nl", + "id": "SD", + "name": "SD", + "is_main": true, + "broadcast_area": [ + "c/CY" + ], + "languages": [ + "tur" + ], + "timezones": [ + "America/Port_of_Spain" + ], + "video_format": "576i" } ] \ No newline at end of file From 25fa704e14698a86e59b26dc807c90502e475b57 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:24:48 +0300 Subject: [PATCH 32/51] Update create.test.ts --- tests/commands/report/create.test.ts | 59 ++++++++++++++-------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/tests/commands/report/create.test.ts b/tests/commands/report/create.test.ts index 344a33aea9..391a6b8015 100644 --- a/tests/commands/report/create.test.ts +++ b/tests/commands/report/create.test.ts @@ -1,29 +1,30 @@ -import { execSync } from 'child_process' - -const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/report_create' - -describe('report:create', () => { - it('can create report', () => { - const cmd = `${ENV_VAR} npm run report:create` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - expect( - stdout.includes(` -┌─────────┬─────────────┬──────────────────┬─────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────┐ -│ (index) │ issueNumber │ type │ streamId │ streamUrl │ status │ -├─────────┼─────────────┼──────────────────┼─────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────┤ -│ 0 │ 14120 │ 'streams:edit' │ 'boo.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'invalid_id' │ -│ 1 │ 14135 │ 'streams:add' │ 'BBCWorldNews.uk@SouthAsia' │ 'http://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8' │ 'wrong_id' │ -│ 2 │ 14177 │ 'streams:add' │ 'TUTV.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'on_playlist' │ -│ 3 │ 14178 │ 'streams:add' │ 'TV3.my' │ 'https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m3u8...' │ 'blocked' │ -│ 4 │ 14179 │ 'streams:add' │ 'ManoramaNews.in' │ '(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Videos...' │ 'invalid_link' │ -│ 5 │ 16120 │ 'streams:remove' │ undefined │ 'http://190.61.102.67:2000/play/a038/index.m3u8' │ 'wrong_link' │ -│ 6 │ 19956 │ 'channel search' │ 'CNBCe.tr' │ undefined │ 'invalid_id' │ -│ 7 │ 19957 │ 'channel search' │ '13thStreet.au' │ undefined │ 'closed' │ -│ 8 │ 20956 │ 'channel search' │ 'IONTV.us' │ undefined │ 'fulfilled' │ -│ 9 │ 25157 │ 'streams:add' │ 'OnTimeSports.eg@SD' │ 'OnTime Sports SD.mu38' │ 'invalid_link' │ -└─────────┴─────────────┴──────────────────┴─────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────┘`) - ).toBe(true) - }) -}) +import { execSync } from 'child_process' + +const ENV_VAR = + 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/report_create' + +describe('report:create', () => { + it('can create report', () => { + const cmd = `${ENV_VAR} npm run report:create` + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + expect( + stdout.includes(` +┌─────────┬─────────────┬──────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────┐ +│ (index) │ issueNumber │ type │ streamId │ streamUrl │ status │ +├─────────┼─────────────┼──────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────┤ +│ 0 │ 14120 │ 'streams:edit' │ 'boo.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'invalid_id' │ +│ 1 │ 14135 │ 'streams:add' │ 'BBCWorldNews.uk@SouthAsia' │ 'http://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8' │ 'wrong_id' │ +│ 2 │ 14177 │ 'streams:add' │ 'TUTV.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'on_playlist' │ +│ 3 │ 14178 │ 'streams:add' │ 'TV3.my' │ 'https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m...' │ 'blocked' │ +│ 4 │ 14179 │ 'streams:add' │ 'ManoramaNews.in' │ '(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Vid...' │ 'invalid_link' │ +│ 5 │ 16120 │ 'streams:remove' │ undefined │ 'http://190.61.102.67:2000/play/a038/index.m3u8' │ 'wrong_link' │ +│ 6 │ 19956 │ 'channel search' │ 'CNBCe.tr' │ undefined │ 'invalid_id' │ +│ 7 │ 19957 │ 'channel search' │ '13thStreet.au' │ undefined │ 'closed' │ +│ 8 │ 20956 │ 'channel search' │ 'IONTV.us' │ undefined │ 'fulfilled' │ +│ 9 │ 25157 │ 'streams:add' │ 'OnTimeSports.eg@SD' │ 'OnTime Sports SD.mu38' │ 'invalid_link' │ +└─────────┴─────────────┴──────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────┘`) + ).toBe(true) + }) +}) From ad2c83e33376b5ee8a15c5a1b0cf43046158c831 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:25:22 +0300 Subject: [PATCH 33/51] Update scripts --- scripts/api.ts | 151 +++ scripts/commands/api/generate.ts | 70 +- scripts/commands/api/load.ts | 33 +- scripts/commands/playlist/edit.ts | 407 ++++---- scripts/commands/playlist/format.ts | 162 ++-- scripts/commands/playlist/generate.ts | 246 +++-- scripts/commands/playlist/test.ts | 359 ++++--- scripts/commands/playlist/update.ts | 368 ++++---- scripts/commands/playlist/validate.ts | 249 +++-- scripts/commands/readme/update.ts | 78 +- scripts/commands/report/create.ts | 337 ++++--- scripts/core/apiClient.ts | 16 - scripts/core/cliTable.ts | 44 +- scripts/core/dataLoader.ts | 113 --- scripts/core/dataProcessor.ts | 165 ---- scripts/core/htmlTable.ts | 96 +- scripts/core/index.ts | 25 +- scripts/core/issueData.ts | 70 +- scripts/core/issueLoader.ts | 74 +- scripts/core/issueParser.ts | 96 +- scripts/core/markdown.ts | 90 +- scripts/core/playlistParser.ts | 103 +- scripts/core/streamTester.ts | 242 ++--- scripts/generators/categoriesGenerator.ts | 114 +-- scripts/generators/citiesGenerator.ts | 97 +- scripts/generators/countriesGenerator.ts | 148 +-- scripts/generators/index.ts | 25 +- scripts/generators/indexCategoryGenerator.ts | 111 +-- scripts/generators/indexCountryGenerator.ts | 130 +-- scripts/generators/indexGenerator.ts | 85 +- scripts/generators/indexLanguageGenerator.ts | 111 +-- scripts/generators/indexNsfwGenerator.ts | 32 - scripts/generators/languagesGenerator.ts | 115 +-- scripts/generators/rawGenerator.ts | 85 +- scripts/generators/regionsGenerator.ts | 95 +- scripts/generators/sourcesGenerator.ts | 92 +- scripts/generators/subdivisionsGenerator.ts | 99 +- scripts/models/blocklistRecord.ts | 15 - scripts/models/broadcastArea.ts | 108 --- scripts/models/category.ts | 18 - scripts/models/channel.ts | 233 ----- scripts/models/city.ts | 78 -- scripts/models/country.ts | 95 -- scripts/models/feed.ts | 170 ---- scripts/models/guide.ts | 54 -- scripts/models/index.ts | 19 +- scripts/models/language.ts | 27 - scripts/models/logo.ts | 40 - scripts/models/playlist.ts | 56 +- scripts/models/region.ts | 118 --- scripts/models/stream.ts | 935 +++++++++---------- scripts/models/subdivision.ts | 83 -- scripts/models/timezone.ts | 30 - scripts/tables/categoriesTable.ts | 119 +-- scripts/tables/countriesTable.ts | 365 ++++---- scripts/tables/languagesTable.ts | 119 +-- scripts/tables/regionsTable.ts | 101 +- scripts/tables/table.ts | 6 +- scripts/types/blocklistRecord.d.ts | 5 - scripts/types/category.d.ts | 9 - scripts/types/channel.d.ts | 50 - scripts/types/city.d.ts | 20 - scripts/types/country.d.ts | 20 - scripts/types/dataLoader.d.ts | 21 - scripts/types/dataProcessor.d.ts | 31 - scripts/types/feed.d.ts | 10 - scripts/types/guide.d.ts | 17 - scripts/types/language.d.ts | 9 - scripts/types/logo.d.ts | 9 - scripts/types/region.d.ts | 18 - scripts/types/stream.d.ts | 11 - scripts/types/subdivision.d.ts | 16 - scripts/utils.ts | 31 +- 73 files changed, 3215 insertions(+), 4784 deletions(-) create mode 100644 scripts/api.ts delete mode 100644 scripts/core/apiClient.ts delete mode 100644 scripts/core/dataLoader.ts delete mode 100644 scripts/core/dataProcessor.ts delete mode 100644 scripts/generators/indexNsfwGenerator.ts delete mode 100644 scripts/models/blocklistRecord.ts delete mode 100644 scripts/models/broadcastArea.ts delete mode 100644 scripts/models/category.ts delete mode 100644 scripts/models/channel.ts delete mode 100644 scripts/models/city.ts delete mode 100644 scripts/models/country.ts delete mode 100644 scripts/models/feed.ts delete mode 100644 scripts/models/guide.ts delete mode 100644 scripts/models/language.ts delete mode 100644 scripts/models/logo.ts delete mode 100644 scripts/models/region.ts delete mode 100644 scripts/models/subdivision.ts delete mode 100644 scripts/models/timezone.ts delete mode 100644 scripts/types/blocklistRecord.d.ts delete mode 100644 scripts/types/category.d.ts delete mode 100644 scripts/types/channel.d.ts delete mode 100644 scripts/types/city.d.ts delete mode 100644 scripts/types/country.d.ts delete mode 100644 scripts/types/dataLoader.d.ts delete mode 100644 scripts/types/dataProcessor.d.ts delete mode 100644 scripts/types/feed.d.ts delete mode 100644 scripts/types/guide.d.ts delete mode 100644 scripts/types/language.d.ts delete mode 100644 scripts/types/logo.d.ts delete mode 100644 scripts/types/region.d.ts delete mode 100644 scripts/types/stream.d.ts delete mode 100644 scripts/types/subdivision.d.ts diff --git a/scripts/api.ts b/scripts/api.ts new file mode 100644 index 0000000000..a4649d427f --- /dev/null +++ b/scripts/api.ts @@ -0,0 +1,151 @@ +import { Collection, Dictionary } from '@freearhey/core' +import { DATA_DIR } from './constants' +import cliProgress from 'cli-progress' +import * as sdk from '@iptv-org/sdk' + +const data = { + categoriesKeyById: new Dictionary(), + countriesKeyByCode: new Dictionary(), + subdivisionsKeyByCode: new Dictionary(), + citiesKeyByCode: new Dictionary(), + regionsKeyByCode: new Dictionary(), + languagesKeyByCode: new Dictionary(), + channelsKeyById: new Dictionary(), + feedsKeyByStreamId: new Dictionary(), + feedsGroupedByChannel: new Dictionary(), + blocklistRecordsGroupedByChannel: new Dictionary(), + categories: new Collection(), + countries: new Collection(), + subdivisions: new Collection(), + cities: new Collection(), + regions: new Collection() +} + +let searchIndex + +async function loadData() { + const dataManager = new sdk.DataManager({ dataDir: DATA_DIR }) + await dataManager.loadFromDisk() + dataManager.processData() + + const { + channels, + feeds, + categories, + languages, + countries, + subdivisions, + cities, + regions, + blocklist + } = dataManager.getProcessedData() + + searchIndex = sdk.SearchEngine.createIndex(channels) + + data.categoriesKeyById = categories.keyBy((category: sdk.Models.Category) => category.id) + data.countriesKeyByCode = countries.keyBy((country: sdk.Models.Country) => country.code) + data.subdivisionsKeyByCode = subdivisions.keyBy( + (subdivision: sdk.Models.Subdivision) => subdivision.code + ) + data.citiesKeyByCode = cities.keyBy((city: sdk.Models.City) => city.code) + data.regionsKeyByCode = regions.keyBy((region: sdk.Models.Region) => region.code) + data.languagesKeyByCode = languages.keyBy((language: sdk.Models.Language) => language.code) + data.channelsKeyById = channels.keyBy((channel: sdk.Models.Channel) => channel.id) + data.feedsKeyByStreamId = feeds.keyBy((feed: sdk.Models.Feed) => feed.getStreamId()) + data.feedsGroupedByChannel = feeds.groupBy((feed: sdk.Models.Feed) => feed.channel) + data.blocklistRecordsGroupedByChannel = blocklist.groupBy( + (blocklistRecord: sdk.Models.BlocklistRecord) => blocklistRecord.channel + ) + data.categories = categories + data.countries = countries + data.subdivisions = subdivisions + data.cities = cities + data.regions = regions +} + +async function downloadData() { + function formatBytes(bytes: number) { + if (bytes === 0) return '0 B' + const k = 1024 + const sizes = ['B', 'KB', 'MB', 'GB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i] + } + + const files = [ + 'blocklist', + 'categories', + 'channels', + 'cities', + 'countries', + 'feeds', + 'guides', + 'languages', + 'logos', + 'regions', + 'streams', + 'subdivisions', + 'timezones' + ] + + const multiBar = new cliProgress.MultiBar({ + stopOnComplete: true, + hideCursor: true, + forceRedraw: true, + barsize: 36, + format(options, params, payload) { + const filename = payload.filename.padEnd(18, ' ') + const barsize = options.barsize || 40 + const percent = (params.progress * 100).toFixed(2) + const speed = payload.speed ? formatBytes(payload.speed) + '/s' : 'N/A' + const total = formatBytes(params.total) + const completeSize = Math.round(params.progress * barsize) + const incompleteSize = barsize - completeSize + const bar = + options.barCompleteString && options.barIncompleteString + ? options.barCompleteString.substr(0, completeSize) + + options.barGlue + + options.barIncompleteString.substr(0, incompleteSize) + : '-'.repeat(barsize) + + return `${filename} [${bar}] ${percent}% | ETA: ${params.eta}s | ${total} | ${speed}` + } + }) + + const dataManager = new sdk.DataManager({ dataDir: DATA_DIR }) + + const requests: Promise[] = [] + for (const basename of files) { + const filename = `${basename}.json` + const progressBar = multiBar.create(0, 0, { filename }) + const request = dataManager.downloadFileToDisk(basename, { + onDownloadProgress({ total, loaded, rate }) { + if (total) progressBar.setTotal(total) + progressBar.update(loaded, { speed: rate }) + } + }) + + requests.push(request) + } + + await Promise.allSettled(requests).catch(console.error) +} + +function searchChannels(query: string): Collection { + if (!searchIndex) return new Collection() + + const results = searchIndex.search(query) + + const channels = new Collection() + + new Collection(results).forEach( + (item: sdk.Types.ChannelSearchableData) => { + const channel = data.channelsKeyById.get(item.id) + if (channel) channels.add(channel) + } + ) + + return channels +} + +export { data, loadData, downloadData, searchChannels } diff --git a/scripts/commands/api/generate.ts b/scripts/commands/api/generate.ts index 14967e87f5..71c00a6f2e 100644 --- a/scripts/commands/api/generate.ts +++ b/scripts/commands/api/generate.ts @@ -1,39 +1,31 @@ -import { DataLoader, DataProcessor, PlaylistParser } from '../../core' -import type { DataProcessorData } from '../../types/dataProcessor' -import { API_DIR, STREAMS_DIR, DATA_DIR } from '../../constants' -import type { DataLoaderData } from '../../types/dataLoader' -import { Logger, Storage } from '@freearhey/core' -import { Stream } from '../../models' - -async function main() { - const logger = new Logger() - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const dataLoader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await dataLoader.load() - const { channelsKeyById, feedsGroupedByChannelId, logosGroupedByStreamId }: DataProcessorData = - processor.process(data) - - logger.info('loading streams...') - const streamsStorage = new Storage(STREAMS_DIR) - const parser = new PlaylistParser({ - storage: streamsStorage, - channelsKeyById, - logosGroupedByStreamId, - feedsGroupedByChannelId - }) - const files = await streamsStorage.list('**/*.m3u') - let streams = await parser.parse(files) - streams = streams - .orderBy((stream: Stream) => stream.getId()) - .map((stream: Stream) => stream.toJSON()) - logger.info(`found ${streams.count()} streams`) - - logger.info('saving to .api/streams.json...') - const apiStorage = new Storage(API_DIR) - await apiStorage.save('streams.json', streams.toJSON()) -} - -main() +import { API_DIR, STREAMS_DIR } from '../../constants' +import { Storage } from '@freearhey/storage-js' +import { PlaylistParser } from '../../core' +import { Logger } from '@freearhey/core' +import { Stream } from '../../models' +import { loadData } from '../../api' + +async function main() { + const logger = new Logger() + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const streamsStorage = new Storage(STREAMS_DIR) + const parser = new PlaylistParser({ + storage: streamsStorage + }) + const files = await streamsStorage.list('**/*.m3u') + const parsed = await parser.parse(files) + const _streams = parsed + .sortBy((stream: Stream) => stream.getId()) + .map((stream: Stream) => stream.toObject()) + logger.info(`found ${_streams.count()} streams`) + + logger.info('saving to .api/streams.json...') + const apiStorage = new Storage(API_DIR) + await apiStorage.save('streams.json', _streams.toJSON()) +} + +main() diff --git a/scripts/commands/api/load.ts b/scripts/commands/api/load.ts index 39cf0a2e8b..42919ffd8d 100644 --- a/scripts/commands/api/load.ts +++ b/scripts/commands/api/load.ts @@ -1,26 +1,7 @@ -import { DATA_DIR } from '../../constants' -import { Storage } from '@freearhey/core' -import { DataLoader } from '../../core' - -async function main() { - const storage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage }) - - await Promise.all([ - loader.download('blocklist.json'), - loader.download('categories.json'), - loader.download('channels.json'), - loader.download('countries.json'), - loader.download('languages.json'), - loader.download('regions.json'), - loader.download('subdivisions.json'), - loader.download('feeds.json'), - loader.download('logos.json'), - loader.download('timezones.json'), - loader.download('guides.json'), - loader.download('streams.json'), - loader.download('cities.json') - ]) -} - -main() +import { downloadData } from '../../api' + +async function main() { + await downloadData() +} + +main() diff --git a/scripts/commands/playlist/edit.ts b/scripts/commands/playlist/edit.ts index c58be822a3..d8719cab32 100644 --- a/scripts/commands/playlist/edit.ts +++ b/scripts/commands/playlist/edit.ts @@ -1,217 +1,190 @@ -import { Storage, Collection, Logger, Dictionary } from '@freearhey/core' -import { DataLoader, DataProcessor, PlaylistParser } from '../../core' -import type { ChannelSearchableData } from '../../types/channel' -import { Channel, Feed, Playlist, Stream } from '../../models' -import { DataProcessorData } from '../../types/dataProcessor' -import { DataLoaderData } from '../../types/dataLoader' -import { select, input } from '@inquirer/prompts' -import { DATA_DIR } from '../../constants' -import nodeCleanup from 'node-cleanup' -import sjs from '@freearhey/search-js' -import { Command } from 'commander' -import readline from 'readline' - -type ChoiceValue = { type: string; value?: Feed | Channel } -type Choice = { name: string; short?: string; value: ChoiceValue; default?: boolean } - -if (process.platform === 'win32') { - readline - .createInterface({ - input: process.stdin, - output: process.stdout - }) - .on('SIGINT', function () { - process.emit('SIGINT') - }) -} - -const program = new Command() - -program.argument('', 'Path to *.channels.xml file to edit').parse(process.argv) - -const filepath = program.args[0] -const logger = new Logger() -const storage = new Storage() -let parsedStreams = new Collection() - -main(filepath) -nodeCleanup(() => { - save(filepath) -}) - -export default async function main(filepath: string) { - if (!(await storage.exists(filepath))) { - throw new Error(`File "${filepath}" does not exists`) - } - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { - channels, - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId - }: DataProcessorData = processor.process(data) - - logger.info('loading streams...') - const parser = new PlaylistParser({ - storage, - feedsGroupedByChannelId, - logosGroupedByStreamId, - channelsKeyById - }) - parsedStreams = await parser.parseFile(filepath) - const streamsWithoutId = parsedStreams.filter((stream: Stream) => !stream.id) - - logger.info( - `found ${parsedStreams.count()} streams (including ${streamsWithoutId.count()} without ID)` - ) - - logger.info('creating search index...') - const items = channels.map((channel: Channel) => channel.getSearchable()).all() - const searchIndex = sjs.createIndex(items, { - searchable: ['name', 'altNames', 'guideNames', 'streamTitles', 'feedFullNames'] - }) - - logger.info('starting...\n') - - for (const stream of streamsWithoutId.all()) { - try { - stream.id = await selectChannel(stream, searchIndex, feedsGroupedByChannelId, channelsKeyById) - } catch (err) { - logger.info(err.message) - break - } - } - - streamsWithoutId.forEach((stream: Stream) => { - if (stream.id === '-') { - stream.id = '' - } - }) -} - -async function selectChannel( - stream: Stream, - searchIndex, - feedsGroupedByChannelId: Dictionary, - channelsKeyById: Dictionary -): Promise { - const query = escapeRegex(stream.getTitle()) - const similarChannels = searchIndex - .search(query) - .map((item: ChannelSearchableData) => channelsKeyById.get(item.id)) - - const url = stream.url.length > 50 ? stream.url.slice(0, 50) + '...' : stream.url - - const selected: ChoiceValue = await select({ - message: `Select channel ID for "${stream.title}" (${url}):`, - choices: getChannelChoises(new Collection(similarChannels)), - pageSize: 10 - }) - - switch (selected.type) { - case 'skip': - return '-' - case 'type': { - const typedChannelId = await input({ message: ' Channel ID:' }) - if (!typedChannelId) return '' - const selectedFeedId = await selectFeed(typedChannelId, feedsGroupedByChannelId) - if (selectedFeedId === '-') return typedChannelId - return [typedChannelId, selectedFeedId].join('@') - } - case 'channel': { - const selectedChannel = selected.value - if (!selectedChannel) return '' - const selectedFeedId = await selectFeed(selectedChannel.id, feedsGroupedByChannelId) - if (selectedFeedId === '-') return selectedChannel.id - return [selectedChannel.id, selectedFeedId].join('@') - } - } - - return '' -} - -async function selectFeed(channelId: string, feedsGroupedByChannelId: Dictionary): Promise { - const channelFeeds = new Collection(feedsGroupedByChannelId.get(channelId)) - const choices = getFeedChoises(channelFeeds) - - const selected: ChoiceValue = await select({ - message: `Select feed ID for "${channelId}":`, - choices, - pageSize: 10 - }) - - switch (selected.type) { - case 'skip': - return '-' - case 'type': - return await input({ message: ' Feed ID:', default: 'SD' }) - case 'feed': - const selectedFeed = selected.value - if (!selectedFeed) return '' - return selectedFeed.id - } - - return '' -} - -function getChannelChoises(channels: Collection): Choice[] { - const choises: Choice[] = [] - - channels.forEach((channel: Channel) => { - const names = new Collection([channel.name, ...channel.altNames.all()]).uniq().join(', ') - - choises.push({ - value: { - type: 'channel', - value: channel - }, - name: `${channel.id} (${names})`, - short: `${channel.id}` - }) - }) - - choises.push({ name: 'Type...', value: { type: 'type' } }) - choises.push({ name: 'Skip', value: { type: 'skip' } }) - - return choises -} - -function getFeedChoises(feeds: Collection): Choice[] { - const choises: Choice[] = [] - - feeds.forEach((feed: Feed) => { - let name = `${feed.id} (${feed.name})` - if (feed.isMain) name += ' [main]' - - choises.push({ - value: { - type: 'feed', - value: feed - }, - default: feed.isMain, - name, - short: feed.id - }) - }) - - choises.push({ name: 'Type...', value: { type: 'type' } }) - choises.push({ name: 'Skip', value: { type: 'skip' } }) - - return choises -} - -function save(filepath: string) { - if (!storage.existsSync(filepath)) return - const playlist = new Playlist(parsedStreams) - storage.saveSync(filepath, playlist.toString()) - logger.info(`\nFile '${filepath}' successfully saved`) -} - -function escapeRegex(string: string) { - return string.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&') -} +import { loadData, data, searchChannels } from '../../api' +import { Collection, Logger } from '@freearhey/core' +import { select, input } from '@inquirer/prompts' +import { Playlist, Stream } from '../../models' +import { Storage } from '@freearhey/storage-js' +import { PlaylistParser } from '../../core' +import nodeCleanup from 'node-cleanup' +import * as sdk from '@iptv-org/sdk' +import { truncate } from '../../utils' +import { Command } from 'commander' +import readline from 'readline' + +type ChoiceValue = { type: string; value?: sdk.Models.Feed | sdk.Models.Channel } +type Choice = { name: string; short?: string; value: ChoiceValue; default?: boolean } + +if (process.platform === 'win32') { + readline + .createInterface({ + input: process.stdin, + output: process.stdout + }) + .on('SIGINT', function () { + process.emit('SIGINT') + }) +} + +const program = new Command() + +program.argument('', 'Path to *.channels.xml file to edit').parse(process.argv) + +const filepath = program.args[0] +const logger = new Logger() +const storage = new Storage() +let parsedStreams = new Collection() + +main(filepath) +nodeCleanup(() => { + save(filepath) +}) + +export default async function main(filepath: string) { + if (!(await storage.exists(filepath))) { + throw new Error(`File "${filepath}" does not exists`) + } + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const parser = new PlaylistParser({ + storage + }) + parsedStreams = await parser.parseFile(filepath) + const streamsWithoutId = parsedStreams.filter((stream: Stream) => !stream.tvgId) + + logger.info( + `found ${parsedStreams.count()} streams (including ${streamsWithoutId.count()} without ID)` + ) + + logger.info('starting...\n') + + for (const stream of streamsWithoutId.all()) { + try { + stream.tvgId = await selectChannel(stream) + } catch (err) { + logger.info(err.message) + break + } + } + + streamsWithoutId.forEach((stream: Stream) => { + if (stream.channel === '-') { + stream.channel = '' + } + }) +} + +async function selectChannel(stream: Stream): Promise { + const query = escapeRegex(stream.title) + const similarChannels = searchChannels(query) + const url = truncate(stream.url, 50) + + const selected: ChoiceValue = await select({ + message: `Select channel ID for "${stream.title}" (${url}):`, + choices: getChannelChoises(similarChannels), + pageSize: 10 + }) + + switch (selected.type) { + case 'skip': + return '-' + case 'type': { + const typedChannelId = await input({ message: ' Channel ID:' }) + if (!typedChannelId) return '' + const selectedFeedId = await selectFeed(typedChannelId) + if (selectedFeedId === '-') return typedChannelId + return [typedChannelId, selectedFeedId].join('@') + } + case 'channel': { + const selectedChannel = selected.value + if (!selectedChannel) return '' + const selectedFeedId = await selectFeed(selectedChannel.id) + if (selectedFeedId === '-') return selectedChannel.id + return [selectedChannel.id, selectedFeedId].join('@') + } + } + + return '' +} + +async function selectFeed(channelId: string): Promise { + const channelFeeds = new Collection(data.feedsGroupedByChannel.get(channelId)) + const choices = getFeedChoises(channelFeeds) + + const selected: ChoiceValue = await select({ + message: `Select feed ID for "${channelId}":`, + choices, + pageSize: 10 + }) + + switch (selected.type) { + case 'skip': + return '-' + case 'type': + return await input({ message: ' Feed ID:', default: 'SD' }) + case 'feed': + const selectedFeed = selected.value + if (!selectedFeed) return '' + return selectedFeed.id + } + + return '' +} + +function getChannelChoises(channels: Collection): Choice[] { + const choises: Choice[] = [] + + channels.forEach((channel: sdk.Models.Channel) => { + const names = new Collection([channel.name, ...channel.alt_names]).uniq().join(', ') + + choises.push({ + value: { + type: 'channel', + value: channel + }, + name: `${channel.id} (${names})`, + short: `${channel.id}` + }) + }) + + choises.push({ name: 'Type...', value: { type: 'type' } }) + choises.push({ name: 'Skip', value: { type: 'skip' } }) + + return choises +} + +function getFeedChoises(feeds: Collection): Choice[] { + const choises: Choice[] = [] + + feeds.forEach((feed: sdk.Models.Feed) => { + let name = `${feed.id} (${feed.name})` + if (feed.is_main) name += ' [main]' + + choises.push({ + value: { + type: 'feed', + value: feed + }, + default: feed.is_main, + name, + short: feed.id + }) + }) + + choises.push({ name: 'Type...', value: { type: 'type' } }) + choises.push({ name: 'Skip', value: { type: 'skip' } }) + + return choises +} + +function save(filepath: string) { + if (!storage.existsSync(filepath)) return + const playlist = new Playlist(parsedStreams) + storage.saveSync(filepath, playlist.toString()) + logger.info(`\nFile '${filepath}' successfully saved`) +} + +function escapeRegex(string: string) { + return string.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&') +} diff --git a/scripts/commands/playlist/format.ts b/scripts/commands/playlist/format.ts index 345789bc28..15b4bc017e 100644 --- a/scripts/commands/playlist/format.ts +++ b/scripts/commands/playlist/format.ts @@ -1,78 +1,84 @@ -import { Logger, Storage } from '@freearhey/core' -import { STREAMS_DIR, DATA_DIR } from '../../constants' -import { DataLoader, DataProcessor, PlaylistParser } from '../../core' -import { Stream, Playlist } from '../../models' -import { program } from 'commander' -import { DataLoaderData } from '../../types/dataLoader' -import { DataProcessorData } from '../../types/dataProcessor' -import path from 'node:path' - -program.argument('[filepath...]', 'Path to file to format').parse(process.argv) - -async function main() { - const logger = new Logger() - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { channelsKeyById, feedsGroupedByChannelId, logosGroupedByStreamId }: DataProcessorData = - processor.process(data) - - logger.info('loading streams...') - const streamsStorage = new Storage(STREAMS_DIR) - const parser = new PlaylistParser({ - storage: streamsStorage, - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId - }) - let files = program.args.length ? program.args : await streamsStorage.list('**/*.m3u') - files = files.map((filepath: string) => path.basename(filepath)) - let streams = await parser.parse(files) - - logger.info(`found ${streams.count()} streams`) - - logger.info('normalizing links...') - streams = streams.map(stream => { - stream.normalizeURL() - return stream - }) - - logger.info('removing duplicates...') - streams = streams.uniqBy(stream => stream.url) - - logger.info('removing wrong id...') - streams = streams.map((stream: Stream) => { - if (!stream.channel || channelsKeyById.missing(stream.channel.id)) { - stream.id = '' - } - - return stream - }) - - logger.info('sorting links...') - streams = streams.orderBy( - [ - (stream: Stream) => stream.title, - (stream: Stream) => stream.getVerticalResolution(), - (stream: Stream) => stream.getLabel(), - (stream: Stream) => stream.url - ], - ['asc', 'desc', 'asc', 'asc'] - ) - - logger.info('saving...') - const groupedStreams = streams.groupBy((stream: Stream) => stream.getFilepath()) - for (const filepath of groupedStreams.keys()) { - const streams = groupedStreams.get(filepath) || [] - - if (!streams.length) return - - const playlist = new Playlist(streams, { public: false }) - await streamsStorage.save(filepath, playlist.toString()) - } -} - -main() +import { Collection, Logger } from '@freearhey/core' +import { Stream, Playlist } from '../../models' +import { Storage } from '@freearhey/storage-js' +import { STREAMS_DIR } from '../../constants' +import { PlaylistParser } from '../../core' +import { loadData } from '../../api' +import { program } from 'commander' +import path from 'node:path' + +program.argument('[filepath...]', 'Path to file to format').parse(process.argv) + +async function main() { + const logger = new Logger() + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const streamsStorage = new Storage(STREAMS_DIR) + const parser = new PlaylistParser({ + storage: streamsStorage + }) + let files = program.args.length ? program.args : await streamsStorage.list('**/*.m3u') + files = files.map((filepath: string) => path.basename(filepath)) + let streams = await parser.parse(files) + + logger.info(`found ${streams.count()} streams`) + + logger.info('normalizing links...') + streams = streams.map(stream => { + stream.normalizeURL() + return stream + }) + + logger.info('removing duplicates...') + streams = streams.uniqBy(stream => stream.url) + + logger.info('removing wrong id...') + streams = streams.map((stream: Stream) => { + const channel = stream.getChannel() + if (channel) return stream + + stream.tvgId = '' + stream.channel = '' + stream.feed = '' + + return stream + }) + + logger.info('adding the missing feed id...') + streams = streams.map((stream: Stream) => { + const feed = stream.getFeed() + if (feed) { + stream.feed = feed.id + stream.tvgId = stream.getId() + } + + return stream + }) + + logger.info('sorting links...') + streams = streams.sortBy( + [ + (stream: Stream) => stream.title, + (stream: Stream) => stream.getVerticalResolution(), + (stream: Stream) => stream.label, + (stream: Stream) => stream.url + ], + ['asc', 'desc', 'asc', 'asc'] + ) + + logger.info('saving...') + const groupedStreams = streams.groupBy((stream: Stream) => stream.getFilepath()) + for (const filepath of groupedStreams.keys()) { + const streams = new Collection(groupedStreams.get(filepath)) + + if (streams.isEmpty()) return + + const playlist = new Playlist(streams, { public: false }) + await streamsStorage.save(filepath, playlist.toString()) + } +} + +main() diff --git a/scripts/commands/playlist/generate.ts b/scripts/commands/playlist/generate.ts index 6e960832a5..a84bd82651 100644 --- a/scripts/commands/playlist/generate.ts +++ b/scripts/commands/playlist/generate.ts @@ -1,131 +1,115 @@ -import { PlaylistParser, DataProcessor, DataLoader } from '../../core' -import type { DataProcessorData } from '../../types/dataProcessor' -import { DATA_DIR, LOGS_DIR, STREAMS_DIR } from '../../constants' -import type { DataLoaderData } from '../../types/dataLoader' -import { Logger, Storage, File } from '@freearhey/core' -import { Stream } from '../../models' -import uniqueId from 'lodash.uniqueid' -import { - IndexCategoryGenerator, - IndexLanguageGenerator, - IndexCountryGenerator, - SubdivisionsGenerator, - CategoriesGenerator, - CountriesGenerator, - LanguagesGenerator, - RegionsGenerator, - SourcesGenerator, - CitiesGenerator, - IndexGenerator, - RawGenerator -} from '../../generators' - -async function main() { - const logger = new Logger() - const logFile = new File('generators.log') - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { - feedsGroupedByChannelId, - logosGroupedByStreamId, - channelsKeyById, - subdivisions, - categories, - countries, - regions, - cities - }: DataProcessorData = processor.process(data) - - logger.info('loading streams...') - const streamsStorage = new Storage(STREAMS_DIR) - const parser = new PlaylistParser({ - storage: streamsStorage, - feedsGroupedByChannelId, - logosGroupedByStreamId, - channelsKeyById - }) - const files = await streamsStorage.list('**/*.m3u') - let streams = await parser.parse(files) - const totalStreams = streams.count() - logger.info(`found ${totalStreams} streams`) - - logger.info('generating raw/...') - await new RawGenerator({ streams, logFile }).generate() - - logger.info('filtering streams...') - streams = streams.uniqBy((stream: Stream) => - stream.hasId() ? stream.getChannelId() + stream.getFeedId() : uniqueId() - ) - - logger.info('sorting streams...') - streams = streams.orderBy( - [ - (stream: Stream) => stream.getId(), - (stream: Stream) => stream.getVerticalResolution(), - (stream: Stream) => stream.getLabel() - ], - ['asc', 'asc', 'desc'] - ) - - logger.info('generating categories/...') - await new CategoriesGenerator({ categories, streams, logFile }).generate() - - logger.info('generating languages/...') - await new LanguagesGenerator({ streams, logFile }).generate() - - logger.info('generating countries/...') - await new CountriesGenerator({ - countries, - streams, - logFile - }).generate() - - logger.info('generating subdivisions/...') - await new SubdivisionsGenerator({ - subdivisions, - streams, - logFile - }).generate() - - logger.info('generating cities/...') - await new CitiesGenerator({ - cities, - streams, - logFile - }).generate() - - logger.info('generating regions/...') - await new RegionsGenerator({ - streams, - regions, - logFile - }).generate() - - logger.info('generating sources/...') - await new SourcesGenerator({ streams, logFile }).generate() - - logger.info('generating index.m3u...') - await new IndexGenerator({ streams, logFile }).generate() - - logger.info('generating index.category.m3u...') - await new IndexCategoryGenerator({ streams, logFile }).generate() - - logger.info('generating index.country.m3u...') - await new IndexCountryGenerator({ - streams, - logFile - }).generate() - - logger.info('generating index.language.m3u...') - await new IndexLanguageGenerator({ streams, logFile }).generate() - - logger.info('saving generators.log...') - const logStorage = new Storage(LOGS_DIR) - logStorage.saveFile(logFile) -} - -main() +import { LOGS_DIR, STREAMS_DIR } from '../../constants' +import { Storage, File } from '@freearhey/storage-js' +import { PlaylistParser } from '../../core' +import { loadData, data } from '../../api' +import { Logger } from '@freearhey/core' +import uniqueId from 'lodash.uniqueid' +import { Stream } from '../../models' +import { + IndexCategoryGenerator, + IndexLanguageGenerator, + IndexCountryGenerator, + SubdivisionsGenerator, + CategoriesGenerator, + CountriesGenerator, + LanguagesGenerator, + RegionsGenerator, + SourcesGenerator, + CitiesGenerator, + IndexGenerator, + RawGenerator +} from '../../generators' + +async function main() { + const logger = new Logger() + const logFile = new File('generators.log') + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const streamsStorage = new Storage(STREAMS_DIR) + const parser = new PlaylistParser({ + storage: streamsStorage + }) + const files = await streamsStorage.list('**/*.m3u') + let streams = await parser.parse(files) + const totalStreams = streams.count() + logger.info(`found ${totalStreams} streams`) + + logger.info('generating raw/...') + await new RawGenerator({ streams, logFile }).generate() + + logger.info('filtering streams...') + streams = streams.uniqBy((stream: Stream) => stream.getId() || uniqueId()) + + logger.info('sorting streams...') + streams = streams.sortBy( + [ + (stream: Stream) => stream.getId(), + (stream: Stream) => stream.getVerticalResolution(), + (stream: Stream) => stream.label + ], + ['asc', 'asc', 'desc'] + ) + + const { categories, countries, subdivisions, cities, regions } = data + + logger.info('generating categories/...') + await new CategoriesGenerator({ categories, streams, logFile }).generate() + + logger.info('generating languages/...') + await new LanguagesGenerator({ streams, logFile }).generate() + + logger.info('generating countries/...') + await new CountriesGenerator({ + countries, + streams, + logFile + }).generate() + + logger.info('generating subdivisions/...') + await new SubdivisionsGenerator({ + subdivisions, + streams, + logFile + }).generate() + + logger.info('generating cities/...') + await new CitiesGenerator({ + cities, + streams, + logFile + }).generate() + + logger.info('generating regions/...') + await new RegionsGenerator({ + streams, + regions, + logFile + }).generate() + + logger.info('generating sources/...') + await new SourcesGenerator({ streams, logFile }).generate() + + logger.info('generating index.m3u...') + await new IndexGenerator({ streams, logFile }).generate() + + logger.info('generating index.category.m3u...') + await new IndexCategoryGenerator({ streams, logFile }).generate() + + logger.info('generating index.country.m3u...') + await new IndexCountryGenerator({ + streams, + logFile + }).generate() + + logger.info('generating index.language.m3u...') + await new IndexLanguageGenerator({ streams, logFile }).generate() + + logger.info('saving generators.log...') + const logStorage = new Storage(LOGS_DIR) + logStorage.saveFile(logFile) +} + +main() diff --git a/scripts/commands/playlist/test.ts b/scripts/commands/playlist/test.ts index f4d59cac1a..737b2dbea7 100644 --- a/scripts/commands/playlist/test.ts +++ b/scripts/commands/playlist/test.ts @@ -1,182 +1,177 @@ -import { Logger, Storage, Collection } from '@freearhey/core' -import { ROOT_DIR, STREAMS_DIR, DATA_DIR } from '../../constants' -import { PlaylistParser, StreamTester, CliTable, DataProcessor, DataLoader } from '../../core' -import type { TestResult } from '../../core/streamTester' -import { Stream } from '../../models' -import { program, OptionValues } from 'commander' -import { eachLimit } from 'async-es' -import chalk from 'chalk' -import os from 'node:os' -import dns from 'node:dns' -import type { DataLoaderData } from '../../types/dataLoader' -import type { DataProcessorData } from '../../types/dataProcessor' - -const LIVE_UPDATE_INTERVAL = 5000 -const LIVE_UPDATE_MAX_STREAMS = 100 - -let errors = 0 -let warnings = 0 -const results: { [key: string]: string } = {} -let interval: string | number | NodeJS.Timeout | undefined -let streams = new Collection() -let isLiveUpdateEnabled = true - -program - .argument('[filepath...]', 'Path to file to test') - .option( - '-p, --parallel ', - 'Batch size of streams to test concurrently', - (value: string) => parseInt(value), - os.cpus().length - ) - .option('-x, --proxy ', 'Use the specified proxy') - .option( - '-t, --timeout ', - 'The number of milliseconds before the request will be aborted', - (value: string) => parseInt(value), - 30000 - ) - .parse(process.argv) - -const options: OptionValues = program.opts() - -const logger = new Logger() -const tester = new StreamTester({ options }) - -async function main() { - if (await isOffline()) { - logger.error(chalk.red('Internet connection is required for the script to work')) - return - } - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { channelsKeyById, feedsGroupedByChannelId, logosGroupedByStreamId }: DataProcessorData = - processor.process(data) - - logger.info('loading streams...') - const rootStorage = new Storage(ROOT_DIR) - const parser = new PlaylistParser({ - storage: rootStorage, - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId - }) - const files = program.args.length ? program.args : await rootStorage.list(`${STREAMS_DIR}/*.m3u`) - streams = await parser.parse(files) - - logger.info(`found ${streams.count()} streams`) - if (streams.count() > LIVE_UPDATE_MAX_STREAMS) isLiveUpdateEnabled = false - - logger.info('starting...') - if (!isLiveUpdateEnabled) { - drawTable() - interval = setInterval(() => { - drawTable() - }, LIVE_UPDATE_INTERVAL) - } - - await eachLimit( - streams.all(), - options.parallel, - async (stream: Stream) => { - await runTest(stream) - - if (isLiveUpdateEnabled) { - drawTable() - } - }, - onFinish - ) -} - -main() - -async function runTest(stream: Stream) { - const key = stream.filepath + stream.getId() + stream.url - results[key] = chalk.white('LOADING...') - - const result: TestResult = await tester.test(stream) - - let status = '' - const errorStatusCodes = ['ENOTFOUND', 'HTTP_404_NOT_FOUND'] - if (result.status.ok) status = chalk.green('OK') - else if (errorStatusCodes.includes(result.status.code)) { - status = chalk.red(result.status.code) - errors++ - } else { - status = chalk.yellow(result.status.code) - warnings++ - } - - results[key] = status -} - -function drawTable() { - process.stdout.write('\u001b[3J\u001b[1J') - console.clear() - - const streamsGrouped = streams.groupBy((stream: Stream) => stream.filepath) - for (const filepath of streamsGrouped.keys()) { - const streams: Stream[] = streamsGrouped.get(filepath) - - const table = new CliTable({ - columns: [ - { name: '', alignment: 'center', minLen: 3, maxLen: 3 }, - { name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 }, - { name: 'url', alignment: 'left', color: 'green', minLen: 100, maxLen: 100 }, - { name: 'status', alignment: 'left', minLen: 25, maxLen: 25 } - ] - }) - streams.forEach((stream: Stream, index: number) => { - const status = results[stream.filepath + stream.getId() + stream.url] || chalk.gray('PENDING') - - const row = { - '': index, - 'tvg-id': stream.getId().length > 25 ? stream.getId().slice(0, 22) + '...' : stream.getId(), - url: stream.url.length > 100 ? stream.url.slice(0, 97) + '...' : stream.url, - status - } - table.append(row) - }) - - process.stdout.write(`\n${chalk.underline(filepath)}\n`) - - process.stdout.write(table.toString()) - } -} - -function onFinish(error: any) { - clearInterval(interval) - - if (error) { - console.error(error) - process.exit(1) - } - - drawTable() - - if (errors > 0 || warnings > 0) { - console.log( - chalk.red(`\n${errors + warnings} problems (${errors} errors, ${warnings} warnings)`) - ) - - if (errors > 0) { - process.exit(1) - } - } - - process.exit(0) -} - -async function isOffline() { - return new Promise((resolve, reject) => { - dns.lookup('info.cern.ch', err => { - if (err) resolve(true) - reject(false) - }) - }).catch(() => {}) -} +import { PlaylistParser, StreamTester, CliTable } from '../../core' +import type { TestResult } from '../../core/streamTester' +import { ROOT_DIR, STREAMS_DIR } from '../../constants' +import { Logger, Collection } from '@freearhey/core' +import { program, OptionValues } from 'commander' +import { Storage } from '@freearhey/storage-js' +import { Stream } from '../../models' +import { loadData } from '../../api' +import { eachLimit } from 'async' +import dns from 'node:dns' +import chalk from 'chalk' +import os from 'node:os' +import { truncate } from '../../utils' + +const LIVE_UPDATE_INTERVAL = 5000 +const LIVE_UPDATE_MAX_STREAMS = 100 + +let errors = 0 +let warnings = 0 +const results: { [key: string]: string } = {} +let interval: string | number | NodeJS.Timeout | undefined +let streams = new Collection() +let isLiveUpdateEnabled = true + +program + .argument('[filepath...]', 'Path to file to test') + .option( + '-p, --parallel ', + 'Batch size of streams to test concurrently', + (value: string) => parseInt(value), + os.cpus().length + ) + .option('-x, --proxy ', 'Use the specified proxy') + .option( + '-t, --timeout ', + 'The number of milliseconds before the request will be aborted', + (value: string) => parseInt(value), + 30000 + ) + .parse(process.argv) + +const options: OptionValues = program.opts() + +const logger = new Logger() +const tester = new StreamTester({ options }) + +async function main() { + if (await isOffline()) { + logger.error(chalk.red('Internet connection is required for the script to work')) + return + } + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const rootStorage = new Storage(ROOT_DIR) + const parser = new PlaylistParser({ + storage: rootStorage + }) + const files = program.args.length ? program.args : await rootStorage.list(`${STREAMS_DIR}/*.m3u`) + streams = await parser.parse(files) + + logger.info(`found ${streams.count()} streams`) + if (streams.count() > LIVE_UPDATE_MAX_STREAMS) isLiveUpdateEnabled = false + + logger.info('starting...') + if (!isLiveUpdateEnabled) { + drawTable() + interval = setInterval(() => { + drawTable() + }, LIVE_UPDATE_INTERVAL) + } + + eachLimit( + streams.all(), + options.parallel, + async (stream: Stream) => { + await runTest(stream) + + if (isLiveUpdateEnabled) { + drawTable() + } + }, + onFinish + ) +} + +main() + +async function runTest(stream: Stream) { + const key = stream.getUniqKey() + results[key] = chalk.white('LOADING...') + + const result: TestResult = await tester.test(stream) + + let status = '' + const errorStatusCodes = ['ENOTFOUND', 'HTTP_404_NOT_FOUND'] + if (result.status.ok) status = chalk.green('OK') + else if (errorStatusCodes.includes(result.status.code)) { + status = chalk.red(result.status.code) + errors++ + } else { + status = chalk.yellow(result.status.code) + warnings++ + } + + results[key] = status +} + +function drawTable() { + process.stdout.write('\u001b[3J\u001b[1J') + console.clear() + + const streamsGrouped = streams.groupBy((stream: Stream) => stream.filepath) + for (const filepath of streamsGrouped.keys()) { + const streams: Stream[] = streamsGrouped.get(filepath) || [] + + const table = new CliTable({ + columns: [ + { name: '', alignment: 'center', minLen: 3, maxLen: 3 }, + { name: 'tvg-id', alignment: 'left', color: 'green', minLen: 25, maxLen: 25 }, + { name: 'url', alignment: 'left', color: 'green', minLen: 100, maxLen: 100 }, + { name: 'status', alignment: 'left', minLen: 25, maxLen: 25 } + ] + }) + streams.forEach((stream: Stream, index: number) => { + const key = stream.getUniqKey() + const status = results[key] || chalk.gray('PENDING') + const tvgId = stream.getTvgId() + + const row = { + '': index, + 'tvg-id': truncate(tvgId, 25), + url: truncate(stream.url, 100), + status + } + table.append(row) + }) + + process.stdout.write(`\n${chalk.underline(filepath)}\n`) + + process.stdout.write(table.toString()) + } +} + +function onFinish(error: Error) { + clearInterval(interval) + + if (error) { + console.error(error) + process.exit(1) + } + + drawTable() + + if (errors > 0 || warnings > 0) { + console.log( + chalk.red(`\n${errors + warnings} problems (${errors} errors, ${warnings} warnings)`) + ) + + if (errors > 0) { + process.exit(1) + } + } + + process.exit(0) +} + +async function isOffline() { + return new Promise((resolve, reject) => { + dns.lookup('info.cern.ch', err => { + if (err) resolve(true) + reject(false) + }) + }).catch(() => {}) +} diff --git a/scripts/commands/playlist/update.ts b/scripts/commands/playlist/update.ts index 2ded669e75..600b23ac34 100644 --- a/scripts/commands/playlist/update.ts +++ b/scripts/commands/playlist/update.ts @@ -1,194 +1,174 @@ -import { DataLoader, DataProcessor, IssueLoader, PlaylistParser } from '../../core' -import { Logger, Storage, Collection, Dictionary } from '@freearhey/core' -import type { DataProcessorData } from '../../types/dataProcessor' -import { Stream, Playlist, Channel, Issue } from '../../models' -import type { DataLoaderData } from '../../types/dataLoader' -import { DATA_DIR, STREAMS_DIR } from '../../constants' -import { isURI } from '../../utils' - -const processedIssues = new Collection() - -async function main() { - const logger = new Logger({ level: -999 }) - const issueLoader = new IssueLoader() - - logger.info('loading issues...') - const issues = await issueLoader.load() - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const dataLoader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await dataLoader.load() - const { channelsKeyById, feedsGroupedByChannelId, logosGroupedByStreamId }: DataProcessorData = - processor.process(data) - - logger.info('loading streams...') - const streamsStorage = new Storage(STREAMS_DIR) - const parser = new PlaylistParser({ - storage: streamsStorage, - feedsGroupedByChannelId, - logosGroupedByStreamId, - channelsKeyById - }) - const files = await streamsStorage.list('**/*.m3u') - const streams = await parser.parse(files) - - logger.info('removing streams...') - await removeStreams({ streams, issues }) - - logger.info('edit stream description...') - await editStreams({ - streams, - issues, - channelsKeyById, - feedsGroupedByChannelId - }) - - logger.info('add new streams...') - await addStreams({ - streams, - issues, - channelsKeyById, - feedsGroupedByChannelId - }) - - logger.info('saving...') - const groupedStreams = streams.groupBy((stream: Stream) => stream.getFilepath()) - for (const filepath of groupedStreams.keys()) { - let streams = groupedStreams.get(filepath) || [] - streams = streams.filter((stream: Stream) => stream.removed === false) - - const playlist = new Playlist(streams, { public: false }) - await streamsStorage.save(filepath, playlist.toString()) - } - - const output = processedIssues.map(issue_number => `closes #${issue_number}`).join(', ') - console.log(`OUTPUT=${output}`) -} - -main() - -async function removeStreams({ streams, issues }: { streams: Collection; issues: Collection }) { - const requests = issues.filter( - issue => issue.labels.includes('streams:remove') && issue.labels.includes('approved') - ) - requests.forEach((issue: Issue) => { - const data = issue.data - if (data.missing('streamUrl')) return - - const streamUrls = data.getString('streamUrl') || '' - - let changed = false - streamUrls - .split(/\r?\n/) - .filter(Boolean) - .forEach(link => { - const found: Stream = streams.first((_stream: Stream) => _stream.url === link.trim()) - if (found) { - found.removed = true - changed = true - } - }) - - if (changed) processedIssues.add(issue.number) - }) -} - -async function editStreams({ - streams, - issues, - channelsKeyById, - feedsGroupedByChannelId -}: { - streams: Collection - issues: Collection - channelsKeyById: Dictionary - feedsGroupedByChannelId: Dictionary -}) { - const requests = issues.filter( - issue => issue.labels.includes('streams:edit') && issue.labels.includes('approved') - ) - requests.forEach((issue: Issue) => { - const data = issue.data - - if (data.missing('streamUrl')) return - - const stream: Stream = streams.first( - (_stream: Stream) => _stream.url === data.getString('streamUrl') - ) - if (!stream) return - - const streamId = data.getString('streamId') || '' - const [channelId, feedId] = streamId.split('@') - - if (channelId) { - stream - .setChannelId(channelId) - .setFeedId(feedId) - .withChannel(channelsKeyById) - .withFeed(feedsGroupedByChannelId) - .updateId() - .updateTitle() - .updateFilepath() - } - - stream.update(data) - - processedIssues.add(issue.number) - }) -} - -async function addStreams({ - streams, - issues, - channelsKeyById, - feedsGroupedByChannelId -}: { - streams: Collection - issues: Collection - channelsKeyById: Dictionary - feedsGroupedByChannelId: Dictionary -}) { - const requests = issues.filter( - issue => issue.labels.includes('streams:add') && issue.labels.includes('approved') - ) - requests.forEach((issue: Issue) => { - const data = issue.data - if (data.missing('streamId') || data.missing('streamUrl')) return - if (streams.includes((_stream: Stream) => _stream.url === data.getString('streamUrl'))) return - const streamUrl = data.getString('streamUrl') || '' - if (!isURI(streamUrl)) return - - const streamId = data.getString('streamId') || '' - const [channelId, feedId] = streamId.split('@') - - const channel: Channel = channelsKeyById.get(channelId) - if (!channel) return - - const label = data.getString('label') || null - const quality = data.getString('quality') || null - const httpUserAgent = data.getString('httpUserAgent') || null - const httpReferrer = data.getString('httpReferrer') || null - const directives = data.getArray('directives') || [] - - const stream = new Stream({ - channelId, - feedId, - title: channel.name, - url: streamUrl, - userAgent: httpUserAgent, - referrer: httpReferrer, - directives, - quality, - label - }) - .withChannel(channelsKeyById) - .withFeed(feedsGroupedByChannelId) - .updateTitle() - .updateFilepath() - - streams.add(stream) - processedIssues.add(issue.number) - }) -} +import { IssueLoader, PlaylistParser } from '../../core' +import { Playlist, Issue, Stream } from '../../models' +import { loadData, data as apiData } from '../../api' +import { Logger, Collection } from '@freearhey/core' +import { Storage } from '@freearhey/storage-js' +import { STREAMS_DIR } from '../../constants' +import * as sdk from '@iptv-org/sdk' +import { isURI } from '../../utils' + +const processedIssues = new Collection() + +async function main() { + const logger = new Logger({ level: -999 }) + const issueLoader = new IssueLoader() + + logger.info('loading issues...') + const issues = await issueLoader.load() + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const streamsStorage = new Storage(STREAMS_DIR) + const parser = new PlaylistParser({ + storage: streamsStorage + }) + const files = await streamsStorage.list('**/*.m3u') + const streams = await parser.parse(files) + + logger.info('removing streams...') + await removeStreams({ streams, issues }) + + logger.info('edit stream description...') + await editStreams({ + streams, + issues + }) + + logger.info('add new streams...') + await addStreams({ + streams, + issues + }) + + logger.info('saving...') + const groupedStreams = streams.groupBy((stream: Stream) => stream.getFilepath()) + for (const filepath of groupedStreams.keys()) { + let streams = new Collection(groupedStreams.get(filepath)) + streams = streams.filter((stream: Stream) => stream.removed === false) + + const playlist = new Playlist(streams, { public: false }) + await streamsStorage.save(filepath, playlist.toString()) + } + + const output = processedIssues.map(issue_number => `closes #${issue_number}`).join(', ') + console.log(`OUTPUT=${output}`) +} + +main() + +async function removeStreams({ + streams, + issues +}: { + streams: Collection + issues: Collection +}) { + const requests = issues.filter( + issue => issue.labels.includes('streams:remove') && issue.labels.includes('approved') + ) + + requests.forEach((issue: Issue) => { + const data = issue.data + if (data.missing('streamUrl')) return + + const streamUrls = data.getString('streamUrl') || '' + + let changed = false + streamUrls + .split(/\r?\n/) + .filter(Boolean) + .forEach(link => { + const found: Stream = streams.first((_stream: Stream) => _stream.url === link.trim()) + if (found) { + found.removed = true + changed = true + } + }) + + if (changed) processedIssues.add(issue.number) + }) +} + +async function editStreams({ + streams, + issues +}: { + streams: Collection + issues: Collection +}) { + const requests = issues.filter( + issue => issue.labels.includes('streams:edit') && issue.labels.includes('approved') + ) + requests.forEach((issue: Issue) => { + const data = issue.data + + if (data.missing('streamUrl')) return + + const stream: Stream = streams.first( + (_stream: Stream) => _stream.url === data.getString('streamUrl') + ) + if (!stream) return + + const streamId = data.getString('streamId') || '' + const [channelId, feedId] = streamId.split('@') + + if (channelId) { + stream.channel = channelId + stream.feed = feedId + stream.updateTvgId().updateTitle().updateFilepath() + } + + stream.updateWithIssue(data) + + processedIssues.add(issue.number) + }) +} + +async function addStreams({ + streams, + issues +}: { + streams: Collection + issues: Collection +}) { + const requests = issues.filter( + issue => issue.labels.includes('streams:add') && issue.labels.includes('approved') + ) + requests.forEach((issue: Issue) => { + const data = issue.data + if (data.missing('streamId') || data.missing('streamUrl')) return + if (streams.includes((_stream: Stream) => _stream.url === data.getString('streamUrl'))) return + const streamUrl = data.getString('streamUrl') || '' + if (!isURI(streamUrl)) return + + const streamId = data.getString('streamId') || '' + const [channelId, feedId] = streamId.split('@') + + const channel: sdk.Models.Channel | undefined = apiData.channelsKeyById.get(channelId) + if (!channel) return + + const label = data.getString('label') || '' + const quality = data.getString('quality') || null + const httpUserAgent = data.getString('httpUserAgent') || null + const httpReferrer = data.getString('httpReferrer') || null + const directives = data.getArray('directives') || [] + + const stream = new Stream({ + channel: channelId, + feed: feedId, + title: channel.name, + url: streamUrl, + user_agent: httpUserAgent, + referrer: httpReferrer, + quality + }) + + stream.label = label + stream.setDirectives(directives).updateTitle().updateFilepath() + + streams.add(stream) + processedIssues.add(issue.number) + }) +} diff --git a/scripts/commands/playlist/validate.ts b/scripts/commands/playlist/validate.ts index 823acec73f..36ec037e23 100644 --- a/scripts/commands/playlist/validate.ts +++ b/scripts/commands/playlist/validate.ts @@ -1,129 +1,120 @@ -import { Logger, Storage, Collection, Dictionary } from '@freearhey/core' -import { DataLoader, DataProcessor, PlaylistParser } from '../../core' -import { DataProcessorData } from '../../types/dataProcessor' -import { DATA_DIR, ROOT_DIR } from '../../constants' -import { DataLoaderData } from '../../types/dataLoader' -import { BlocklistRecord, Stream } from '../../models' -import { program } from 'commander' -import chalk from 'chalk' - -program.argument('[filepath...]', 'Path to file to validate').parse(process.argv) - -type LogItem = { - type: string - line: number - message: string -} - -async function main() { - const logger = new Logger() - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId, - blocklistRecordsGroupedByChannelId - }: DataProcessorData = processor.process(data) - - logger.info('loading streams...') - const rootStorage = new Storage(ROOT_DIR) - const parser = new PlaylistParser({ - storage: rootStorage, - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId - }) - const files = program.args.length ? program.args : await rootStorage.list('streams/**/*.m3u') - const streams = await parser.parse(files) - logger.info(`found ${streams.count()} streams`) - - let errors = new Collection() - let warnings = new Collection() - const streamsGroupedByFilepath = streams.groupBy((stream: Stream) => stream.getFilepath()) - for (const filepath of streamsGroupedByFilepath.keys()) { - const streams = streamsGroupedByFilepath.get(filepath) - if (!streams) continue - - const log = new Collection() - const buffer = new Dictionary() - streams.forEach((stream: Stream) => { - if (stream.channelId) { - const channel = channelsKeyById.get(stream.channelId) - if (!channel) { - log.add({ - type: 'warning', - line: stream.getLine(), - message: `"${stream.id}" is not in the database` - }) - } - } - - const duplicate = stream.url && buffer.has(stream.url) - if (duplicate) { - log.add({ - type: 'warning', - line: stream.getLine(), - message: `"${stream.url}" is already on the playlist` - }) - } else { - buffer.set(stream.url, true) - } - - const blocklistRecords = stream.channel - ? new Collection(blocklistRecordsGroupedByChannelId.get(stream.channel.id)) - : new Collection() - - blocklistRecords.forEach((blocklistRecord: BlocklistRecord) => { - if (blocklistRecord.reason === 'dmca') { - log.add({ - type: 'error', - line: stream.getLine(), - message: `"${blocklistRecord.channelId}" is on the blocklist due to claims of copyright holders (${blocklistRecord.ref})` - }) - } else if (blocklistRecord.reason === 'nsfw') { - log.add({ - type: 'error', - line: stream.getLine(), - message: `"${blocklistRecord.channelId}" is on the blocklist due to NSFW content (${blocklistRecord.ref})` - }) - } - }) - }) - - if (log.notEmpty()) { - console.log(`\n${chalk.underline(filepath)}`) - - log.forEach((logItem: LogItem) => { - const position = logItem.line.toString().padEnd(6, ' ') - const type = logItem.type.padEnd(9, ' ') - const status = logItem.type === 'error' ? chalk.red(type) : chalk.yellow(type) - - console.log(` ${chalk.gray(position)}${status}${logItem.message}`) - }) - - errors = errors.concat(log.filter((logItem: LogItem) => logItem.type === 'error')) - warnings = warnings.concat(log.filter((logItem: LogItem) => logItem.type === 'warning')) - } - } - - if (errors.count() || warnings.count()) { - console.log( - chalk.red( - `\n${ - errors.count() + warnings.count() - } problems (${errors.count()} errors, ${warnings.count()} warnings)` - ) - ) - - if (errors.count()) { - process.exit(1) - } - } -} - -main() +import { Logger, Collection, Dictionary } from '@freearhey/core' +import { Storage } from '@freearhey/storage-js' +import { PlaylistParser } from '../../core' +import { data, loadData } from '../../api' +import { ROOT_DIR } from '../../constants' +import { Stream } from '../../models' +import * as sdk from '@iptv-org/sdk' +import { program } from 'commander' +import chalk from 'chalk' + +program.argument('[filepath...]', 'Path to file to validate').parse(process.argv) + +type LogItem = { + type: string + line: number + message: string +} + +async function main() { + const logger = new Logger() + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const rootStorage = new Storage(ROOT_DIR) + const parser = new PlaylistParser({ + storage: rootStorage + }) + const files = program.args.length ? program.args : await rootStorage.list('streams/**/*.m3u') + const streams = await parser.parse(files) + logger.info(`found ${streams.count()} streams`) + + let errors = new Collection() + let warnings = new Collection() + const streamsGroupedByFilepath = streams.groupBy((stream: Stream) => stream.getFilepath()) + for (const filepath of streamsGroupedByFilepath.keys()) { + const streams = streamsGroupedByFilepath.get(filepath) + if (!streams) continue + + const log = new Collection() + const buffer = new Dictionary() + streams.forEach((stream: Stream) => { + if (stream.channel) { + const channel = data.channelsKeyById.get(stream.channel) + if (!channel) { + log.add({ + type: 'warning', + line: stream.getLine(), + message: `"${stream.tvgId}" is not in the database` + }) + } + } + + const duplicate = stream.url && buffer.has(stream.url) + if (duplicate) { + log.add({ + type: 'warning', + line: stream.getLine(), + message: `"${stream.url}" is already on the playlist` + }) + } else { + buffer.set(stream.url, true) + } + + if (stream.channel) { + const blocklistRecords = new Collection( + data.blocklistRecordsGroupedByChannel.get(stream.channel) + ) + + blocklistRecords.forEach((blocklistRecord: sdk.Models.BlocklistRecord) => { + if (blocklistRecord.reason === 'dmca') { + log.add({ + type: 'error', + line: stream.getLine(), + message: `"${blocklistRecord.channel}" is on the blocklist due to claims of copyright holders (${blocklistRecord.ref})` + }) + } else if (blocklistRecord.reason === 'nsfw') { + log.add({ + type: 'error', + line: stream.getLine(), + message: `"${blocklistRecord.channel}" is on the blocklist due to NSFW content (${blocklistRecord.ref})` + }) + } + }) + } + }) + + if (log.isNotEmpty()) { + console.log(`\n${chalk.underline(filepath)}`) + + log.forEach((logItem: LogItem) => { + const position = logItem.line.toString().padEnd(6, ' ') + const type = logItem.type.padEnd(9, ' ') + const status = logItem.type === 'error' ? chalk.red(type) : chalk.yellow(type) + + console.log(` ${chalk.gray(position)}${status}${logItem.message}`) + }) + + errors = errors.concat(log.filter((logItem: LogItem) => logItem.type === 'error')) + warnings = warnings.concat(log.filter((logItem: LogItem) => logItem.type === 'warning')) + } + } + + if (errors.count() || warnings.count()) { + console.log( + chalk.red( + `\n${ + errors.count() + warnings.count() + } problems (${errors.count()} errors, ${warnings.count()} warnings)` + ) + ) + + if (errors.count()) { + process.exit(1) + } + } +} + +main() diff --git a/scripts/commands/readme/update.ts b/scripts/commands/readme/update.ts index d47f6ba48a..24ce044ab8 100644 --- a/scripts/commands/readme/update.ts +++ b/scripts/commands/readme/update.ts @@ -1,48 +1,30 @@ -import { CategoriesTable, CountriesTable, LanguagesTable, RegionsTable } from '../../tables' -import { DataLoader, DataProcessor, Markdown } from '../../core' -import { DataProcessorData } from '../../types/dataProcessor' -import { DataLoaderData } from '../../types/dataLoader' -import { README_DIR, DATA_DIR, ROOT_DIR } from '../../constants' -import { Logger, Storage } from '@freearhey/core' - -async function main() { - const logger = new Logger() - const dataStorage = new Storage(DATA_DIR) - const processor = new DataProcessor() - const loader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await loader.load() - const { - subdivisionsKeyByCode, - languagesKeyByCode, - countriesKeyByCode, - categoriesKeyById, - subdivisions, - countries, - regions, - cities - }: DataProcessorData = processor.process(data) - - logger.info('creating category table...') - await new CategoriesTable({ categoriesKeyById }).make() - logger.info('creating language table...') - await new LanguagesTable({ languagesKeyByCode }).make() - logger.info('creating countires table...') - await new CountriesTable({ - countriesKeyByCode, - subdivisionsKeyByCode, - subdivisions, - countries, - cities - }).make() - logger.info('creating region table...') - await new RegionsTable({ regions }).make() - - logger.info('updating playlists.md...') - const playlists = new Markdown({ - build: `${ROOT_DIR}/PLAYLISTS.md`, - template: `${README_DIR}/template.md` - }) - playlists.compile() -} - -main() +import { CategoriesTable, CountriesTable, LanguagesTable, RegionsTable } from '../../tables' +import { README_DIR, ROOT_DIR } from '../../constants' +import { Logger } from '@freearhey/core' +import { Markdown } from '../../core' +import { loadData } from '../../api' + +async function main() { + const logger = new Logger() + + logger.info('loading data from api...') + await loadData() + + logger.info('creating category table...') + await new CategoriesTable().create() + logger.info('creating language table...') + await new LanguagesTable().create() + logger.info('creating countires table...') + await new CountriesTable().create() + logger.info('creating region table...') + await new RegionsTable().create() + + logger.info('updating playlists.md...') + const playlists = new Markdown({ + build: `${ROOT_DIR}/PLAYLISTS.md`, + template: `${README_DIR}/template.md` + }) + playlists.compile() +} + +main() diff --git a/scripts/commands/report/create.ts b/scripts/commands/report/create.ts index 176681bd6e..e7c31704d9 100644 --- a/scripts/commands/report/create.ts +++ b/scripts/commands/report/create.ts @@ -1,178 +1,159 @@ -import { DataLoader, DataProcessor, IssueLoader, PlaylistParser } from '../../core' -import { Logger, Storage, Collection, Dictionary } from '@freearhey/core' -import { DataProcessorData } from '../../types/dataProcessor' -import { DATA_DIR, STREAMS_DIR } from '../../constants' -import { DataLoaderData } from '../../types/dataLoader' -import { Issue, Stream } from '../../models' -import { isURI } from '../../utils' - -async function main() { - const logger = new Logger() - const issueLoader = new IssueLoader() - let report = new Collection() - - logger.info('loading issues...') - const issues = await issueLoader.load() - - logger.info('loading data from api...') - const processor = new DataProcessor() - const dataStorage = new Storage(DATA_DIR) - const dataLoader = new DataLoader({ storage: dataStorage }) - const data: DataLoaderData = await dataLoader.load() - const { - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId, - blocklistRecordsGroupedByChannelId - }: DataProcessorData = processor.process(data) - - logger.info('loading streams...') - const streamsStorage = new Storage(STREAMS_DIR) - const parser = new PlaylistParser({ - storage: streamsStorage, - channelsKeyById, - feedsGroupedByChannelId, - logosGroupedByStreamId - }) - const files = await streamsStorage.list('**/*.m3u') - const streams = await parser.parse(files) - const streamsGroupedByUrl = streams.groupBy((stream: Stream) => stream.url) - const streamsGroupedByChannelId = streams.groupBy((stream: Stream) => stream.channelId) - const streamsGroupedById = streams.groupBy((stream: Stream) => stream.getId()) - - logger.info('checking streams:remove requests...') - const removeRequests = issues.filter(issue => - issue.labels.find((label: string) => label === 'streams:remove') - ) - removeRequests.forEach((issue: Issue) => { - const streamUrls = issue.data.getArray('streamUrl') || [] - - if (!streamUrls.length) { - const result = { - issueNumber: issue.number, - type: 'streams:remove', - streamId: undefined, - streamUrl: undefined, - status: 'missing_link' - } - - report.add(result) - } else { - for (const streamUrl of streamUrls) { - const result = { - issueNumber: issue.number, - type: 'streams:remove', - streamId: undefined, - streamUrl: truncate(streamUrl), - status: 'pending' - } - - if (streamsGroupedByUrl.missing(streamUrl)) { - result.status = 'wrong_link' - } - - report.add(result) - } - } - }) - - logger.info('checking streams:add requests...') - const addRequests = issues.filter(issue => issue.labels.includes('streams:add')) - const addRequestsBuffer = new Dictionary() - addRequests.forEach((issue: Issue) => { - const streamId = issue.data.getString('streamId') || '' - const streamUrl = issue.data.getString('streamUrl') || '' - const [channelId] = streamId.split('@') - - const result = { - issueNumber: issue.number, - type: 'streams:add', - streamId: streamId || undefined, - streamUrl: truncate(streamUrl), - status: 'pending' - } - - if (!channelId) result.status = 'missing_id' - else if (!streamUrl) result.status = 'missing_link' - else if (!isURI(streamUrl)) result.status = 'invalid_link' - else if (blocklistRecordsGroupedByChannelId.has(channelId)) result.status = 'blocked' - else if (channelsKeyById.missing(channelId)) result.status = 'wrong_id' - else if (streamsGroupedByUrl.has(streamUrl)) result.status = 'on_playlist' - else if (addRequestsBuffer.has(streamUrl)) result.status = 'duplicate' - else result.status = 'pending' - - addRequestsBuffer.set(streamUrl, true) - - report.add(result) - }) - - logger.info('checking streams:edit requests...') - const editRequests = issues.filter(issue => - issue.labels.find((label: string) => label === 'streams:edit') - ) - editRequests.forEach((issue: Issue) => { - const streamId = issue.data.getString('streamId') || '' - const streamUrl = issue.data.getString('streamUrl') || '' - const [channelId] = streamId.split('@') - - const result = { - issueNumber: issue.number, - type: 'streams:edit', - streamId: streamId || undefined, - streamUrl: truncate(streamUrl), - status: 'pending' - } - - if (!streamUrl) result.status = 'missing_link' - else if (streamsGroupedByUrl.missing(streamUrl)) result.status = 'invalid_link' - else if (channelId && channelsKeyById.missing(channelId)) result.status = 'invalid_id' - - report.add(result) - }) - - logger.info('checking channel search requests...') - const channelSearchRequests = issues.filter(issue => - issue.labels.find((label: string) => label === 'channel search') - ) - const channelSearchRequestsBuffer = new Dictionary() - channelSearchRequests.forEach((issue: Issue) => { - const streamId = issue.data.getString('channelId') || '' - const [channelId, feedId] = streamId.split('@') - - const result = { - issueNumber: issue.number, - type: 'channel search', - streamId: streamId || undefined, - streamUrl: undefined, - status: 'pending' - } - - if (!channelId) result.status = 'missing_id' - else if (channelsKeyById.missing(channelId)) result.status = 'invalid_id' - else if (channelSearchRequestsBuffer.has(streamId)) result.status = 'duplicate' - else if (blocklistRecordsGroupedByChannelId.has(channelId)) result.status = 'blocked' - else if (streamsGroupedById.has(streamId)) result.status = 'fulfilled' - else if (!feedId && streamsGroupedByChannelId.has(channelId)) result.status = 'fulfilled' - else { - const channelData = channelsKeyById.get(channelId) - if (channelData && channelData.isClosed) result.status = 'closed' - } - - channelSearchRequestsBuffer.set(streamId, true) - - report.add(result) - }) - - report = report.orderBy(item => item.issueNumber).filter(item => item.status !== 'pending') - - console.table(report.all()) -} - -main() - -function truncate(string: string, limit: number = 100) { - if (!string) return string - if (string.length < limit) return string - - return string.slice(0, limit) + '...' -} +import { Logger, Collection, Dictionary } from '@freearhey/core' +import { IssueLoader, PlaylistParser } from '../../core' +import { Storage } from '@freearhey/storage-js' +import { isURI, truncate } from '../../utils' +import { STREAMS_DIR } from '../../constants' +import { Issue, Stream } from '../../models' +import { data, loadData } from '../../api' + +async function main() { + const logger = new Logger() + const issueLoader = new IssueLoader() + let report = new Collection() + + logger.info('loading issues...') + const issues = await issueLoader.load() + + logger.info('loading data from api...') + await loadData() + + logger.info('loading streams...') + const streamsStorage = new Storage(STREAMS_DIR) + const parser = new PlaylistParser({ + storage: streamsStorage + }) + const files = await streamsStorage.list('**/*.m3u') + const streams = await parser.parse(files) + const streamsGroupedByUrl = streams.groupBy((stream: Stream) => stream.url) + const streamsGroupedByChannel = streams.groupBy((stream: Stream) => stream.channel) + const streamsGroupedById = streams.groupBy((stream: Stream) => stream.getId()) + + logger.info('checking streams:remove requests...') + const removeRequests = issues.filter(issue => + issue.labels.find((label: string) => label === 'streams:remove') + ) + removeRequests.forEach((issue: Issue) => { + const streamUrls = issue.data.getArray('streamUrl') || [] + + if (!streamUrls.length) { + const result = { + issueNumber: issue.number, + type: 'streams:remove', + streamId: undefined, + streamUrl: undefined, + status: 'missing_link' + } + + report.add(result) + } else { + for (const streamUrl of streamUrls) { + const result = { + issueNumber: issue.number, + type: 'streams:remove', + streamId: undefined, + streamUrl: truncate(streamUrl), + status: 'pending' + } + + if (streamsGroupedByUrl.missing(streamUrl)) { + result.status = 'wrong_link' + } + + report.add(result) + } + } + }) + + logger.info('checking streams:add requests...') + const addRequests = issues.filter(issue => issue.labels.includes('streams:add')) + const addRequestsBuffer = new Dictionary() + addRequests.forEach((issue: Issue) => { + const streamId = issue.data.getString('streamId') || '' + const streamUrl = issue.data.getString('streamUrl') || '' + const [channelId] = streamId.split('@') + + const result = { + issueNumber: issue.number, + type: 'streams:add', + streamId: streamId || undefined, + streamUrl: truncate(streamUrl), + status: 'pending' + } + + if (!channelId) result.status = 'missing_id' + else if (!streamUrl) result.status = 'missing_link' + else if (!isURI(streamUrl)) result.status = 'invalid_link' + else if (data.blocklistRecordsGroupedByChannel.has(channelId)) result.status = 'blocked' + else if (data.channelsKeyById.missing(channelId)) result.status = 'wrong_id' + else if (streamsGroupedByUrl.has(streamUrl)) result.status = 'on_playlist' + else if (addRequestsBuffer.has(streamUrl)) result.status = 'duplicate' + else result.status = 'pending' + + addRequestsBuffer.set(streamUrl, true) + + report.add(result) + }) + + logger.info('checking streams:edit requests...') + const editRequests = issues.filter(issue => + issue.labels.find((label: string) => label === 'streams:edit') + ) + editRequests.forEach((issue: Issue) => { + const streamId = issue.data.getString('streamId') || '' + const streamUrl = issue.data.getString('streamUrl') || '' + const [channelId] = streamId.split('@') + + const result = { + issueNumber: issue.number, + type: 'streams:edit', + streamId: streamId || undefined, + streamUrl: truncate(streamUrl), + status: 'pending' + } + + if (!streamUrl) result.status = 'missing_link' + else if (streamsGroupedByUrl.missing(streamUrl)) result.status = 'invalid_link' + else if (channelId && data.channelsKeyById.missing(channelId)) result.status = 'invalid_id' + + report.add(result) + }) + + logger.info('checking channel search requests...') + const channelSearchRequests = issues.filter(issue => + issue.labels.find((label: string) => label === 'channel search') + ) + const channelSearchRequestsBuffer = new Dictionary() + channelSearchRequests.forEach((issue: Issue) => { + const streamId = issue.data.getString('channelId') || '' + const [channelId, feedId] = streamId.split('@') + + const result = { + issueNumber: issue.number, + type: 'channel search', + streamId: streamId || undefined, + streamUrl: undefined, + status: 'pending' + } + + if (!channelId) result.status = 'missing_id' + else if (data.channelsKeyById.missing(channelId)) result.status = 'invalid_id' + else if (channelSearchRequestsBuffer.has(streamId)) result.status = 'duplicate' + else if (data.blocklistRecordsGroupedByChannel.has(channelId)) result.status = 'blocked' + else if (streamsGroupedById.has(streamId)) result.status = 'fulfilled' + else if (!feedId && streamsGroupedByChannel.has(channelId)) result.status = 'fulfilled' + else { + const channelData = data.channelsKeyById.get(channelId) + if (channelData && channelData.isClosed()) result.status = 'closed' + } + + channelSearchRequestsBuffer.set(streamId, true) + + report.add(result) + }) + + report = report.sortBy(item => item.issueNumber).filter(item => item.status !== 'pending') + + console.table(report.all()) +} + +main() diff --git a/scripts/core/apiClient.ts b/scripts/core/apiClient.ts deleted file mode 100644 index e4815a81aa..0000000000 --- a/scripts/core/apiClient.ts +++ /dev/null @@ -1,16 +0,0 @@ -import axios, { AxiosInstance, AxiosResponse, AxiosRequestConfig } from 'axios' - -export class ApiClient { - instance: AxiosInstance - - constructor() { - this.instance = axios.create({ - baseURL: 'https://iptv-org.github.io/api', - responseType: 'stream' - }) - } - - get(url: string, options: AxiosRequestConfig): Promise { - return this.instance.get(url, options) - } -} diff --git a/scripts/core/cliTable.ts b/scripts/core/cliTable.ts index 61d9e608e6..bf8e20b81e 100644 --- a/scripts/core/cliTable.ts +++ b/scripts/core/cliTable.ts @@ -1,22 +1,22 @@ -import { Table } from 'console-table-printer' -import { ComplexOptions } from 'console-table-printer/dist/src/models/external-table' - -export class CliTable { - table: Table - - constructor(options?: ComplexOptions | string[]) { - this.table = new Table(options) - } - - append(row) { - this.table.addRow(row) - } - - render() { - this.table.printTable() - } - - toString() { - return this.table.render() - } -} +import { ComplexOptions } from 'console-table-printer/dist/src/models/external-table' +import { Table } from 'console-table-printer' + +export class CliTable { + table: Table + + constructor(options?: ComplexOptions | string[]) { + this.table = new Table(options) + } + + append(row) { + this.table.addRow(row) + } + + render() { + this.table.printTable() + } + + toString() { + return this.table.render() + } +} diff --git a/scripts/core/dataLoader.ts b/scripts/core/dataLoader.ts deleted file mode 100644 index 89b45c00c0..0000000000 --- a/scripts/core/dataLoader.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { ApiClient } from './apiClient' -import { Storage } from '@freearhey/core' -import cliProgress, { MultiBar } from 'cli-progress' -import type { DataLoaderProps, DataLoaderData } from '../types/dataLoader' - -const formatBytes = (bytes: number) => { - if (bytes === 0) return '0 B' - const k = 1024 - const sizes = ['B', 'KB', 'MB', 'GB'] - const i = Math.floor(Math.log(bytes) / Math.log(k)) - return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i] -} - -export class DataLoader { - client: ApiClient - storage: Storage - progressBar: MultiBar - - constructor(props: DataLoaderProps) { - this.client = new ApiClient() - this.storage = props.storage - this.progressBar = new cliProgress.MultiBar({ - stopOnComplete: true, - hideCursor: true, - forceRedraw: true, - barsize: 36, - format(options, params, payload) { - const filename = payload.filename.padEnd(18, ' ') - const barsize = options.barsize || 40 - const percent = (params.progress * 100).toFixed(2) - const speed = payload.speed ? formatBytes(payload.speed) + '/s' : 'N/A' - const total = formatBytes(params.total) - const completeSize = Math.round(params.progress * barsize) - const incompleteSize = barsize - completeSize - const bar = - options.barCompleteString && options.barIncompleteString - ? options.barCompleteString.substr(0, completeSize) + - options.barGlue + - options.barIncompleteString.substr(0, incompleteSize) - : '-'.repeat(barsize) - - return `${filename} [${bar}] ${percent}% | ETA: ${params.eta}s | ${total} | ${speed}` - } - }) - } - - async load(): Promise { - const [ - countries, - regions, - subdivisions, - languages, - categories, - blocklist, - channels, - feeds, - logos, - timezones, - guides, - streams, - cities - ] = await Promise.all([ - this.storage.json('countries.json'), - this.storage.json('regions.json'), - this.storage.json('subdivisions.json'), - this.storage.json('languages.json'), - this.storage.json('categories.json'), - this.storage.json('blocklist.json'), - this.storage.json('channels.json'), - this.storage.json('feeds.json'), - this.storage.json('logos.json'), - this.storage.json('timezones.json'), - this.storage.json('guides.json'), - this.storage.json('streams.json'), - this.storage.json('cities.json') - ]) - - return { - countries, - regions, - subdivisions, - languages, - categories, - blocklist, - channels, - feeds, - logos, - timezones, - guides, - streams, - cities - } - } - - async download(filename: string) { - if (!this.storage || !this.progressBar) return - - const stream = await this.storage.createStream(filename) - const progressBar = this.progressBar.create(0, 0, { filename }) - - this.client - .get(filename, { - responseType: 'stream', - onDownloadProgress({ total, loaded, rate }) { - if (total) progressBar.setTotal(total) - progressBar.update(loaded, { speed: rate }) - } - }) - .then(response => { - response.data.pipe(stream) - }) - } -} diff --git a/scripts/core/dataProcessor.ts b/scripts/core/dataProcessor.ts deleted file mode 100644 index e7fd94dd5d..0000000000 --- a/scripts/core/dataProcessor.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { DataProcessorData } from '../types/dataProcessor' -import { DataLoaderData } from '../types/dataLoader' -import { Collection } from '@freearhey/core' -import { - BlocklistRecord, - Subdivision, - Category, - Language, - Timezone, - Channel, - Country, - Region, - Stream, - Guide, - City, - Feed, - Logo -} from '../models' - -export class DataProcessor { - process(data: DataLoaderData): DataProcessorData { - let regions = new Collection(data.regions).map(data => new Region(data)) - let regionsKeyByCode = regions.keyBy((region: Region) => region.code) - - const categories = new Collection(data.categories).map(data => new Category(data)) - const categoriesKeyById = categories.keyBy((category: Category) => category.id) - - const languages = new Collection(data.languages).map(data => new Language(data)) - const languagesKeyByCode = languages.keyBy((language: Language) => language.code) - - let subdivisions = new Collection(data.subdivisions).map(data => new Subdivision(data)) - let subdivisionsKeyByCode = subdivisions.keyBy((subdivision: Subdivision) => subdivision.code) - let subdivisionsGroupedByCountryCode = subdivisions.groupBy( - (subdivision: Subdivision) => subdivision.countryCode - ) - - let countries = new Collection(data.countries).map(data => new Country(data)) - let countriesKeyByCode = countries.keyBy((country: Country) => country.code) - - const cities = new Collection(data.cities).map(data => - new City(data) - .withRegions(regions) - .withCountry(countriesKeyByCode) - .withSubdivision(subdivisionsKeyByCode) - ) - const citiesKeyByCode = cities.keyBy((city: City) => city.code) - const citiesGroupedByCountryCode = cities.groupBy((city: City) => city.countryCode) - const citiesGroupedBySubdivisionCode = cities.groupBy((city: City) => city.subdivisionCode) - - const timezones = new Collection(data.timezones).map(data => - new Timezone(data).withCountries(countriesKeyByCode) - ) - const timezonesKeyById = timezones.keyBy((timezone: Timezone) => timezone.id) - - const blocklistRecords = new Collection(data.blocklist).map(data => new BlocklistRecord(data)) - const blocklistRecordsGroupedByChannelId = blocklistRecords.groupBy( - (blocklistRecord: BlocklistRecord) => blocklistRecord.channelId - ) - - let channels = new Collection(data.channels).map(data => new Channel(data)) - let channelsKeyById = channels.keyBy((channel: Channel) => channel.id) - - let feeds = new Collection(data.feeds).map(data => new Feed(data)) - let feedsGroupedByChannelId = feeds.groupBy((feed: Feed) => feed.channelId) - let feedsGroupedById = feeds.groupBy((feed: Feed) => feed.id) - - const logos = new Collection(data.logos).map(data => new Logo(data).withFeed(feedsGroupedById)) - const logosGroupedByChannelId = logos.groupBy((logo: Logo) => logo.channelId) - const logosGroupedByStreamId = logos.groupBy((logo: Logo) => logo.getStreamId()) - - const streams = new Collection(data.streams).map(data => - new Stream(data).withLogos(logosGroupedByStreamId) - ) - const streamsGroupedById = streams.groupBy((stream: Stream) => stream.getId()) - - const guides = new Collection(data.guides).map(data => new Guide(data)) - const guidesGroupedByStreamId = guides.groupBy((guide: Guide) => guide.getStreamId()) - - regions = regions.map((region: Region) => - region - .withCountries(countriesKeyByCode) - .withRegions(regions) - .withSubdivisions(subdivisions) - .withCities(cities) - ) - regionsKeyByCode = regions.keyBy((region: Region) => region.code) - - countries = countries.map((country: Country) => - country - .withCities(citiesGroupedByCountryCode) - .withSubdivisions(subdivisionsGroupedByCountryCode) - .withRegions(regions) - .withLanguage(languagesKeyByCode) - ) - countriesKeyByCode = countries.keyBy((country: Country) => country.code) - - subdivisions = subdivisions.map((subdivision: Subdivision) => - subdivision - .withCities(citiesGroupedBySubdivisionCode) - .withCountry(countriesKeyByCode) - .withRegions(regions) - .withParent(subdivisionsKeyByCode) - ) - subdivisionsKeyByCode = subdivisions.keyBy((subdivision: Subdivision) => subdivision.code) - subdivisionsGroupedByCountryCode = subdivisions.groupBy( - (subdivision: Subdivision) => subdivision.countryCode - ) - - channels = channels.map((channel: Channel) => - channel - .withFeeds(feedsGroupedByChannelId) - .withLogos(logosGroupedByChannelId) - .withCategories(categoriesKeyById) - .withCountry(countriesKeyByCode) - .withSubdivision(subdivisionsKeyByCode) - .withCategories(categoriesKeyById) - ) - channelsKeyById = channels.keyBy((channel: Channel) => channel.id) - - feeds = feeds.map((feed: Feed) => - feed - .withChannel(channelsKeyById) - .withLanguages(languagesKeyByCode) - .withTimezones(timezonesKeyById) - .withBroadcastArea( - citiesKeyByCode, - subdivisionsKeyByCode, - countriesKeyByCode, - regionsKeyByCode - ) - ) - feedsGroupedByChannelId = feeds.groupBy((feed: Feed) => feed.channelId) - feedsGroupedById = feeds.groupBy((feed: Feed) => feed.id) - - return { - blocklistRecordsGroupedByChannelId, - subdivisionsGroupedByCountryCode, - feedsGroupedByChannelId, - guidesGroupedByStreamId, - logosGroupedByStreamId, - subdivisionsKeyByCode, - countriesKeyByCode, - languagesKeyByCode, - streamsGroupedById, - categoriesKeyById, - timezonesKeyById, - regionsKeyByCode, - blocklistRecords, - channelsKeyById, - citiesKeyByCode, - subdivisions, - categories, - countries, - languages, - timezones, - channels, - regions, - streams, - cities, - guides, - feeds, - logos - } - } -} diff --git a/scripts/core/htmlTable.ts b/scripts/core/htmlTable.ts index b4f7b42ac6..f90dd4b913 100644 --- a/scripts/core/htmlTable.ts +++ b/scripts/core/htmlTable.ts @@ -1,46 +1,50 @@ -type Column = { - name: string - nowrap?: boolean - align?: string -} - -type DataItem = string[] - -export class HTMLTable { - data: DataItem[] - columns: Column[] - - constructor(data: DataItem[], columns: Column[]) { - this.data = data - this.columns = columns - } - - toString() { - let output = '\r\n' - - output += ' \r\n ' - for (const column of this.columns) { - output += `` - } - output += '\r\n \r\n' - - output += ' \r\n' - for (const item of this.data) { - output += ' ' - let i = 0 - for (const prop in item) { - const column = this.columns[i] - const nowrap = column.nowrap ? ' nowrap' : '' - const align = column.align ? ` align="${column.align}"` : '' - output += `${item[prop]}` - i++ - } - output += '\r\n' - } - output += ' \r\n' - - output += '
${column.name}
' - - return output - } -} +import { Collection } from '@freearhey/core' + +export type HTMLTableColumn = { + name: string + nowrap?: boolean + align?: string +} + +export type HTMLTableItem = string[] + +export class HTMLTable { + data: Collection + columns: Collection + + constructor(data: Collection, columns: Collection) { + this.data = data + this.columns = columns + } + + toString() { + let output = '\r\n' + + output += ' \r\n ' + this.columns.forEach((column: HTMLTableColumn) => { + output += `` + }) + + output += '\r\n \r\n' + + output += ' \r\n' + this.data.forEach((item: HTMLTableItem) => { + output += ' ' + let i = 0 + for (const prop in item) { + const column = this.columns.all()[i] + const nowrap = column.nowrap ? ' nowrap' : '' + const align = column.align ? ` align="${column.align}"` : '' + output += `${item[prop]}` + i++ + } + output += '\r\n' + }) + + output += ' \r\n' + + output += '
${column.name}
' + + return output + } +} diff --git a/scripts/core/index.ts b/scripts/core/index.ts index 2e24771bf0..850b9d9cfb 100644 --- a/scripts/core/index.ts +++ b/scripts/core/index.ts @@ -1,14 +1,11 @@ -export * from './apiClient' -export * from './cliTable' -export * from './dataProcessor' -export * from './dataLoader' -export * from './htmlTable' -export * from './issueData' -export * from './issueLoader' -export * from './issueParser' -export * from './logParser' -export * from './markdown' -export * from './numberParser' -export * from './playlistParser' -export * from './proxyParser' -export * from './streamTester' +export * from './cliTable' +export * from './htmlTable' +export * from './issueData' +export * from './issueLoader' +export * from './issueParser' +export * from './logParser' +export * from './markdown' +export * from './numberParser' +export * from './playlistParser' +export * from './proxyParser' +export * from './streamTester' diff --git a/scripts/core/issueData.ts b/scripts/core/issueData.ts index e185e1b02f..a38209250a 100644 --- a/scripts/core/issueData.ts +++ b/scripts/core/issueData.ts @@ -1,34 +1,36 @@ -import { Dictionary } from '@freearhey/core' - -export class IssueData { - _data: Dictionary - constructor(data: Dictionary) { - this._data = data - } - - has(key: string): boolean { - return this._data.has(key) - } - - missing(key: string): boolean { - return this._data.missing(key) || this._data.get(key) === undefined - } - - getBoolean(key: string): boolean { - return Boolean(this._data.get(key)) - } - - getString(key: string): string | undefined { - const deleteSymbol = '~' - - return this._data.get(key) === deleteSymbol ? '' : this._data.get(key) - } - - getArray(key: string): string[] | undefined { - const deleteSymbol = '~' - - if (this._data.missing(key)) return undefined - - return this._data.get(key) === deleteSymbol ? [] : this._data.get(key).split('\r\n') - } -} +import { Dictionary } from '@freearhey/core' + +export class IssueData { + _data: Dictionary + constructor(data: Dictionary) { + this._data = data + } + + has(key: string): boolean { + return this._data.has(key) + } + + missing(key: string): boolean { + return this._data.missing(key) || this._data.get(key) === undefined + } + + getBoolean(key: string): boolean { + return Boolean(this._data.get(key)) + } + + getString(key: string): string | undefined { + const deleteSymbol = '~' + + return this._data.get(key) === deleteSymbol ? '' : this._data.get(key) + } + + getArray(key: string): string[] | undefined { + const deleteSymbol = '~' + + if (this._data.missing(key)) return undefined + + const value = this._data.get(key) + + return !value || value === deleteSymbol ? [] : value.split('\r\n') + } +} diff --git a/scripts/core/issueLoader.ts b/scripts/core/issueLoader.ts index e9102f25a1..43fb2185b6 100644 --- a/scripts/core/issueLoader.ts +++ b/scripts/core/issueLoader.ts @@ -1,37 +1,37 @@ -import { Collection } from '@freearhey/core' -import { restEndpointMethods } from '@octokit/plugin-rest-endpoint-methods' -import { paginateRest } from '@octokit/plugin-paginate-rest' -import { Octokit } from '@octokit/core' -import { IssueParser } from './' -import { TESTING, OWNER, REPO } from '../constants' - -const CustomOctokit = Octokit.plugin(paginateRest, restEndpointMethods) -const octokit = new CustomOctokit() - -export class IssueLoader { - async load(props?: { labels: string | string[] }) { - let labels = '' - if (props && props.labels) { - labels = Array.isArray(props.labels) ? props.labels.join(',') : props.labels - } - let issues: object[] = [] - if (TESTING) { - issues = (await import('../../tests/__data__/input/issues.js')).default - } else { - issues = await octokit.paginate(octokit.rest.issues.listForRepo, { - owner: OWNER, - repo: REPO, - per_page: 100, - labels, - status: 'open', - headers: { - 'X-GitHub-Api-Version': '2022-11-28' - } - }) - } - - const parser = new IssueParser() - - return new Collection(issues).map(parser.parse) - } -} +import { restEndpointMethods } from '@octokit/plugin-rest-endpoint-methods' +import { paginateRest } from '@octokit/plugin-paginate-rest' +import { TESTING, OWNER, REPO } from '../constants' +import { Collection } from '@freearhey/core' +import { Octokit } from '@octokit/core' +import { IssueParser } from './' + +const CustomOctokit = Octokit.plugin(paginateRest, restEndpointMethods) +const octokit = new CustomOctokit() + +export class IssueLoader { + async load(props?: { labels: string | string[] }) { + let labels = '' + if (props && props.labels) { + labels = Array.isArray(props.labels) ? props.labels.join(',') : props.labels + } + let issues: object[] = [] + if (TESTING) { + issues = (await import('../../tests/__data__/input/issues.js')).default + } else { + issues = await octokit.paginate(octokit.rest.issues.listForRepo, { + owner: OWNER, + repo: REPO, + per_page: 100, + labels, + status: 'open', + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + } + + const parser = new IssueParser() + + return new Collection(issues).map(parser.parse) + } +} diff --git a/scripts/core/issueParser.ts b/scripts/core/issueParser.ts index b5feeaec80..ad488e6c5d 100644 --- a/scripts/core/issueParser.ts +++ b/scripts/core/issueParser.ts @@ -1,48 +1,48 @@ -import { Dictionary } from '@freearhey/core' -import { Issue } from '../models' -import { IssueData } from './issueData' - -const FIELDS = new Dictionary({ - 'Stream ID': 'streamId', - 'Channel ID': 'channelId', - 'Feed ID': 'feedId', - 'Stream URL': 'streamUrl', - 'New Stream URL': 'newStreamUrl', - Label: 'label', - Quality: 'quality', - 'HTTP User-Agent': 'httpUserAgent', - 'HTTP User Agent': 'httpUserAgent', - 'HTTP Referrer': 'httpReferrer', - 'What happened to the stream?': 'reason', - Reason: 'reason', - Notes: 'notes', - Directives: 'directives' -}) - -export class IssueParser { - parse(issue: { number: number; body: string; labels: { name: string }[] }): Issue { - const fields = typeof issue.body === 'string' ? issue.body.split('###') : [] - - const data = new Dictionary() - fields.forEach((field: string) => { - const parsed = typeof field === 'string' ? field.split(/\r?\n/).filter(Boolean) : [] - let _label = parsed.shift() - _label = _label ? _label.replace(/ \(optional\)| \(required\)/, '').trim() : '' - let _value = parsed.join('\r\n') - _value = _value ? _value.trim() : '' - - if (!_label || !_value) return data - - const id: string = FIELDS.get(_label) - const value: string = _value === '_No response_' || _value === 'None' ? '' : _value - - if (!id) return - - data.set(id, value) - }) - - const labels = issue.labels.map(label => label.name) - - return new Issue({ number: issue.number, labels, data: new IssueData(data) }) - } -} +import { Dictionary } from '@freearhey/core' +import { IssueData } from './issueData' +import { Issue } from '../models' + +const FIELDS = new Dictionary({ + 'Stream ID': 'streamId', + 'Channel ID': 'channelId', + 'Feed ID': 'feedId', + 'Stream URL': 'streamUrl', + 'New Stream URL': 'newStreamUrl', + Label: 'label', + Quality: 'quality', + 'HTTP User-Agent': 'httpUserAgent', + 'HTTP User Agent': 'httpUserAgent', + 'HTTP Referrer': 'httpReferrer', + 'What happened to the stream?': 'reason', + Reason: 'reason', + Notes: 'notes', + Directives: 'directives' +}) + +export class IssueParser { + parse(issue: { number: number; body: string; labels: { name: string }[] }): Issue { + const fields = typeof issue.body === 'string' ? issue.body.split('###') : [] + + const data = new Dictionary() + fields.forEach((field: string) => { + const parsed = typeof field === 'string' ? field.split(/\r?\n/).filter(Boolean) : [] + let _label = parsed.shift() + _label = _label ? _label.replace(/ \(optional\)| \(required\)/, '').trim() : '' + let _value = parsed.join('\r\n') + _value = _value ? _value.trim() : '' + + if (!_label || !_value) return data + + const id = FIELDS.get(_label) + const value: string = _value === '_No response_' || _value === 'None' ? '' : _value + + if (!id) return + + data.set(id, value) + }) + + const labels = issue.labels.map(label => label.name) + + return new Issue({ number: issue.number, labels, data: new IssueData(data) }) + } +} diff --git a/scripts/core/markdown.ts b/scripts/core/markdown.ts index e229999409..25e15095ec 100644 --- a/scripts/core/markdown.ts +++ b/scripts/core/markdown.ts @@ -1,45 +1,45 @@ -import fs from 'fs' -import path from 'path' - -type MarkdownConfig = { - build: string - template: string -} - -export class Markdown { - build: string - template: string - - constructor(config: MarkdownConfig) { - this.build = config.build - this.template = config.template - } - - compile() { - const workingDir = process.cwd() - - const templatePath = path.resolve(workingDir, this.template) - const template = fs.readFileSync(templatePath, 'utf8') - const processedContent = this.processIncludes(template, workingDir) - - if (this.build) { - const outputPath = path.resolve(workingDir, this.build) - fs.writeFileSync(outputPath, processedContent, 'utf8') - } - } - - private processIncludes(template: string, baseDir: string): string { - const includeRegex = /#include\s+"([^"]+)"/g - - return template.replace(includeRegex, (match, includePath) => { - try { - const fullPath = path.resolve(baseDir, includePath) - const includeContent = fs.readFileSync(fullPath, 'utf8') - return this.processIncludes(includeContent, baseDir) - } catch (error) { - console.warn(`Warning: Could not include file ${includePath}: ${error}`) - return match - } - }) - } -} +import path from 'path' +import fs from 'fs' + +type MarkdownConfig = { + build: string + template: string +} + +export class Markdown { + build: string + template: string + + constructor(config: MarkdownConfig) { + this.build = config.build + this.template = config.template + } + + compile() { + const workingDir = process.cwd() + + const templatePath = path.resolve(workingDir, this.template) + const template = fs.readFileSync(templatePath, 'utf8') + const processedContent = this.processIncludes(template, workingDir) + + if (this.build) { + const outputPath = path.resolve(workingDir, this.build) + fs.writeFileSync(outputPath, processedContent, 'utf8') + } + } + + private processIncludes(template: string, baseDir: string): string { + const includeRegex = /#include\s+"([^"]+)"/g + + return template.replace(includeRegex, (match, includePath) => { + try { + const fullPath = path.resolve(baseDir, includePath) + const includeContent = fs.readFileSync(fullPath, 'utf8') + return this.processIncludes(includeContent, baseDir) + } catch (error) { + console.warn(`Warning: Could not include file ${includePath}: ${error}`) + return match + } + }) + } +} diff --git a/scripts/core/playlistParser.ts b/scripts/core/playlistParser.ts index 2086bb568e..08b2542ff9 100644 --- a/scripts/core/playlistParser.ts +++ b/scripts/core/playlistParser.ts @@ -1,60 +1,43 @@ -import { Collection, Storage, Dictionary } from '@freearhey/core' -import parser from 'iptv-playlist-parser' -import { Stream } from '../models' - -type PlaylistPareserProps = { - storage: Storage - feedsGroupedByChannelId: Dictionary - logosGroupedByStreamId: Dictionary - channelsKeyById: Dictionary -} - -export class PlaylistParser { - storage: Storage - feedsGroupedByChannelId: Dictionary - logosGroupedByStreamId: Dictionary - channelsKeyById: Dictionary - - constructor({ - storage, - feedsGroupedByChannelId, - logosGroupedByStreamId, - channelsKeyById - }: PlaylistPareserProps) { - this.storage = storage - this.feedsGroupedByChannelId = feedsGroupedByChannelId - this.logosGroupedByStreamId = logosGroupedByStreamId - this.channelsKeyById = channelsKeyById - } - - async parse(files: string[]): Promise { - let streams = new Collection() - - for (const filepath of files) { - if (!this.storage.existsSync(filepath)) continue - - const _streams: Collection = await this.parseFile(filepath) - streams = streams.concat(_streams) - } - - return streams - } - - async parseFile(filepath: string): Promise { - const content = await this.storage.load(filepath) - const parsed: parser.Playlist = parser.parse(content) - - const streams = new Collection(parsed.items).map((data: parser.PlaylistItem) => { - const stream = new Stream() - .fromPlaylistItem(data) - .withFeed(this.feedsGroupedByChannelId) - .withChannel(this.channelsKeyById) - .withLogos(this.logosGroupedByStreamId) - .setFilepath(filepath) - - return stream - }) - - return streams - } -} +import { Storage } from '@freearhey/storage-js' +import { Collection } from '@freearhey/core' +import parser from 'iptv-playlist-parser' +import { Stream } from '../models' + +type PlaylistPareserProps = { + storage: Storage +} + +export class PlaylistParser { + storage: Storage + + constructor({ storage }: PlaylistPareserProps) { + this.storage = storage + } + + async parse(files: string[]): Promise> { + const parsed = new Collection() + + for (const filepath of files) { + if (!this.storage.existsSync(filepath)) continue + const _parsed: Collection = await this.parseFile(filepath) + parsed.concat(_parsed) + } + + return parsed + } + + async parseFile(filepath: string): Promise> { + const content = await this.storage.load(filepath) + const parsed: parser.Playlist = parser.parse(content) + + const streams = new Collection() + parsed.items.forEach((data: parser.PlaylistItem) => { + const stream = Stream.fromPlaylistItem(data) + stream.filepath = filepath + + streams.add(stream) + }) + + return streams + } +} diff --git a/scripts/core/streamTester.ts b/scripts/core/streamTester.ts index d5a4f5f591..acb38edc9c 100644 --- a/scripts/core/streamTester.ts +++ b/scripts/core/streamTester.ts @@ -1,117 +1,125 @@ -import { Stream } from '../models' -import { TESTING } from '../constants' -import mediaInfoFactory from 'mediainfo.js' -import axios, { AxiosInstance, AxiosProxyConfig, AxiosRequestConfig } from 'axios' -import { ProxyParser } from './proxyParser.js' -import { OptionValues } from 'commander' -import { SocksProxyAgent } from 'socks-proxy-agent' - -export type TestResult = { - status: { - ok: boolean - code: string - } -} - -export type StreamTesterProps = { - options: OptionValues -} - -export class StreamTester { - client: AxiosInstance - options: OptionValues - - constructor({ options }: StreamTesterProps) { - const proxyParser = new ProxyParser() - let request: AxiosRequestConfig = { - responseType: 'arraybuffer' - } - - if (options.proxy !== undefined) { - const proxy = proxyParser.parse(options.proxy) as AxiosProxyConfig - - if ( - proxy.protocol && - ['socks', 'socks5', 'socks5h', 'socks4', 'socks4a'].includes(String(proxy.protocol)) - ) { - const socksProxyAgent = new SocksProxyAgent(options.proxy) - - request = { ...request, ...{ httpAgent: socksProxyAgent, httpsAgent: socksProxyAgent } } - } else { - request = { ...request, ...{ proxy } } - } - } - - this.client = axios.create(request) - this.options = options - } - - async test(stream: Stream): Promise { - if (TESTING) { - const results = (await import('../../tests/__data__/input/playlist_test/results.js')).default - - return results[stream.url as keyof typeof results] - } else { - try { - const res = await this.client(stream.url, { - signal: AbortSignal.timeout(this.options.timeout), - headers: { - 'User-Agent': stream.getUserAgent() || 'Mozilla/5.0', - Referer: stream.getReferrer() - } - }) - - const mediainfo = await mediaInfoFactory({ format: 'object' }) - const buffer = await res.data - const result = await mediainfo.analyzeData( - () => buffer.byteLength, - (size: any, offset: number | undefined) => - Buffer.from(buffer).subarray(offset, offset + size) - ) - - if (result && result.media && result.media.track.length > 0) { - return { - status: { - ok: true, - code: 'OK' - } - } - } else { - return { - status: { - ok: false, - code: 'NO_VIDEO' - } - } - } - } catch (error: any) { - let code = 'UNKNOWN_ERROR' - if (error.name === 'CanceledError') { - code = 'TIMEOUT' - } else if (error.name === 'AxiosError') { - if (error.response) { - const status = error.response?.status - const statusText = error.response?.statusText.toUpperCase().replace(/\s+/, '_') - code = `HTTP_${status}_${statusText}` - } else { - code = `AXIOS_${error.code}` - } - } else if (error.cause) { - const cause = error.cause as Error & { code?: string } - if (cause.code) { - code = cause.code - } else { - code = cause.name - } - } - - return { - status: { - ok: false, - code - } - } - } - } - } -} +import axios, { AxiosInstance, AxiosProxyConfig, AxiosRequestConfig, AxiosResponse } from 'axios' +import { SocksProxyAgent } from 'socks-proxy-agent' +import { ProxyParser } from './proxyParser.js' +import mediaInfoFactory from 'mediainfo.js' +import { OptionValues } from 'commander' +import { TESTING } from '../constants' +import { Stream } from '../models' + +export type StreamTesterResult = { + status: { + ok: boolean + code: string + } +} + +export type StreamTesterError = { + name: string + code?: string + cause?: Error & { code?: string } + response?: AxiosResponse +} + +export type StreamTesterProps = { + options: OptionValues +} + +export class StreamTester { + client: AxiosInstance + options: OptionValues + + constructor({ options }: StreamTesterProps) { + const proxyParser = new ProxyParser() + let request: AxiosRequestConfig = { + responseType: 'arraybuffer' + } + + if (options.proxy !== undefined) { + const proxy = proxyParser.parse(options.proxy) as AxiosProxyConfig + + if ( + proxy.protocol && + ['socks', 'socks5', 'socks5h', 'socks4', 'socks4a'].includes(String(proxy.protocol)) + ) { + const socksProxyAgent = new SocksProxyAgent(options.proxy) + + request = { ...request, ...{ httpAgent: socksProxyAgent, httpsAgent: socksProxyAgent } } + } else { + request = { ...request, ...{ proxy } } + } + } + + this.client = axios.create(request) + this.options = options + } + + async test(stream: Stream): Promise { + if (TESTING) { + const results = (await import('../../tests/__data__/input/playlist_test/results.js')).default + + return results[stream.url as keyof typeof results] + } else { + try { + const res = await this.client(stream.url, { + signal: AbortSignal.timeout(this.options.timeout), + headers: { + 'User-Agent': stream.user_agent || 'Mozilla/5.0', + Referer: stream.referrer + } + }) + + const mediainfo = await mediaInfoFactory({ format: 'object' }) + const buffer = await res.data + const result = await mediainfo.analyzeData( + () => buffer.byteLength, + (size: number, offset: number) => Buffer.from(buffer).subarray(offset, offset + size) + ) + + if (result && result.media && result.media.track.length > 0) { + return { + status: { + ok: true, + code: 'OK' + } + } + } else { + return { + status: { + ok: false, + code: 'NO_VIDEO' + } + } + } + } catch (err: unknown) { + const error = err as StreamTesterError + + let code = 'UNKNOWN_ERROR' + if (error.name === 'CanceledError') { + code = 'TIMEOUT' + } else if (error.name === 'AxiosError') { + if (error.response) { + const status = error.response?.status + const statusText = error.response?.statusText.toUpperCase().replace(/\s+/, '_') + code = `HTTP_${status}_${statusText}` + } else { + code = `AXIOS_${error.code}` + } + } else if (error.cause) { + const cause = error.cause + if (cause.code) { + code = cause.code + } else { + code = cause.name + } + } + + return { + status: { + ok: false, + code + } + } + } + } + } +} diff --git a/scripts/generators/categoriesGenerator.ts b/scripts/generators/categoriesGenerator.ts index 83eb4b5255..d42719392e 100644 --- a/scripts/generators/categoriesGenerator.ts +++ b/scripts/generators/categoriesGenerator.ts @@ -1,54 +1,60 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Stream, Category, Playlist } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type CategoriesGeneratorProps = { - streams: Collection - categories: Collection - logFile: File -} - -export class CategoriesGenerator implements Generator { - streams: Collection - categories: Collection - storage: Storage - logFile: File - - constructor({ streams, categories, logFile }: CategoriesGeneratorProps) { - this.streams = streams.clone() - this.categories = categories - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate() { - const streams = this.streams.orderBy([(stream: Stream) => stream.getTitle()]) - - this.categories.forEach(async (category: Category) => { - const categoryStreams = streams - .filter((stream: Stream) => stream.hasCategory(category)) - .map((stream: Stream) => { - const groupTitle = stream.getCategoryNames().join(';') - if (groupTitle) stream.groupTitle = groupTitle - - return stream - }) - - const playlist = new Playlist(categoryStreams, { public: true }) - const filepath = `categories/${category.id}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'category', filepath, count: playlist.streams.count() }) + EOL - ) - }) - - const undefinedStreams = streams.filter((stream: Stream) => !stream.hasCategories()) - const playlist = new Playlist(undefinedStreams, { public: true }) - const filepath = 'categories/undefined.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'category', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Collection } from '@freearhey/core' +import { Stream, Playlist } from '../models' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type CategoriesGeneratorProps = { + streams: Collection + categories: Collection + logFile: File +} + +export class CategoriesGenerator implements Generator { + streams: Collection + categories: Collection + storage: Storage + logFile: File + + constructor({ streams, categories, logFile }: CategoriesGeneratorProps) { + this.streams = streams.clone() + this.categories = categories + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate() { + const streams = this.streams.sortBy([(stream: Stream) => stream.title]) + + this.categories.forEach(async (category: sdk.Models.Category) => { + const categoryStreams = streams + .filter((stream: Stream) => stream.hasCategory(category)) + .map((stream: Stream) => { + const groupTitle = stream + .getCategories() + .map(category => category.name) + .sort() + .join(';') + if (groupTitle) stream.groupTitle = groupTitle + + return stream + }) + + const playlist = new Playlist(categoryStreams, { public: true }) + const filepath = `categories/${category.id}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'category', filepath, count: playlist.streams.count() }) + EOL + ) + }) + + const undefinedStreams = streams.filter((stream: Stream) => stream.getCategories().isEmpty()) + const playlist = new Playlist(undefinedStreams, { public: true }) + const filepath = 'categories/undefined.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'category', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/citiesGenerator.ts b/scripts/generators/citiesGenerator.ts index 7d0891fbc8..237e8da3dc 100644 --- a/scripts/generators/citiesGenerator.ts +++ b/scripts/generators/citiesGenerator.ts @@ -1,43 +1,54 @@ -import { City, Stream, Playlist } from '../models' -import { Collection, Storage, File } from '@freearhey/core' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type CitiesGeneratorProps = { - streams: Collection - cities: Collection - logFile: File -} - -export class CitiesGenerator implements Generator { - streams: Collection - cities: Collection - storage: Storage - logFile: File - - constructor({ streams, cities, logFile }: CitiesGeneratorProps) { - this.streams = streams.clone() - this.cities = cities - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - this.cities.forEach(async (city: City) => { - const cityStreams = streams.filter((stream: Stream) => stream.isBroadcastInCity(city)) - - if (cityStreams.isEmpty()) return - - const playlist = new Playlist(cityStreams, { public: true }) - const filepath = `cities/${city.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'city', filepath, count: playlist.streams.count() }) + EOL - ) - }) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type CitiesGeneratorProps = { + streams: Collection + cities: Collection + logFile: File +} + +export class CitiesGenerator implements Generator { + streams: Collection + cities: Collection + storage: Storage + logFile: File + + constructor({ streams, cities, logFile }: CitiesGeneratorProps) { + this.streams = streams.clone() + this.cities = cities + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams = this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + + const streamsGroupedByCityCode = {} + streams.forEach((stream: Stream) => { + stream.getBroadcastCities().forEach((city: sdk.Models.City) => { + if (streamsGroupedByCityCode[city.code]) { + streamsGroupedByCityCode[city.code].add(stream) + } else { + streamsGroupedByCityCode[city.code] = new Collection([stream]) + } + }) + }) + + for (const cityCode in streamsGroupedByCityCode) { + const cityStreams = streamsGroupedByCityCode[cityCode] + + const playlist = new Playlist(cityStreams, { public: true }) + const filepath = `cities/${cityCode.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'city', filepath, count: playlist.streams.count() }) + EOL + ) + } + } +} diff --git a/scripts/generators/countriesGenerator.ts b/scripts/generators/countriesGenerator.ts index 39d7612582..0ee466dc62 100644 --- a/scripts/generators/countriesGenerator.ts +++ b/scripts/generators/countriesGenerator.ts @@ -1,68 +1,80 @@ -import { Country, Stream, Playlist } from '../models' -import { Collection, Storage, File } from '@freearhey/core' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type CountriesGeneratorProps = { - streams: Collection - countries: Collection - logFile: File -} - -export class CountriesGenerator implements Generator { - streams: Collection - countries: Collection - storage: Storage - logFile: File - - constructor({ streams, countries, logFile }: CountriesGeneratorProps) { - this.streams = streams.clone() - this.countries = countries - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - this.countries.forEach(async (country: Country) => { - const countryStreams = streams.filter((stream: Stream) => - stream.isBroadcastInCountry(country) - ) - if (countryStreams.isEmpty()) return - - const playlist = new Playlist(countryStreams, { public: true }) - const filepath = `countries/${country.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'country', filepath, count: playlist.streams.count() }) + EOL - ) - }) - - const internationalStreams = streams.filter((stream: Stream) => stream.isInternational()) - const internationalPlaylist = new Playlist(internationalStreams, { public: true }) - const internationalFilepath = 'countries/int.m3u' - await this.storage.save(internationalFilepath, internationalPlaylist.toString()) - this.logFile.append( - JSON.stringify({ - type: 'country', - filepath: internationalFilepath, - count: internationalPlaylist.streams.count() - }) + EOL - ) - - const undefinedStreams = streams.filter((stream: Stream) => !stream.hasBroadcastArea()) - const undefinedPlaylist = new Playlist(undefinedStreams, { public: true }) - const undefinedFilepath = 'countries/undefined.m3u' - await this.storage.save(undefinedFilepath, undefinedPlaylist.toString()) - this.logFile.append( - JSON.stringify({ - type: 'country', - filepath: undefinedFilepath, - count: undefinedPlaylist.streams.count() - }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type CountriesGeneratorProps = { + streams: Collection + countries: Collection + logFile: File +} + +export class CountriesGenerator implements Generator { + streams: Collection + countries: Collection + storage: Storage + logFile: File + + constructor({ streams, countries, logFile }: CountriesGeneratorProps) { + this.streams = streams.clone() + this.countries = countries + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams = this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + + const streamsGroupedByCountryCode = {} + streams.forEach((stream: Stream) => { + stream.getBroadcastCountries().forEach((country: sdk.Models.Country) => { + if (streamsGroupedByCountryCode[country.code]) { + streamsGroupedByCountryCode[country.code].add(stream) + } else { + streamsGroupedByCountryCode[country.code] = new Collection([stream]) + } + }) + }) + + for (const countryCode in streamsGroupedByCountryCode) { + const countryStreams = streamsGroupedByCountryCode[countryCode] + + const playlist = new Playlist(countryStreams, { public: true }) + const filepath = `countries/${countryCode.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'country', filepath, count: playlist.streams.count() }) + EOL + ) + } + + const internationalStreams = streams.filter((stream: Stream) => stream.isInternational()) + const internationalPlaylist = new Playlist(internationalStreams, { public: true }) + const internationalFilepath = 'countries/int.m3u' + await this.storage.save(internationalFilepath, internationalPlaylist.toString()) + this.logFile.append( + JSON.stringify({ + type: 'country', + filepath: internationalFilepath, + count: internationalPlaylist.streams.count() + }) + EOL + ) + + const undefinedStreams = streams.filter((stream: Stream) => + stream.getBroadcastAreaCodes().isEmpty() + ) + const undefinedPlaylist = new Playlist(undefinedStreams, { public: true }) + const undefinedFilepath = 'countries/undefined.m3u' + await this.storage.save(undefinedFilepath, undefinedPlaylist.toString()) + this.logFile.append( + JSON.stringify({ + type: 'country', + filepath: undefinedFilepath, + count: undefinedPlaylist.streams.count() + }) + EOL + ) + } +} diff --git a/scripts/generators/index.ts b/scripts/generators/index.ts index 66cf94eb4e..1cfd8a38ec 100644 --- a/scripts/generators/index.ts +++ b/scripts/generators/index.ts @@ -1,13 +1,12 @@ -export * from './categoriesGenerator' -export * from './citiesGenerator' -export * from './countriesGenerator' -export * from './indexCategoryGenerator' -export * from './indexCountryGenerator' -export * from './indexGenerator' -export * from './indexLanguageGenerator' -export * from './indexNsfwGenerator' -export * from './languagesGenerator' -export * from './rawGenerator' -export * from './regionsGenerator' -export * from './sourcesGenerator' -export * from './subdivisionsGenerator' +export * from './categoriesGenerator' +export * from './citiesGenerator' +export * from './countriesGenerator' +export * from './indexCategoryGenerator' +export * from './indexCountryGenerator' +export * from './indexGenerator' +export * from './indexLanguageGenerator' +export * from './languagesGenerator' +export * from './rawGenerator' +export * from './regionsGenerator' +export * from './sourcesGenerator' +export * from './subdivisionsGenerator' diff --git a/scripts/generators/indexCategoryGenerator.ts b/scripts/generators/indexCategoryGenerator.ts index 754a7d22f1..08ebf74be8 100644 --- a/scripts/generators/indexCategoryGenerator.ts +++ b/scripts/generators/indexCategoryGenerator.ts @@ -1,55 +1,56 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Stream, Playlist, Category } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type IndexCategoryGeneratorProps = { - streams: Collection - logFile: File -} - -export class IndexCategoryGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: IndexCategoryGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy(stream => stream.getTitle()) - .filter(stream => stream.isSFW()) - - let groupedStreams = new Collection() - streams.forEach((stream: Stream) => { - if (!stream.hasCategories()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - stream.getCategories().forEach((category: Category) => { - const streamClone = stream.clone() - streamClone.groupTitle = category.name - groupedStreams.push(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy(stream => { - if (stream.groupTitle === 'Undefined') return 'ZZ' - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.category.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type IndexCategoryGeneratorProps = { + streams: Collection + logFile: File +} + +export class IndexCategoryGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: IndexCategoryGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams = this.streams.sortBy(stream => stream.title).filter(stream => stream.isSFW()) + + let groupedStreams = new Collection() + streams.forEach((stream: Stream) => { + const streamCategories = stream.getCategories() + if (streamCategories.isEmpty()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + streamCategories.forEach((category: sdk.Models.Category) => { + const streamClone = stream.clone() + streamClone.groupTitle = category.name + groupedStreams.add(streamClone) + }) + }) + + groupedStreams = groupedStreams.sortBy(stream => { + if (stream.groupTitle === 'Undefined') return 'ZZ' + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.category.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/indexCountryGenerator.ts b/scripts/generators/indexCountryGenerator.ts index 016e86f731..078a1f9d6a 100644 --- a/scripts/generators/indexCountryGenerator.ts +++ b/scripts/generators/indexCountryGenerator.ts @@ -1,63 +1,67 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Stream, Playlist, Country } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type IndexCountryGeneratorProps = { - streams: Collection - logFile: File -} - -export class IndexCountryGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: IndexCountryGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - let groupedStreams = new Collection() - - this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - .forEach((stream: Stream) => { - if (!stream.hasBroadcastArea()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - stream.getBroadcastCountries().forEach((country: Country) => { - const streamClone = stream.clone() - streamClone.groupTitle = country.name - groupedStreams.add(streamClone) - }) - - if (stream.isInternational()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'International' - groupedStreams.add(streamClone) - } - }) - - groupedStreams = groupedStreams.orderBy((stream: Stream) => { - if (stream.groupTitle === 'International') return 'ZZ' - if (stream.groupTitle === 'Undefined') return 'ZZZ' - - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.country.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type IndexCountryGeneratorProps = { + streams: Collection + logFile: File +} + +export class IndexCountryGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: IndexCountryGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + let groupedStreams = new Collection() + + this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + .forEach((stream: Stream) => { + const broadcastAreaCountries = stream.getBroadcastCountries() + + if (stream.getBroadcastAreaCodes().isEmpty()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + broadcastAreaCountries.forEach((country: sdk.Models.Country) => { + const streamClone = stream.clone() + streamClone.groupTitle = country.name + groupedStreams.add(streamClone) + }) + + if (stream.isInternational()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'International' + groupedStreams.add(streamClone) + } + }) + + groupedStreams = groupedStreams.sortBy((stream: Stream) => { + if (stream.groupTitle === 'International') return 'ZZ' + if (stream.groupTitle === 'Undefined') return 'ZZZ' + + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.country.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/indexGenerator.ts b/scripts/generators/indexGenerator.ts index 6dacf4bba1..fdfdde19d3 100644 --- a/scripts/generators/indexGenerator.ts +++ b/scripts/generators/indexGenerator.ts @@ -1,40 +1,45 @@ -import { Collection, File, Storage } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type IndexGeneratorProps = { - streams: Collection - logFile: File -} - -export class IndexGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: IndexGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const sfwStreams = this.streams - .orderBy(stream => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - .map((stream: Stream) => { - const groupTitle = stream.getCategoryNames().join(';') - if (groupTitle) stream.groupTitle = groupTitle - - return stream - }) - - const playlist = new Playlist(sfwStreams, { public: true }) - const filepath = 'index.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' + +type IndexGeneratorProps = { + streams: Collection + logFile: File +} + +export class IndexGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: IndexGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const sfwStreams = this.streams + .sortBy(stream => stream.title) + .filter((stream: Stream) => stream.isSFW()) + .map((stream: Stream) => { + const groupTitle = stream + .getCategories() + .map(category => category.name) + .sort() + .join(';') + if (groupTitle) stream.groupTitle = groupTitle + + return stream + }) + + const playlist = new Playlist(sfwStreams, { public: true }) + const filepath = 'index.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/indexLanguageGenerator.ts b/scripts/generators/indexLanguageGenerator.ts index 96fb17cee0..5e93a46adb 100644 --- a/scripts/generators/indexLanguageGenerator.ts +++ b/scripts/generators/indexLanguageGenerator.ts @@ -1,54 +1,57 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Stream, Playlist, Language } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type IndexLanguageGeneratorProps = { - streams: Collection - logFile: File -} - -export class IndexLanguageGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: IndexLanguageGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - let groupedStreams = new Collection() - this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - .forEach((stream: Stream) => { - if (!stream.hasLanguages()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - stream.getLanguages().forEach((language: Language) => { - const streamClone = stream.clone() - streamClone.groupTitle = language.name - groupedStreams.add(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy((stream: Stream) => { - if (stream.groupTitle === 'Undefined') return 'ZZ' - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.language.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type IndexLanguageGeneratorProps = { + streams: Collection + logFile: File +} + +export class IndexLanguageGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: IndexLanguageGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + let groupedStreams = new Collection() + this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + .forEach((stream: Stream) => { + const streamLanguages = stream.getLanguages() + if (streamLanguages.isEmpty()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + streamLanguages.forEach((language: sdk.Models.Language) => { + const streamClone = stream.clone() + streamClone.groupTitle = language.name + groupedStreams.add(streamClone) + }) + }) + + groupedStreams = groupedStreams.sortBy((stream: Stream) => { + if (stream.groupTitle === 'Undefined') return 'ZZ' + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.language.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/indexNsfwGenerator.ts b/scripts/generators/indexNsfwGenerator.ts deleted file mode 100644 index 14f3189d51..0000000000 --- a/scripts/generators/indexNsfwGenerator.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Collection, File, Storage } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type IndexNsfwGeneratorProps = { - streams: Collection - logFile: File -} - -export class IndexNsfwGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: IndexNsfwGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const allStreams = this.streams.orderBy((stream: Stream) => stream.getTitle()) - - const playlist = new Playlist(allStreams, { public: true }) - const filepath = 'index.nsfw.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'index', filepath, count: playlist.streams.count() }) + EOL - ) - } -} diff --git a/scripts/generators/languagesGenerator.ts b/scripts/generators/languagesGenerator.ts index f07e984d13..28fce5241a 100644 --- a/scripts/generators/languagesGenerator.ts +++ b/scripts/generators/languagesGenerator.ts @@ -1,57 +1,58 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Playlist, Language, Stream } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type LanguagesGeneratorProps = { streams: Collection; logFile: File } - -export class LanguagesGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: LanguagesGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - let languages = new Collection() - streams.forEach((stream: Stream) => { - languages = languages.concat(stream.getLanguages()) - }) - - languages - .filter(Boolean) - .uniqBy((language: Language) => language.code) - .orderBy((language: Language) => language.name) - .forEach(async (language: Language) => { - const languageStreams = streams.filter((stream: Stream) => stream.hasLanguage(language)) - - if (languageStreams.isEmpty()) return - - const playlist = new Playlist(languageStreams, { public: true }) - const filepath = `languages/${language.code}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL - ) - }) - - const undefinedStreams = streams.filter((stream: Stream) => !stream.hasLanguages()) - - if (undefinedStreams.isEmpty()) return - - const playlist = new Playlist(undefinedStreams, { public: true }) - const filepath = 'languages/undefined.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL - ) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Playlist, Stream } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type LanguagesGeneratorProps = { streams: Collection; logFile: File } + +export class LanguagesGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: LanguagesGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams: Collection = this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + + const languages = new Collection() + streams.forEach((stream: Stream) => { + languages.concat(stream.getLanguages()) + }) + + languages + .filter(Boolean) + .uniqBy((language: sdk.Models.Language) => language.code) + .sortBy((language: sdk.Models.Language) => language.name) + .forEach(async (language: sdk.Models.Language) => { + const languageStreams = streams.filter((stream: Stream) => stream.hasLanguage(language)) + + if (languageStreams.isEmpty()) return + + const playlist = new Playlist(languageStreams, { public: true }) + const filepath = `languages/${language.code}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL + ) + }) + + const undefinedStreams = streams.filter((stream: Stream) => stream.getLanguages().isEmpty()) + if (undefinedStreams.isEmpty()) return + + const playlist = new Playlist(undefinedStreams, { public: true }) + const filepath = 'languages/undefined.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'language', filepath, count: playlist.streams.count() }) + EOL + ) + } +} diff --git a/scripts/generators/rawGenerator.ts b/scripts/generators/rawGenerator.ts index 2816432d93..f16bdf76a7 100644 --- a/scripts/generators/rawGenerator.ts +++ b/scripts/generators/rawGenerator.ts @@ -1,40 +1,45 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type RawGeneratorProps = { - streams: Collection - logFile: File -} - -export class RawGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: RawGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate() { - const files = this.streams.groupBy((stream: Stream) => stream.getFilename()) - - for (const filename of files.keys()) { - const streams = new Collection(files.get(filename)).map((stream: Stream) => { - const groupTitle = stream.getCategoryNames().join(';') - if (groupTitle) stream.groupTitle = groupTitle - - return stream - }) - const playlist = new Playlist(streams, { public: true }) - const filepath = `raw/${filename}` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'raw', filepath, count: playlist.streams.count() }) + EOL - ) - } - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' + +type RawGeneratorProps = { + streams: Collection + logFile: File +} + +export class RawGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: RawGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate() { + const files = this.streams.groupBy((stream: Stream) => stream.getFilename()) + + for (const filename of files.keys()) { + const streams = new Collection(files.get(filename)).map((stream: Stream) => { + const groupTitle = stream + .getCategories() + .map(category => category.name) + .sort() + .join(';') + if (groupTitle) stream.groupTitle = groupTitle + + return stream + }) + const playlist = new Playlist(streams, { public: true }) + const filepath = `raw/${filename}` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'raw', filepath, count: playlist.streams.count() }) + EOL + ) + } + } +} diff --git a/scripts/generators/regionsGenerator.ts b/scripts/generators/regionsGenerator.ts index 02112974ed..c0d669bed6 100644 --- a/scripts/generators/regionsGenerator.ts +++ b/scripts/generators/regionsGenerator.ts @@ -1,41 +1,54 @@ -import { Collection, Storage, File } from '@freearhey/core' -import { Playlist, Region, Stream } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type RegionsGeneratorProps = { - streams: Collection - regions: Collection - logFile: File -} - -export class RegionsGenerator implements Generator { - streams: Collection - regions: Collection - storage: Storage - logFile: File - - constructor({ streams, regions, logFile }: RegionsGeneratorProps) { - this.streams = streams.clone() - this.regions = regions - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - this.regions.forEach(async (region: Region) => { - const regionStreams = streams.filter((stream: Stream) => stream.isBroadcastInRegion(region)) - - const playlist = new Playlist(regionStreams, { public: true }) - const filepath = `regions/${region.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'region', filepath, count: playlist.streams.count() }) + EOL - ) - }) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Playlist, Stream } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type RegionsGeneratorProps = { + streams: Collection + regions: Collection + logFile: File +} + +export class RegionsGenerator implements Generator { + streams: Collection + regions: Collection + storage: Storage + logFile: File + + constructor({ streams, regions, logFile }: RegionsGeneratorProps) { + this.streams = streams.clone() + this.regions = regions + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams = this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + + const streamsGroupedByRegionCode = {} + streams.forEach((stream: Stream) => { + stream.getBroadcastRegions().forEach((region: sdk.Models.Region) => { + if (streamsGroupedByRegionCode[region.code]) { + streamsGroupedByRegionCode[region.code].add(stream) + } else { + streamsGroupedByRegionCode[region.code] = new Collection([stream]) + } + }) + }) + + for (const regionCode in streamsGroupedByRegionCode) { + const regionStreams = streamsGroupedByRegionCode[regionCode] + + const playlist = new Playlist(regionStreams, { public: true }) + const filepath = `regions/${regionCode.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'region', filepath, count: playlist.streams.count() }) + EOL + ) + } + } +} diff --git a/scripts/generators/sourcesGenerator.ts b/scripts/generators/sourcesGenerator.ts index 607c05b0e5..d90bc7f742 100644 --- a/scripts/generators/sourcesGenerator.ts +++ b/scripts/generators/sourcesGenerator.ts @@ -1,43 +1,49 @@ -import { Collection, Storage, File, type Dictionary } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type SourcesGeneratorProps = { - streams: Collection - logFile: File -} - -export class SourcesGenerator implements Generator { - streams: Collection - storage: Storage - logFile: File - - constructor({ streams, logFile }: SourcesGeneratorProps) { - this.streams = streams.clone() - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate() { - const files: Dictionary = this.streams.groupBy((stream: Stream) => stream.getFilename()) - - for (const filename of files.keys()) { - if (!filename) continue - - let streams = new Collection(files.get(filename)) - streams = streams.map((stream: Stream) => { - const groupTitle = stream.getCategoryNames().join(';') - if (groupTitle) stream.groupTitle = groupTitle - - return stream - }) - const playlist = new Playlist(streams, { public: true }) - const filepath = `sources/${filename}` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'source', filepath, count: playlist.streams.count() }) + EOL - ) - } - } -} +import { Collection, Dictionary } from '@freearhey/core' +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Generator } from './generator' + +type SourcesGeneratorProps = { + streams: Collection + logFile: File +} + +export class SourcesGenerator implements Generator { + streams: Collection + storage: Storage + logFile: File + + constructor({ streams, logFile }: SourcesGeneratorProps) { + this.streams = streams.clone() + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate() { + const files: Dictionary = this.streams.groupBy((stream: Stream) => + stream.getFilename() + ) + + for (const filename of files.keys()) { + if (!filename) continue + + const streams = new Collection(files.get(filename)).map((stream: Stream) => { + const groupTitle = stream + .getCategories() + .map(category => category.name) + .sort() + .join(';') + if (groupTitle) stream.groupTitle = groupTitle + + return stream + }) + const playlist = new Playlist(streams, { public: true }) + const filepath = `sources/${filename}` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'source', filepath, count: playlist.streams.count() }) + EOL + ) + } + } +} diff --git a/scripts/generators/subdivisionsGenerator.ts b/scripts/generators/subdivisionsGenerator.ts index 8ddce23328..758f6738f2 100644 --- a/scripts/generators/subdivisionsGenerator.ts +++ b/scripts/generators/subdivisionsGenerator.ts @@ -1,45 +1,54 @@ -import { Subdivision, Stream, Playlist } from '../models' -import { Collection, Storage, File } from '@freearhey/core' -import { PUBLIC_DIR, EOL } from '../constants' -import { Generator } from './generator' - -type SubdivisionsGeneratorProps = { - streams: Collection - subdivisions: Collection - logFile: File -} - -export class SubdivisionsGenerator implements Generator { - streams: Collection - subdivisions: Collection - storage: Storage - logFile: File - - constructor({ streams, subdivisions, logFile }: SubdivisionsGeneratorProps) { - this.streams = streams.clone() - this.subdivisions = subdivisions - this.storage = new Storage(PUBLIC_DIR) - this.logFile = logFile - } - - async generate(): Promise { - const streams = this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - this.subdivisions.forEach(async (subdivision: Subdivision) => { - const subdivisionStreams = streams.filter((stream: Stream) => - stream.isBroadcastInSubdivision(subdivision) - ) - - if (subdivisionStreams.isEmpty()) return - - const playlist = new Playlist(subdivisionStreams, { public: true }) - const filepath = `subdivisions/${subdivision.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logFile.append( - JSON.stringify({ type: 'subdivision', filepath, count: playlist.streams.count() }) + EOL - ) - }) - } -} +import { Storage, File } from '@freearhey/storage-js' +import { PUBLIC_DIR, EOL } from '../constants' +import { Stream, Playlist } from '../models' +import { Collection } from '@freearhey/core' +import { Generator } from './generator' +import * as sdk from '@iptv-org/sdk' + +type SubdivisionsGeneratorProps = { + streams: Collection + subdivisions: Collection + logFile: File +} + +export class SubdivisionsGenerator implements Generator { + streams: Collection + subdivisions: Collection + storage: Storage + logFile: File + + constructor({ streams, subdivisions, logFile }: SubdivisionsGeneratorProps) { + this.streams = streams.clone() + this.subdivisions = subdivisions + this.storage = new Storage(PUBLIC_DIR) + this.logFile = logFile + } + + async generate(): Promise { + const streams = this.streams + .sortBy((stream: Stream) => stream.title) + .filter((stream: Stream) => stream.isSFW()) + + const streamsGroupedBySubdivisionCode = {} + streams.forEach((stream: Stream) => { + stream.getBroadcastSubdivisions().forEach((subdivision: sdk.Models.Subdivision) => { + if (streamsGroupedBySubdivisionCode[subdivision.code]) { + streamsGroupedBySubdivisionCode[subdivision.code].add(stream) + } else { + streamsGroupedBySubdivisionCode[subdivision.code] = new Collection([stream]) + } + }) + }) + + for (const subdivisionCode in streamsGroupedBySubdivisionCode) { + const subdivisionStreams = streamsGroupedBySubdivisionCode[subdivisionCode] + + const playlist = new Playlist(subdivisionStreams, { public: true }) + const filepath = `subdivisions/${subdivisionCode.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logFile.append( + JSON.stringify({ type: 'subdivision', filepath, count: playlist.streams.count() }) + EOL + ) + } + } +} diff --git a/scripts/models/blocklistRecord.ts b/scripts/models/blocklistRecord.ts deleted file mode 100644 index 632a1d4ddc..0000000000 --- a/scripts/models/blocklistRecord.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { BlocklistRecordData } from '../types/blocklistRecord' - -export class BlocklistRecord { - channelId: string - reason: string - ref: string - - constructor(data?: BlocklistRecordData) { - if (!data) return - - this.channelId = data.channel - this.reason = data.reason - this.ref = data.ref - } -} diff --git a/scripts/models/broadcastArea.ts b/scripts/models/broadcastArea.ts deleted file mode 100644 index da49fe5402..0000000000 --- a/scripts/models/broadcastArea.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' -import { City, Subdivision, Region, Country } from './' - -export class BroadcastArea { - codes: Collection - citiesIncluded: Collection - subdivisionsIncluded: Collection - countriesIncluded: Collection - regionsIncluded: Collection - - constructor(codes: Collection) { - this.codes = codes - } - - withLocations( - citiesKeyByCode: Dictionary, - subdivisionsKeyByCode: Dictionary, - countriesKeyByCode: Dictionary, - regionsKeyByCode: Dictionary - ): this { - const citiesIncluded = new Collection() - const subdivisionsIncluded = new Collection() - const countriesIncluded = new Collection() - let regionsIncluded = new Collection() - - this.codes.forEach((value: string) => { - const [type, code] = value.split('/') - - switch (type) { - case 'ct': { - const city: City = citiesKeyByCode.get(code) - if (!city) return - citiesIncluded.add(city) - if (city.subdivision) subdivisionsIncluded.add(city.subdivision) - if (city.subdivision && city.subdivision.parent) - subdivisionsIncluded.add(city.subdivision.parent) - if (city.country) countriesIncluded.add(city.country) - regionsIncluded = regionsIncluded.concat(city.getRegions()) - break - } - case 's': { - const subdivision: Subdivision = subdivisionsKeyByCode.get(code) - if (!subdivision) return - subdivisionsIncluded.add(subdivision) - if (subdivision.country) countriesIncluded.add(subdivision.country) - regionsIncluded = regionsIncluded.concat(subdivision.getRegions()) - break - } - case 'c': { - const country: Country = countriesKeyByCode.get(code) - if (!country) return - countriesIncluded.add(country) - regionsIncluded = regionsIncluded.concat(country.getRegions()) - break - } - case 'r': { - const region: Region = regionsKeyByCode.get(code) - if (!region) return - regionsIncluded = regionsIncluded.concat(region.getRegions()) - break - } - } - }) - - this.citiesIncluded = citiesIncluded.uniqBy((city: City) => city.code) - this.subdivisionsIncluded = subdivisionsIncluded.uniqBy( - (subdivision: Subdivision) => subdivision.code - ) - this.countriesIncluded = countriesIncluded.uniqBy((country: Country) => country.code) - this.regionsIncluded = regionsIncluded.uniqBy((region: Region) => region.code) - - return this - } - - getCountries(): Collection { - return this.countriesIncluded || new Collection() - } - - getSubdivisions(): Collection { - return this.subdivisionsIncluded || new Collection() - } - - getCities(): Collection { - return this.citiesIncluded || new Collection() - } - - getRegions(): Collection { - return this.regionsIncluded || new Collection() - } - - includesCountry(country: Country): boolean { - return this.getCountries().includes((_country: Country) => _country.code === country.code) - } - - includesSubdivision(subdivision: Subdivision): boolean { - return this.getSubdivisions().includes( - (_subdivision: Subdivision) => _subdivision.code === subdivision.code - ) - } - - includesRegion(region: Region): boolean { - return this.getRegions().includes((_region: Region) => _region.code === region.code) - } - - includesCity(city: City): boolean { - return this.getCities().includes((_city: City) => _city.code === city.code) - } -} diff --git a/scripts/models/category.ts b/scripts/models/category.ts deleted file mode 100644 index 5b228a86d0..0000000000 --- a/scripts/models/category.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { CategoryData, CategorySerializedData } from '../types/category' - -export class Category { - id: string - name: string - - constructor(data: CategoryData) { - this.id = data.id - this.name = data.name - } - - serialize(): CategorySerializedData { - return { - id: this.id, - name: this.name - } - } -} diff --git a/scripts/models/channel.ts b/scripts/models/channel.ts deleted file mode 100644 index 7a90146cf0..0000000000 --- a/scripts/models/channel.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' -import { Category, Country, Feed, Guide, Logo, Stream, Subdivision } from './index' -import type { ChannelData, ChannelSearchableData, ChannelSerializedData } from '../types/channel' - -export class Channel { - id: string - name: string - altNames: Collection - network?: string - owners: Collection - countryCode: string - country?: Country - subdivisionCode?: string - subdivision?: Subdivision - cityName?: string - categoryIds: Collection - categories: Collection = new Collection() - isNSFW: boolean - launched?: string - closed?: string - replacedBy?: string - isClosed: boolean - website?: string - feeds?: Collection - logos: Collection = new Collection() - - constructor(data?: ChannelData) { - if (!data) return - - this.id = data.id - this.name = data.name - this.altNames = new Collection(data.alt_names) - this.network = data.network || undefined - this.owners = new Collection(data.owners) - this.countryCode = data.country - this.subdivisionCode = data.subdivision || undefined - this.cityName = data.city || undefined - this.categoryIds = new Collection(data.categories) - this.isNSFW = data.is_nsfw - this.launched = data.launched || undefined - this.closed = data.closed || undefined - this.replacedBy = data.replaced_by || undefined - this.website = data.website || undefined - this.isClosed = !!data.closed || !!data.replaced_by - } - - withSubdivision(subdivisionsKeyByCode: Dictionary): this { - if (!this.subdivisionCode) return this - - this.subdivision = subdivisionsKeyByCode.get(this.subdivisionCode) - - return this - } - - withCountry(countriesKeyByCode: Dictionary): this { - this.country = countriesKeyByCode.get(this.countryCode) - - return this - } - - withCategories(categoriesKeyById: Dictionary): this { - this.categories = this.categoryIds - .map((id: string) => categoriesKeyById.get(id)) - .filter(Boolean) - - return this - } - - withFeeds(feedsGroupedByChannelId: Dictionary): this { - this.feeds = new Collection(feedsGroupedByChannelId.get(this.id)) - - return this - } - - withLogos(logosGroupedByChannelId: Dictionary): this { - if (this.id) this.logos = new Collection(logosGroupedByChannelId.get(this.id)) - - return this - } - - getCountry(): Country | undefined { - return this.country - } - - getSubdivision(): Subdivision | undefined { - return this.subdivision - } - - getCategories(): Collection { - return this.categories || new Collection() - } - - hasCategories(): boolean { - return !!this.categories && this.categories.notEmpty() - } - - hasCategory(category: Category): boolean { - return ( - !!this.categories && - this.categories.includes((_category: Category) => _category.id === category.id) - ) - } - - getFeeds(): Collection { - if (!this.feeds) return new Collection() - - return this.feeds - } - - getGuides(): Collection { - let guides = new Collection() - - this.getFeeds().forEach((feed: Feed) => { - guides = guides.concat(feed.getGuides()) - }) - - return guides - } - - getGuideNames(): Collection { - return this.getGuides() - .map((guide: Guide) => guide.siteName) - .uniq() - } - - getStreams(): Collection { - let streams = new Collection() - - this.getFeeds().forEach((feed: Feed) => { - streams = streams.concat(feed.getStreams()) - }) - - return streams - } - - getStreamTitles(): Collection { - return this.getStreams() - .map((stream: Stream) => stream.getTitle()) - .uniq() - } - - getFeedFullNames(): Collection { - return this.getFeeds() - .map((feed: Feed) => feed.getFullName()) - .uniq() - } - - isSFW(): boolean { - return this.isNSFW === false - } - - getLogos(): Collection { - function feed(logo: Logo): number { - if (!logo.feed) return 1 - if (logo.feed.isMain) return 1 - - return 0 - } - - function format(logo: Logo): number { - const levelByFormat = { SVG: 0, PNG: 3, APNG: 1, WebP: 1, AVIF: 1, JPEG: 2, GIF: 1 } - - return logo.format ? levelByFormat[logo.format] : 0 - } - - function size(logo: Logo): number { - return Math.abs(512 - logo.width) + Math.abs(512 - logo.height) - } - - return this.logos.orderBy([feed, format, size], ['desc', 'desc', 'asc'], false) - } - - getLogo(): Logo | undefined { - return this.getLogos().first() - } - - hasLogo(): boolean { - return this.getLogos().notEmpty() - } - - getSearchable(): ChannelSearchableData { - return { - id: this.id, - name: this.name, - altNames: this.altNames.all(), - guideNames: this.getGuideNames().all(), - streamTitles: this.getStreamTitles().all(), - feedFullNames: this.getFeedFullNames().all() - } - } - - serialize(): ChannelSerializedData { - return { - id: this.id, - name: this.name, - altNames: this.altNames.all(), - network: this.network, - owners: this.owners.all(), - countryCode: this.countryCode, - country: this.country ? this.country.serialize() : undefined, - subdivisionCode: this.subdivisionCode, - subdivision: this.subdivision ? this.subdivision.serialize() : undefined, - cityName: this.cityName, - categoryIds: this.categoryIds.all(), - categories: this.categories.map((category: Category) => category.serialize()).all(), - isNSFW: this.isNSFW, - launched: this.launched, - closed: this.closed, - replacedBy: this.replacedBy, - website: this.website - } - } - - deserialize(data: ChannelSerializedData): this { - this.id = data.id - this.name = data.name - this.altNames = new Collection(data.altNames) - this.network = data.network - this.owners = new Collection(data.owners) - this.countryCode = data.countryCode - this.country = data.country ? new Country().deserialize(data.country) : undefined - this.subdivisionCode = data.subdivisionCode - this.cityName = data.cityName - this.categoryIds = new Collection(data.categoryIds) - this.isNSFW = data.isNSFW - this.launched = data.launched - this.closed = data.closed - this.replacedBy = data.replacedBy - this.website = data.website - - return this - } -} diff --git a/scripts/models/city.ts b/scripts/models/city.ts deleted file mode 100644 index 6ce9173ac9..0000000000 --- a/scripts/models/city.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' -import { Country, Region, Subdivision } from '.' -import type { CityData, CitySerializedData } from '../types/city' - -export class City { - code: string - name: string - countryCode: string - country?: Country - subdivisionCode?: string - subdivision?: Subdivision - wikidataId: string - regions?: Collection - - constructor(data?: CityData) { - if (!data) return - - this.code = data.code - this.name = data.name - this.countryCode = data.country - this.subdivisionCode = data.subdivision || undefined - this.wikidataId = data.wikidata_id - } - - withCountry(countriesKeyByCode: Dictionary): this { - this.country = countriesKeyByCode.get(this.countryCode) - - return this - } - - withSubdivision(subdivisionsKeyByCode: Dictionary): this { - if (!this.subdivisionCode) return this - - this.subdivision = subdivisionsKeyByCode.get(this.subdivisionCode) - - return this - } - - withRegions(regions: Collection): this { - this.regions = regions.filter((region: Region) => - region.countryCodes.includes(this.countryCode) - ) - - return this - } - - getRegions(): Collection { - if (!this.regions) return new Collection() - - return this.regions - } - - serialize(): CitySerializedData { - return { - code: this.code, - name: this.name, - countryCode: this.countryCode, - country: this.country ? this.country.serialize() : undefined, - subdivisionCode: this.subdivisionCode || null, - subdivision: this.subdivision ? this.subdivision.serialize() : undefined, - wikidataId: this.wikidataId - } - } - - deserialize(data: CitySerializedData): this { - this.code = data.code - this.name = data.name - this.countryCode = data.countryCode - this.country = data.country ? new Country().deserialize(data.country) : undefined - this.subdivisionCode = data.subdivisionCode || undefined - this.subdivision = data.subdivision - ? new Subdivision().deserialize(data.subdivision) - : undefined - this.wikidataId = data.wikidataId - - return this - } -} diff --git a/scripts/models/country.ts b/scripts/models/country.ts deleted file mode 100644 index b9699f7235..0000000000 --- a/scripts/models/country.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' -import { Region, Language, Subdivision } from '.' -import type { CountryData, CountrySerializedData } from '../types/country' -import { SubdivisionSerializedData } from '../types/subdivision' -import { RegionSerializedData } from '../types/region' - -export class Country { - code: string - name: string - flag: string - languageCode: string - language?: Language - subdivisions?: Collection - regions?: Collection - cities?: Collection - - constructor(data?: CountryData) { - if (!data) return - - this.code = data.code - this.name = data.name - this.flag = data.flag - this.languageCode = data.lang - } - - withSubdivisions(subdivisionsGroupedByCountryCode: Dictionary): this { - this.subdivisions = new Collection(subdivisionsGroupedByCountryCode.get(this.code)) - - return this - } - - withRegions(regions: Collection): this { - this.regions = regions.filter((region: Region) => region.includesCountryCode(this.code)) - - return this - } - - withCities(citiesGroupedByCountryCode: Dictionary): this { - this.cities = new Collection(citiesGroupedByCountryCode.get(this.code)) - - return this - } - - withLanguage(languagesKeyByCode: Dictionary): this { - this.language = languagesKeyByCode.get(this.languageCode) - - return this - } - - getLanguage(): Language | undefined { - return this.language - } - - getRegions(): Collection { - return this.regions || new Collection() - } - - getSubdivisions(): Collection { - return this.subdivisions || new Collection() - } - - getCities(): Collection { - return this.cities || new Collection() - } - - serialize(): CountrySerializedData { - return { - code: this.code, - name: this.name, - flag: this.flag, - languageCode: this.languageCode, - language: this.language ? this.language.serialize() : null, - subdivisions: this.subdivisions - ? this.subdivisions.map((subdivision: Subdivision) => subdivision.serialize()).all() - : [], - regions: this.regions ? this.regions.map((region: Region) => region.serialize()).all() : [] - } - } - - deserialize(data: CountrySerializedData): this { - this.code = data.code - this.name = data.name - this.flag = data.flag - this.languageCode = data.languageCode - this.language = data.language ? new Language().deserialize(data.language) : undefined - this.subdivisions = new Collection(data.subdivisions).map((data: SubdivisionSerializedData) => - new Subdivision().deserialize(data) - ) - this.regions = new Collection(data.regions).map((data: RegionSerializedData) => - new Region().deserialize(data) - ) - - return this - } -} diff --git a/scripts/models/feed.ts b/scripts/models/feed.ts deleted file mode 100644 index a6713e265a..0000000000 --- a/scripts/models/feed.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { Country, Language, Region, Channel, Subdivision, BroadcastArea, City } from './index' -import { Collection, Dictionary } from '@freearhey/core' -import type { FeedData } from '../types/feed' - -export class Feed { - channelId: string - channel?: Channel - id: string - name: string - isMain: boolean - broadcastAreaCodes: Collection - broadcastArea?: BroadcastArea - languageCodes: Collection - languages?: Collection - timezoneIds: Collection - timezones?: Collection - videoFormat: string - guides?: Collection - streams?: Collection - - constructor(data: FeedData) { - this.channelId = data.channel - this.id = data.id - this.name = data.name - this.isMain = data.is_main - this.broadcastAreaCodes = new Collection(data.broadcast_area) - this.languageCodes = new Collection(data.languages) - this.timezoneIds = new Collection(data.timezones) - this.videoFormat = data.video_format - } - - withChannel(channelsKeyById: Dictionary): this { - this.channel = channelsKeyById.get(this.channelId) - - return this - } - - withStreams(streamsGroupedById: Dictionary): this { - this.streams = new Collection(streamsGroupedById.get(`${this.channelId}@${this.id}`)) - - if (this.isMain) { - this.streams = this.streams.concat(new Collection(streamsGroupedById.get(this.channelId))) - } - - return this - } - - withGuides(guidesGroupedByStreamId: Dictionary): this { - this.guides = new Collection(guidesGroupedByStreamId.get(`${this.channelId}@${this.id}`)) - - if (this.isMain) { - this.guides = this.guides.concat(new Collection(guidesGroupedByStreamId.get(this.channelId))) - } - - return this - } - - withLanguages(languagesKeyByCode: Dictionary): this { - this.languages = this.languageCodes - .map((code: string) => languagesKeyByCode.get(code)) - .filter(Boolean) - - return this - } - - withTimezones(timezonesKeyById: Dictionary): this { - this.timezones = this.timezoneIds.map((id: string) => timezonesKeyById.get(id)).filter(Boolean) - - return this - } - - withBroadcastArea( - citiesKeyByCode: Dictionary, - subdivisionsKeyByCode: Dictionary, - countriesKeyByCode: Dictionary, - regionsKeyByCode: Dictionary - ): this { - this.broadcastArea = new BroadcastArea(this.broadcastAreaCodes).withLocations( - citiesKeyByCode, - subdivisionsKeyByCode, - countriesKeyByCode, - regionsKeyByCode - ) - - return this - } - - hasBroadcastArea(): boolean { - return !!this.broadcastArea - } - - getBroadcastCountries(): Collection { - if (!this.broadcastArea) return new Collection() - - return this.broadcastArea.getCountries() - } - - getBroadcastRegions(): Collection { - if (!this.broadcastArea) return new Collection() - - return this.broadcastArea.getRegions() - } - - getTimezones(): Collection { - return this.timezones || new Collection() - } - - getLanguages(): Collection { - return this.languages || new Collection() - } - - hasLanguages(): boolean { - return !!this.languages && this.languages.notEmpty() - } - - hasLanguage(language: Language): boolean { - return ( - !!this.languages && - this.languages.includes((_language: Language) => _language.code === language.code) - ) - } - - isBroadcastInCity(city: City): boolean { - if (!this.broadcastArea) return false - - return this.broadcastArea.includesCity(city) - } - - isBroadcastInSubdivision(subdivision: Subdivision): boolean { - if (!this.broadcastArea) return false - - return this.broadcastArea.includesSubdivision(subdivision) - } - - isBroadcastInCountry(country: Country): boolean { - if (!this.broadcastArea) return false - - return this.broadcastArea.includesCountry(country) - } - - isBroadcastInRegion(region: Region): boolean { - if (!this.broadcastArea) return false - - return this.broadcastArea.includesRegion(region) - } - - isInternational(): boolean { - if (!this.broadcastArea) return false - - return this.broadcastArea.codes.join(',').includes('r/') - } - - getGuides(): Collection { - if (!this.guides) return new Collection() - - return this.guides - } - - getStreams(): Collection { - if (!this.streams) return new Collection() - - return this.streams - } - - getFullName(): string { - if (!this.channel) return '' - - return `${this.channel.name} ${this.name}` - } -} diff --git a/scripts/models/guide.ts b/scripts/models/guide.ts deleted file mode 100644 index 3bc849d86e..0000000000 --- a/scripts/models/guide.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { GuideData, GuideSerializedData } from '../types/guide' - -export class Guide { - channelId?: string - feedId?: string - siteDomain: string - siteId: string - siteName: string - languageCode: string - - constructor(data?: GuideData) { - if (!data) return - - this.channelId = data.channel - this.feedId = data.feed - this.siteDomain = data.site - this.siteId = data.site_id - this.siteName = data.site_name - this.languageCode = data.lang - } - - getUUID(): string { - return this.getStreamId() + this.siteId - } - - getStreamId(): string | undefined { - if (!this.channelId) return undefined - if (!this.feedId) return this.channelId - - return `${this.channelId}@${this.feedId}` - } - - serialize(): GuideSerializedData { - return { - channelId: this.channelId, - feedId: this.feedId, - siteDomain: this.siteDomain, - siteId: this.siteId, - siteName: this.siteName, - languageCode: this.languageCode - } - } - - deserialize(data: GuideSerializedData): this { - this.channelId = data.channelId - this.feedId = data.feedId - this.siteDomain = data.siteDomain - this.siteId = data.siteId - this.siteName = data.siteName - this.languageCode = data.languageCode - - return this - } -} diff --git a/scripts/models/index.ts b/scripts/models/index.ts index e8fe346289..f4b06f6dd5 100644 --- a/scripts/models/index.ts +++ b/scripts/models/index.ts @@ -1,16 +1,3 @@ -export * from './blocklistRecord' -export * from './broadcastArea' -export * from './category' -export * from './channel' -export * from './city' -export * from './country' -export * from './feed' -export * from './guide' -export * from './issue' -export * from './language' -export * from './logo' -export * from './playlist' -export * from './region' -export * from './stream' -export * from './subdivision' -export * from './timezone' +export * from './issue' +export * from './playlist' +export * from './stream' diff --git a/scripts/models/language.ts b/scripts/models/language.ts deleted file mode 100644 index 1e6df829bc..0000000000 --- a/scripts/models/language.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { LanguageData, LanguageSerializedData } from '../types/language' - -export class Language { - code: string - name: string - - constructor(data?: LanguageData) { - if (!data) return - - this.code = data.code - this.name = data.name - } - - serialize(): LanguageSerializedData { - return { - code: this.code, - name: this.name - } - } - - deserialize(data: LanguageSerializedData): this { - this.code = data.code - this.name = data.name - - return this - } -} diff --git a/scripts/models/logo.ts b/scripts/models/logo.ts deleted file mode 100644 index 3cc85fb9da..0000000000 --- a/scripts/models/logo.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Collection, type Dictionary } from '@freearhey/core' -import type { LogoData } from '../types/logo' -import { type Feed } from './feed' - -export class Logo { - channelId: string - feedId?: string - feed: Feed - tags: Collection - width: number - height: number - format?: string - url: string - - constructor(data?: LogoData) { - if (!data) return - - this.channelId = data.channel - this.feedId = data.feed || undefined - this.tags = new Collection(data.tags) - this.width = data.width - this.height = data.height - this.format = data.format || undefined - this.url = data.url - } - - withFeed(feedsKeyById: Dictionary): this { - if (!this.feedId) return this - - this.feed = feedsKeyById.get(this.feedId) - - return this - } - - getStreamId(): string { - if (!this.feedId) return this.channelId - - return `${this.channelId}@${this.feedId}` - } -} diff --git a/scripts/models/playlist.ts b/scripts/models/playlist.ts index d3022a5af6..f6a2b25d60 100644 --- a/scripts/models/playlist.ts +++ b/scripts/models/playlist.ts @@ -1,28 +1,28 @@ -import { Collection } from '@freearhey/core' -import { Stream } from '../models' - -type PlaylistOptions = { - public: boolean -} - -export class Playlist { - streams: Collection - options: { - public: boolean - } - - constructor(streams: Collection, options?: PlaylistOptions) { - this.streams = streams - this.options = options || { public: false } - } - - toString() { - let output = '#EXTM3U\r\n' - - this.streams.forEach((stream: Stream) => { - output += stream.toString(this.options) + '\r\n' - }) - - return output - } -} +import { Collection } from '@freearhey/core' +import { Stream } from '../models' + +type PlaylistOptions = { + public: boolean +} + +export class Playlist { + streams: Collection + options: { + public: boolean + } + + constructor(streams: Collection, options?: PlaylistOptions) { + this.streams = streams + this.options = options || { public: false } + } + + toString() { + let output = '#EXTM3U\r\n' + + this.streams.forEach((stream: Stream) => { + output += stream.toString(this.options) + '\r\n' + }) + + return output + } +} diff --git a/scripts/models/region.ts b/scripts/models/region.ts deleted file mode 100644 index 5fe52ad5a9..0000000000 --- a/scripts/models/region.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' -import { City, Country, Subdivision } from '.' -import type { RegionData, RegionSerializedData } from '../types/region' -import { CountrySerializedData } from '../types/country' -import { SubdivisionSerializedData } from '../types/subdivision' -import { CitySerializedData } from '../types/city' - -export class Region { - code: string - name: string - countryCodes: Collection - countries?: Collection - subdivisions?: Collection - cities?: Collection - regions?: Collection - - constructor(data?: RegionData) { - if (!data) return - - this.code = data.code - this.name = data.name - this.countryCodes = new Collection(data.countries) - } - - withCountries(countriesKeyByCode: Dictionary): this { - this.countries = this.countryCodes.map((code: string) => countriesKeyByCode.get(code)) - - return this - } - - withSubdivisions(subdivisions: Collection): this { - this.subdivisions = subdivisions.filter( - (subdivision: Subdivision) => this.countryCodes.indexOf(subdivision.countryCode) > -1 - ) - - return this - } - - withCities(cities: Collection): this { - this.cities = cities.filter((city: City) => this.countryCodes.indexOf(city.countryCode) > -1) - - return this - } - - withRegions(regions: Collection): this { - this.regions = regions.filter( - (region: Region) => !region.countryCodes.intersects(this.countryCodes).isEmpty() - ) - - return this - } - - getSubdivisions(): Collection { - if (!this.subdivisions) return new Collection() - - return this.subdivisions - } - - getCountries(): Collection { - if (!this.countries) return new Collection() - - return this.countries - } - - getCities(): Collection { - if (!this.cities) return new Collection() - - return this.cities - } - - getRegions(): Collection { - if (!this.regions) return new Collection() - - return this.regions - } - - includesCountryCode(code: string): boolean { - return this.countryCodes.includes((countryCode: string) => countryCode === code) - } - - isWorldwide(): boolean { - return ['INT', 'WW'].includes(this.code) - } - - serialize(): RegionSerializedData { - return { - code: this.code, - name: this.name, - countryCodes: this.countryCodes.all(), - countries: this.getCountries() - .map((country: Country) => country.serialize()) - .all(), - subdivisions: this.getSubdivisions() - .map((subdivision: Subdivision) => subdivision.serialize()) - .all(), - cities: this.getCities() - .map((city: City) => city.serialize()) - .all() - } - } - - deserialize(data: RegionSerializedData): this { - this.code = data.code - this.name = data.name - this.countryCodes = new Collection(data.countryCodes) - this.countries = new Collection(data.countries).map((data: CountrySerializedData) => - new Country().deserialize(data) - ) - this.subdivisions = new Collection(data.subdivisions).map((data: SubdivisionSerializedData) => - new Subdivision().deserialize(data) - ) - this.cities = new Collection(data.cities).map((data: CitySerializedData) => - new City().deserialize(data) - ) - - return this - } -} diff --git a/scripts/models/stream.ts b/scripts/models/stream.ts index a465081ea6..c050930b4d 100644 --- a/scripts/models/stream.ts +++ b/scripts/models/stream.ts @@ -1,474 +1,461 @@ -import { - Feed, - Channel, - Category, - Region, - Subdivision, - Country, - Language, - Logo, - City -} from './index' -import { URL, Collection, Dictionary } from '@freearhey/core' -import type { StreamData } from '../types/stream' -import parser from 'iptv-playlist-parser' -import { IssueData } from '../core' -import path from 'node:path' - -export class Stream { - title: string - url: string - id?: string - channelId?: string - channel?: Channel - feedId?: string - feed?: Feed - logos: Collection = new Collection() - filepath?: string - line?: number - label?: string - verticalResolution?: number - isInterlaced?: boolean - referrer?: string - userAgent?: string - groupTitle: string = 'Undefined' - removed: boolean = false - directives: Collection = new Collection() - - constructor(data?: StreamData) { - if (!data) return - - const id = - data.channelId && data.feedId ? [data.channelId, data.feedId].join('@') : data.channelId - const { verticalResolution, isInterlaced } = parseQuality(data.quality) - - this.id = id || undefined - this.channelId = data.channelId || undefined - this.feedId = data.feedId || undefined - this.title = data.title || '' - this.url = data.url - this.referrer = data.referrer || undefined - this.userAgent = data.userAgent || undefined - this.verticalResolution = verticalResolution || undefined - this.isInterlaced = isInterlaced || undefined - this.label = data.label || undefined - this.directives = new Collection(data.directives) - } - - update(issueData: IssueData): this { - const data = { - label: issueData.getString('label'), - quality: issueData.getString('quality'), - httpUserAgent: issueData.getString('httpUserAgent'), - httpReferrer: issueData.getString('httpReferrer'), - newStreamUrl: issueData.getString('newStreamUrl'), - directives: issueData.getArray('directives') - } - - if (data.label !== undefined) this.label = data.label - if (data.quality !== undefined) this.setQuality(data.quality) - if (data.httpUserAgent !== undefined) this.userAgent = data.httpUserAgent - if (data.httpReferrer !== undefined) this.referrer = data.httpReferrer - if (data.newStreamUrl !== undefined) this.url = data.newStreamUrl - if (data.directives !== undefined) this.directives = new Collection(data.directives) - - return this - } - - fromPlaylistItem(data: parser.PlaylistItem): this { - function parseName(name: string): { - title: string - label: string - quality: string - } { - let title = name - const [, label] = title.match(/ \[(.*)\]$/) || [null, ''] - title = title.replace(new RegExp(` \\[${escapeRegExp(label)}\\]$`), '') - const [, quality] = title.match(/ \(([0-9]+p)\)$/) || [null, ''] - title = title.replace(new RegExp(` \\(${quality}\\)$`), '') - - return { title, label, quality } - } - - function parseDirectives(string: string) { - const directives = new Collection() - - if (!string) return directives - - const supportedDirectives = ['#EXTVLCOPT', '#KODIPROP'] - const lines = string.split('\r\n') - const regex = new RegExp(`^${supportedDirectives.join('|')}`, 'i') - - lines.forEach((line: string) => { - if (regex.test(line)) { - directives.add(line.trim()) - } - }) - - return directives - } - - if (!data.name) throw new Error('"name" property is required') - if (!data.url) throw new Error('"url" property is required') - - const [channelId, feedId] = data.tvg.id.split('@') - const { title, label, quality } = parseName(data.name) - const { verticalResolution, isInterlaced } = parseQuality(quality) - - this.id = data.tvg.id || undefined - this.feedId = feedId || undefined - this.channelId = channelId || undefined - this.line = data.line - this.label = label || undefined - this.title = title - this.verticalResolution = verticalResolution || undefined - this.isInterlaced = isInterlaced || undefined - this.url = data.url - this.referrer = data.http.referrer || undefined - this.userAgent = data.http['user-agent'] || undefined - this.directives = parseDirectives(data.raw) - - return this - } - - withChannel(channelsKeyById: Dictionary): this { - if (!this.channelId) return this - - this.channel = channelsKeyById.get(this.channelId) - - return this - } - - withFeed(feedsGroupedByChannelId: Dictionary): this { - if (!this.channelId) return this - - const channelFeeds = feedsGroupedByChannelId.get(this.channelId) || [] - if (this.feedId) this.feed = channelFeeds.find((feed: Feed) => feed.id === this.feedId) - if (!this.feedId && !this.feed) this.feed = channelFeeds.find((feed: Feed) => feed.isMain) - - return this - } - - withLogos(logosGroupedByStreamId: Dictionary): this { - if (this.id) this.logos = new Collection(logosGroupedByStreamId.get(this.id)) - - return this - } - - setId(id: string): this { - this.id = id - - return this - } - - setChannelId(channelId: string): this { - this.channelId = channelId - - return this - } - - setFeedId(feedId: string | undefined): this { - this.feedId = feedId - - return this - } - - setQuality(quality: string): this { - const { verticalResolution, isInterlaced } = parseQuality(quality) - - this.verticalResolution = verticalResolution || undefined - this.isInterlaced = isInterlaced || undefined - - return this - } - - getLine(): number { - return this.line || -1 - } - - getFilename(): string { - if (!this.filepath) return '' - - return path.basename(this.filepath) - } - - setFilepath(filepath: string): this { - this.filepath = filepath - - return this - } - - updateFilepath(): this { - if (!this.channel) return this - - this.filepath = `${this.channel.countryCode.toLowerCase()}.m3u` - - return this - } - - getChannelId(): string { - return this.channelId || '' - } - - getFeedId(): string { - if (this.feedId) return this.feedId - if (this.feed) return this.feed.id - return '' - } - - getFilepath(): string { - return this.filepath || '' - } - - getReferrer(): string { - return this.referrer || '' - } - - getUserAgent(): string { - return this.userAgent || '' - } - - getQuality(): string { - if (!this.verticalResolution) return '' - - let quality = this.verticalResolution.toString() - - if (this.isInterlaced) quality += 'i' - else quality += 'p' - - return quality - } - - hasId(): boolean { - return !!this.id - } - - hasQuality(): boolean { - return !!this.verticalResolution - } - - getVerticalResolution(): number { - if (!this.hasQuality()) return 0 - - return parseInt(this.getQuality().replace(/p|i/, '')) - } - - updateTitle(): this { - if (!this.channel) return this - - this.title = this.channel.name - if (this.feed && !this.feed.isMain) { - this.title += ` ${this.feed.name}` - } - - return this - } - - updateId(): this { - if (!this.channel) return this - if (this.feed) { - this.id = `${this.channel.id}@${this.feed.id}` - } else { - this.id = this.channel.id - } - - return this - } - - normalizeURL() { - const url = new URL(this.url) - - this.url = url.normalize().toString() - } - - clone(): Stream { - return Object.assign(Object.create(Object.getPrototypeOf(this)), this) - } - - hasChannel() { - return !!this.channel - } - - getBroadcastRegions(): Collection { - return this.feed ? this.feed.getBroadcastRegions() : new Collection() - } - - getBroadcastCountries(): Collection { - return this.feed ? this.feed.getBroadcastCountries() : new Collection() - } - - hasBroadcastArea(): boolean { - return this.feed ? this.feed.hasBroadcastArea() : false - } - - isSFW(): boolean { - return this.channel ? this.channel.isSFW() : true - } - - hasCategories(): boolean { - return this.channel ? this.channel.hasCategories() : false - } - - hasCategory(category: Category): boolean { - return this.channel ? this.channel.hasCategory(category) : false - } - - getCategoryNames(): string[] { - return this.getCategories() - .map((category: Category) => category.name) - .sort() - .all() - } - - getCategories(): Collection { - return this.channel ? this.channel.getCategories() : new Collection() - } - - getLanguages(): Collection { - return this.feed ? this.feed.getLanguages() : new Collection() - } - - hasLanguages() { - return this.feed ? this.feed.hasLanguages() : false - } - - hasLanguage(language: Language) { - return this.feed ? this.feed.hasLanguage(language) : false - } - - getBroadcastAreaCodes(): Collection { - return this.feed ? this.feed.broadcastAreaCodes : new Collection() - } - - isBroadcastInCity(city: City): boolean { - return this.feed ? this.feed.isBroadcastInCity(city) : false - } - - isBroadcastInSubdivision(subdivision: Subdivision): boolean { - return this.feed ? this.feed.isBroadcastInSubdivision(subdivision) : false - } - - isBroadcastInCountry(country: Country): boolean { - return this.feed ? this.feed.isBroadcastInCountry(country) : false - } - - isBroadcastInRegion(region: Region): boolean { - return this.feed ? this.feed.isBroadcastInRegion(region) : false - } - - isInternational(): boolean { - return this.feed ? this.feed.isInternational() : false - } - - getLogos(): Collection { - function format(logo: Logo): number { - const levelByFormat = { SVG: 0, PNG: 3, APNG: 1, WebP: 1, AVIF: 1, JPEG: 2, GIF: 1 } - - return logo.format ? levelByFormat[logo.format] : 0 - } - - function size(logo: Logo): number { - return Math.abs(512 - logo.width) + Math.abs(512 - logo.height) - } - - return this.logos.orderBy([format, size], ['desc', 'asc'], false) - } - - getLogo(): Logo | undefined { - return this.getLogos().first() - } - - hasLogo(): boolean { - return this.getLogos().notEmpty() - } - - getLogoUrl(): string { - let logo: Logo | undefined - - if (this.hasLogo()) logo = this.getLogo() - else logo = this?.channel?.getLogo() - - return logo ? logo.url : '' - } - - getTitle(): string { - return this.title || '' - } - - getFullTitle(): string { - let title = `${this.getTitle()}` - - if (this.getQuality()) { - title += ` (${this.getQuality()})` - } - - if (this.label) { - title += ` [${this.label}]` - } - - return title - } - - getLabel(): string { - return this.label || '' - } - - getId(): string { - return this.id || '' - } - - toJSON() { - return { - channel: this.channelId || null, - feed: this.feedId || null, - title: this.title, - url: this.url, - referrer: this.referrer || null, - user_agent: this.userAgent || null, - quality: this.getQuality() || null - } - } - - toString(options: { public: boolean }) { - let output = `#EXTINF:-1 tvg-id="${this.getId()}"` - - if (options.public) { - output += ` tvg-logo="${this.getLogoUrl()}" group-title="${this.groupTitle}"` - } - - if (this.referrer) { - output += ` http-referrer="${this.referrer}"` - } - - if (this.userAgent) { - output += ` http-user-agent="${this.userAgent}"` - } - - output += `,${this.getFullTitle()}` - - this.directives.forEach((prop: string) => { - output += `\r\n${prop}` - }) - - output += `\r\n${this.url}` - - return output - } -} - -function escapeRegExp(text) { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - -function parseQuality(quality: string | null): { - verticalResolution: number | null - isInterlaced: boolean | null -} { - if (!quality) return { verticalResolution: null, isInterlaced: null } - const [, verticalResolutionString] = quality.match(/^(\d+)/) || [null, undefined] - const isInterlaced = /i$/i.test(quality) - let verticalResolution = 0 - if (verticalResolutionString) verticalResolution = parseInt(verticalResolutionString) - - return { verticalResolution, isInterlaced } -} +import { Collection } from '@freearhey/core' +import parser from 'iptv-playlist-parser' +import { normalizeURL } from '../utils' +import * as sdk from '@iptv-org/sdk' +import { IssueData } from '../core' +import { data } from '../api' +import path from 'node:path' + +export class Stream extends sdk.Models.Stream { + directives: Collection + filepath?: string + line?: number + groupTitle: string = 'Undefined' + removed: boolean = false + tvgId?: string + label: string | null + + updateWithIssue(issueData: IssueData): this { + const data = { + label: issueData.getString('label'), + quality: issueData.getString('quality'), + httpUserAgent: issueData.getString('httpUserAgent'), + httpReferrer: issueData.getString('httpReferrer'), + newStreamUrl: issueData.getString('newStreamUrl'), + directives: issueData.getArray('directives') + } + + if (data.label !== undefined) this.label = data.label + if (data.quality !== undefined) this.quality = data.quality + if (data.httpUserAgent !== undefined) this.user_agent = data.httpUserAgent + if (data.httpReferrer !== undefined) this.referrer = data.httpReferrer + if (data.newStreamUrl !== undefined) this.url = data.newStreamUrl + if (data.directives !== undefined) this.setDirectives(data.directives) + + return this + } + + static fromPlaylistItem(data: parser.PlaylistItem): Stream { + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + } + + function parseName(name: string): { + title: string + label: string + quality: string + } { + let title = name + const [, label] = title.match(/ \[(.*)\]$/) || [null, ''] + title = title.replace(new RegExp(` \\[${escapeRegExp(label)}\\]$`), '') + const [, quality] = title.match(/ \(([0-9]+[p|i])\)$/) || [null, ''] + title = title.replace(new RegExp(` \\(${quality}\\)$`), '') + + return { title, label, quality } + } + + function parseDirectives(string: string): Collection { + const directives = new Collection() + + if (!string) return directives + + const supportedDirectives = ['#EXTVLCOPT', '#KODIPROP'] + const lines = string.split('\r\n') + const regex = new RegExp(`^${supportedDirectives.join('|')}`, 'i') + + lines.forEach((line: string) => { + if (regex.test(line)) { + directives.add(line.trim()) + } + }) + + return directives + } + + if (!data.name) throw new Error('"name" property is required') + if (!data.url) throw new Error('"url" property is required') + + const [channelId, feedId] = data.tvg.id.split('@') + const { title, label, quality } = parseName(data.name) + + const stream = new Stream({ + channel: channelId || null, + feed: feedId || null, + title: title, + quality: quality || null, + url: data.url, + referrer: data.http.referrer || null, + user_agent: data.http['user-agent'] || null + }) + + stream.tvgId = data.tvg.id + stream.line = data.line + stream.label = label || null + stream.directives = parseDirectives(data.raw) + + return stream + } + + isSFW(): boolean { + const channel = this.getChannel() + + if (!channel) return true + + return !channel.is_nsfw + } + + getUniqKey(): string { + const filepath = this.getFilepath() + const tvgId = this.getTvgId() + + return filepath + tvgId + this.url + } + + getVerticalResolution(): number { + if (!this.quality) return 0 + + const [, verticalResolutionString] = this.quality.match(/^(\d+)/) || ['', '0'] + + return parseInt(verticalResolutionString) + } + + getBroadcastCountries(): Collection { + const countries = new Collection() + + const feed = this.getFeed() + if (!feed) return countries + + feed + .getBroadcastArea() + .getLocations() + .forEach((location: sdk.Models.BroadcastAreaLocation) => { + let country: sdk.Models.Country | undefined + switch (location.type) { + case 'country': { + country = data.countriesKeyByCode.get(location.code) + break + } + case 'subdivision': { + const subdivision = data.subdivisionsKeyByCode.get(location.code) + if (!subdivision) break + country = data.countriesKeyByCode.get(subdivision.country) + break + } + case 'city': { + const city = data.citiesKeyByCode.get(location.code) + if (!city) break + country = data.countriesKeyByCode.get(city.country) + break + } + } + + if (country) countries.add(country) + }) + + return countries.uniqBy((country: sdk.Models.Country) => country.code) + } + + getBroadcastSubdivisions(): Collection { + const subdivisions = new Collection() + + const feed = this.getFeed() + if (!feed) return subdivisions + + feed + .getBroadcastArea() + .getLocations() + .forEach((location: sdk.Models.BroadcastAreaLocation) => { + switch (location.type) { + case 'subdivision': { + const subdivision = data.subdivisionsKeyByCode.get(location.code) + if (!subdivision) break + subdivisions.add(subdivision) + if (!subdivision.parent) break + const parentSubdivision = data.subdivisionsKeyByCode.get(subdivision.parent) + if (!parentSubdivision) break + subdivisions.add(parentSubdivision) + break + } + case 'city': { + const city = data.citiesKeyByCode.get(location.code) + if (!city || !city.subdivision) break + const subdivision = data.subdivisionsKeyByCode.get(city.subdivision) + if (!subdivision) break + subdivisions.add(subdivision) + if (!subdivision.parent) break + const parentSubdivision = data.subdivisionsKeyByCode.get(subdivision.parent) + if (!parentSubdivision) break + subdivisions.add(parentSubdivision) + break + } + } + }) + + return subdivisions.uniqBy((subdivision: sdk.Models.Subdivision) => subdivision.code) + } + + getBroadcastCities(): Collection { + const cities = new Collection() + + const feed = this.getFeed() + if (!feed) return cities + + feed + .getBroadcastArea() + .getLocations() + .forEach((location: sdk.Models.BroadcastAreaLocation) => { + if (location.type !== 'city') return + + const city = data.citiesKeyByCode.get(location.code) + + if (city) cities.add(city) + }) + + return cities.uniqBy((city: sdk.Models.City) => city.code) + } + + getBroadcastRegions(): Collection { + const regions = new Collection() + + const feed = this.getFeed() + if (!feed) return regions + + feed + .getBroadcastArea() + .getLocations() + .forEach((location: sdk.Models.BroadcastAreaLocation) => { + switch (location.type) { + case 'region': { + const region = data.regionsKeyByCode.get(location.code) + if (!region) break + regions.add(region) + + const relatedRegions = data.regions.filter((_region: sdk.Models.Region) => + new Collection(_region.countries) + .intersects(new Collection(region.countries)) + .isNotEmpty() + ) + regions.concat(relatedRegions) + break + } + case 'country': { + const country = data.countriesKeyByCode.get(location.code) + if (!country) break + const countryRegions = data.regions.filter((_region: sdk.Models.Region) => + new Collection(_region.countries).includes( + (code: string) => code === country.code + ) + ) + regions.concat(countryRegions) + break + } + case 'subdivision': { + const subdivision = data.subdivisionsKeyByCode.get(location.code) + if (!subdivision) break + const subdivisionRegions = data.regions.filter((_region: sdk.Models.Region) => + new Collection(_region.countries).includes( + (code: string) => code === subdivision.country + ) + ) + regions.concat(subdivisionRegions) + break + } + case 'city': { + const city = data.citiesKeyByCode.get(location.code) + if (!city) break + const cityRegions = data.regions.filter((_region: sdk.Models.Region) => + new Collection(_region.countries).includes( + (code: string) => code === city.country + ) + ) + regions.concat(cityRegions) + break + } + } + }) + + return regions.uniqBy((region: sdk.Models.Region) => region.code) + } + + isInternational(): boolean { + const feed = this.getFeed() + if (!feed) return false + + const broadcastAreaCodes = feed.getBroadcastArea().codes + if (broadcastAreaCodes.join(';').includes('r/')) return true + if (broadcastAreaCodes.filter(code => code.includes('c/')).length > 1) return true + + return false + } + + hasCategory(category: sdk.Models.Category): boolean { + const channel = this.getChannel() + + if (!channel) return false + + const found = channel.categories.find((id: string) => id === category.id) + + return !!found + } + + hasLanguage(language: sdk.Models.Language): boolean { + const found = this.getLanguages().find( + (_language: sdk.Models.Language) => _language.code === language.code + ) + + return !!found + } + + setDirectives(directives: string[]): this { + this.directives = new Collection(directives).filter((directive: string) => + /^(#KODIPROP|#EXTVLCOPT)/.test(directive) + ) + + return this + } + + updateTvgId(): this { + if (!this.channel) return this + if (this.feed) { + this.tvgId = `${this.channel}@${this.feed}` + } else { + this.tvgId = this.channel + } + + return this + } + + updateFilepath(): this { + const channel = this.getChannel() + if (!channel) return this + + this.filepath = `${channel.country.toLowerCase()}.m3u` + + return this + } + + updateTitle(): this { + const channel = this.getChannel() + + if (!channel) return this + + const feed = this.getFeed() + + this.title = channel.name + if (feed && !feed.is_main) { + this.title += ` ${feed.name}` + } + + return this + } + + normalizeURL() { + this.url = normalizeURL(this.url) + } + + getLogos(): Collection { + const logos = super.getLogos() + + if (logos.isEmpty()) return new Collection() + + function format(logo: sdk.Models.Logo): number { + const levelByFormat = { SVG: 0, PNG: 3, APNG: 1, WebP: 1, AVIF: 1, JPEG: 2, GIF: 1 } + + return logo.format ? levelByFormat[logo.format] : 0 + } + + function size(logo: sdk.Models.Logo): number { + return Math.abs(512 - logo.width) + Math.abs(512 - logo.height) + } + + return logos.sortBy([format, size], ['desc', 'asc'], false) + } + + getFilepath(): string { + return this.filepath || '' + } + + getFilename(): string { + return path.basename(this.getFilepath()) + } + + getLine(): number { + return this.line || -1 + } + + getTvgId(): string { + if (this.tvgId) return this.tvgId + + return this.getId() + } + + getTvgLogo(): string { + const logo = this.getLogos().first() + + return logo ? logo.url : '' + } + + getFullTitle(): string { + let title = `${this.title}` + + if (this.quality) { + title += ` (${this.quality})` + } + + if (this.label) { + title += ` [${this.label}]` + } + + return title + } + + toString(options: { public?: boolean } = {}) { + options = { ...{ public: false }, ...options } + + let output = `#EXTINF:-1 tvg-id="${this.getTvgId()}"` + + if (options.public) { + output += ` tvg-logo="${this.getTvgLogo()}" group-title="${this.groupTitle}"` + } + + if (this.referrer) { + output += ` http-referrer="${this.referrer}"` + } + + if (this.user_agent) { + output += ` http-user-agent="${this.user_agent}"` + } + + output += `,${this.getFullTitle()}` + + this.directives.forEach((prop: string) => { + output += `\r\n${prop}` + }) + + output += `\r\n${this.url}` + + return output + } + + toObject(): sdk.Types.StreamData { + let feedId = this.feed + if (!feedId) { + const feed = this.getFeed() + if (feed) feedId = feed.id + } + + return { + channel: this.channel, + feed: feedId, + title: this.title, + url: this.url, + quality: this.quality, + user_agent: this.user_agent, + referrer: this.referrer + } + } + + clone(): Stream { + return Object.assign(Object.create(Object.getPrototypeOf(this)), this) + } +} diff --git a/scripts/models/subdivision.ts b/scripts/models/subdivision.ts deleted file mode 100644 index b70bd4ac5b..0000000000 --- a/scripts/models/subdivision.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { SubdivisionData, SubdivisionSerializedData } from '../types/subdivision' -import { Dictionary, Collection } from '@freearhey/core' -import { Country, Region } from '.' - -export class Subdivision { - code: string - name: string - countryCode: string - country?: Country - parentCode?: string - parent?: Subdivision - regions?: Collection - cities?: Collection - - constructor(data?: SubdivisionData) { - if (!data) return - - this.code = data.code - this.name = data.name - this.countryCode = data.country - this.parentCode = data.parent || undefined - } - - withCountry(countriesKeyByCode: Dictionary): this { - this.country = countriesKeyByCode.get(this.countryCode) - - return this - } - - withRegions(regions: Collection): this { - this.regions = regions.filter((region: Region) => - region.countryCodes.includes(this.countryCode) - ) - - return this - } - - withCities(citiesGroupedBySubdivisionCode: Dictionary): this { - this.cities = new Collection(citiesGroupedBySubdivisionCode.get(this.code)) - - return this - } - - withParent(subdivisionsKeyByCode: Dictionary): this { - if (!this.parentCode) return this - - this.parent = subdivisionsKeyByCode.get(this.parentCode) - - return this - } - - getRegions(): Collection { - if (!this.regions) return new Collection() - - return this.regions - } - - getCities(): Collection { - if (!this.cities) return new Collection() - - return this.cities - } - - serialize(): SubdivisionSerializedData { - return { - code: this.code, - name: this.name, - countryCode: this.countryCode, - country: this.country ? this.country.serialize() : undefined, - parentCode: this.parentCode || null - } - } - - deserialize(data: SubdivisionSerializedData): this { - this.code = data.code - this.name = data.name - this.countryCode = data.countryCode - this.country = data.country ? new Country().deserialize(data.country) : undefined - this.parentCode = data.parentCode || undefined - - return this - } -} diff --git a/scripts/models/timezone.ts b/scripts/models/timezone.ts deleted file mode 100644 index e4071138fe..0000000000 --- a/scripts/models/timezone.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' - -type TimezoneData = { - id: string - utc_offset: string - countries: string[] -} - -export class Timezone { - id: string - utcOffset: string - countryCodes: Collection - countries?: Collection - - constructor(data: TimezoneData) { - this.id = data.id - this.utcOffset = data.utc_offset - this.countryCodes = new Collection(data.countries) - } - - withCountries(countriesKeyByCode: Dictionary): this { - this.countries = this.countryCodes.map((code: string) => countriesKeyByCode.get(code)) - - return this - } - - getCountries(): Collection { - return this.countries || new Collection() - } -} diff --git a/scripts/tables/categoriesTable.ts b/scripts/tables/categoriesTable.ts index 0b763e4162..ca1432d56e 100644 --- a/scripts/tables/categoriesTable.ts +++ b/scripts/tables/categoriesTable.ts @@ -1,56 +1,63 @@ -import { Storage, Collection, File, Dictionary } from '@freearhey/core' -import { HTMLTable, LogParser, LogItem } from '../core' -import { LOGS_DIR, README_DIR } from '../constants' -import { Category } from '../models' -import { Table } from './table' - -type CategoriesTableProps = { - categoriesKeyById: Dictionary -} - -export class CategoriesTable implements Table { - categoriesKeyById: Dictionary - - constructor({ categoriesKeyById }: CategoriesTableProps) { - this.categoriesKeyById = categoriesKeyById - } - - async make() { - const parser = new LogParser() - const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.load('generators.log') - - let items = new Collection() - parser - .parse(generatorsLog) - .filter((logItem: LogItem) => logItem.type === 'category') - .forEach((logItem: LogItem) => { - const file = new File(logItem.filepath) - const categoryId = file.name() - const category: Category = this.categoriesKeyById.get(categoryId) - - items.add([ - category ? category.name : 'ZZ', - category ? category.name : 'Undefined', - logItem.count, - `https://iptv-org.github.io/iptv/${logItem.filepath}` - ]) - }) - - items = items - .orderBy(item => item[0]) - .map(item => { - item.shift() - return item - }) - - const table = new HTMLTable(items.all(), [ - { name: 'Category' }, - { name: 'Channels', align: 'right' }, - { name: 'Playlist', nowrap: true } - ]) - - const readmeStorage = new Storage(README_DIR) - await readmeStorage.save('_categories.md', table.toString()) - } -} +import { HTMLTable, HTMLTableItem, LogParser, LogItem, HTMLTableColumn } from '../core' +import { Storage, File } from '@freearhey/storage-js' +import { LOGS_DIR, README_DIR } from '../constants' +import { Collection } from '@freearhey/core' +import * as sdk from '@iptv-org/sdk' +import { Table } from './table' +import { data } from '../api' + +export class CategoriesTable implements Table { + async create() { + const parser = new LogParser() + const logsStorage = new Storage(LOGS_DIR) + const generatorsLog = await logsStorage.load('generators.log') + + let items = new Collection() + parser + .parse(generatorsLog) + .filter((logItem: LogItem) => logItem.type === 'category') + .forEach((logItem: LogItem) => { + if (logItem.filepath.includes('undefined')) { + items.add([ + 'ZZ', + 'Undefined', + logItem.count.toString(), + `https://iptv-org.github.io/iptv/${logItem.filepath}` + ]) + + return + } + + const file = new File(logItem.filepath) + const categoryId = file.name() + const category: sdk.Models.Category | undefined = data.categoriesKeyById.get(categoryId) + + if (!category) return + + items.add([ + category.name, + category.name, + logItem.count.toString(), + `https://iptv-org.github.io/iptv/${logItem.filepath}` + ]) + }) + + items = items + .sortBy(item => item[0]) + .map(item => { + item.shift() + return item + }) + + const columns = new Collection([ + { name: 'Category' }, + { name: 'Channels', align: 'right' }, + { name: 'Playlist', nowrap: true } + ]) + + const table = new HTMLTable(items, columns) + + const readmeStorage = new Storage(README_DIR) + await readmeStorage.save('_categories.md', table.toString()) + } +} diff --git a/scripts/tables/countriesTable.ts b/scripts/tables/countriesTable.ts index 8c9d2173a4..95914f6d30 100644 --- a/scripts/tables/countriesTable.ts +++ b/scripts/tables/countriesTable.ts @@ -1,189 +1,176 @@ -import { Storage, Collection, Dictionary } from '@freearhey/core' -import { City, Country, Subdivision } from '../models' -import { LOGS_DIR, README_DIR } from '../constants' -import { LogParser, LogItem } from '../core' -import { Table } from './table' - -type CountriesTableProps = { - countriesKeyByCode: Dictionary - subdivisionsKeyByCode: Dictionary - countries: Collection - subdivisions: Collection - cities: Collection -} - -export class CountriesTable implements Table { - countriesKeyByCode: Dictionary - subdivisionsKeyByCode: Dictionary - countries: Collection - subdivisions: Collection - cities: Collection - - constructor({ - countriesKeyByCode, - subdivisionsKeyByCode, - countries, - subdivisions, - cities - }: CountriesTableProps) { - this.countriesKeyByCode = countriesKeyByCode - this.subdivisionsKeyByCode = subdivisionsKeyByCode - this.countries = countries - this.subdivisions = subdivisions - this.cities = cities - } - - async make() { - const parser = new LogParser() - const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.load('generators.log') - const parsed = parser.parse(generatorsLog) - const logCountries = parsed.filter((logItem: LogItem) => logItem.type === 'country') - const logSubdivisions = parsed.filter((logItem: LogItem) => logItem.type === 'subdivision') - const logCities = parsed.filter((logItem: LogItem) => logItem.type === 'city') - - let items = new Collection() - this.countries.forEach((country: Country) => { - const countriesLogItem = logCountries.find( - (logItem: LogItem) => logItem.filepath === `countries/${country.code.toLowerCase()}.m3u` - ) - - const countryItem = { - index: country.name, - count: 0, - link: `https://iptv-org.github.io/iptv/countries/${country.code.toLowerCase()}.m3u`, - name: `${country.flag} ${country.name}`, - children: new Collection() - } - - if (countriesLogItem) { - countryItem.count = countriesLogItem.count - } - - const countrySubdivisions = this.subdivisions.filter( - (subdivision: Subdivision) => subdivision.countryCode === country.code - ) - const countryCities = this.cities.filter((city: City) => city.countryCode === country.code) - if (countrySubdivisions.notEmpty()) { - this.subdivisions.forEach((subdivision: Subdivision) => { - if (subdivision.countryCode !== country.code) return - const subdivisionCities = countryCities.filter( - (city: City) => - (city.subdivisionCode && city.subdivisionCode === subdivision.code) || - city.countryCode === subdivision.countryCode - ) - const subdivisionsLogItem = logSubdivisions.find( - (logItem: LogItem) => - logItem.filepath === `subdivisions/${subdivision.code.toLowerCase()}.m3u` - ) - - const subdivisionItem = { - index: subdivision.name, - name: subdivision.name, - count: 0, - link: `https://iptv-org.github.io/iptv/subdivisions/${subdivision.code.toLowerCase()}.m3u`, - children: new Collection() - } - - if (subdivisionsLogItem) { - subdivisionItem.count = subdivisionsLogItem.count - } - - subdivisionCities.forEach((city: City) => { - if (city.countryCode !== country.code || city.subdivisionCode !== subdivision.code) - return - const citiesLogItem = logCities.find( - (logItem: LogItem) => logItem.filepath === `cities/${city.code.toLowerCase()}.m3u` - ) - - if (!citiesLogItem) return - - subdivisionItem.children.add({ - index: city.name, - name: city.name, - count: citiesLogItem.count, - link: `https://iptv-org.github.io/iptv/${citiesLogItem.filepath}` - }) - }) - - if (subdivisionItem.count > 0 || subdivisionItem.children.notEmpty()) { - countryItem.children.add(subdivisionItem) - } - }) - } else if (countryCities.notEmpty()) { - countryCities.forEach((city: City) => { - const citiesLogItem = logCities.find( - (logItem: LogItem) => logItem.filepath === `cities/${city.code.toLowerCase()}.m3u` - ) - - if (!citiesLogItem) return - - countryItem.children.add({ - index: city.name, - name: city.name, - count: citiesLogItem.count, - link: `https://iptv-org.github.io/iptv/${citiesLogItem.filepath}`, - children: new Collection() - }) - }) - } - - if (countryItem.count > 0 || countryItem.children.notEmpty()) { - items.add(countryItem) - } - }) - - const internationalLogItem = logCountries.find( - (logItem: LogItem) => logItem.filepath === 'countries/int.m3u' - ) - - if (internationalLogItem) { - items.push({ - index: 'ZZ', - name: '🌐 International', - count: internationalLogItem.count, - link: `https://iptv-org.github.io/iptv/${internationalLogItem.filepath}`, - children: new Collection() - }) - } - - const undefinedLogItem = logCountries.find( - (logItem: LogItem) => logItem.filepath === 'countries/undefined.m3u' - ) - - if (undefinedLogItem) { - items.push({ - index: 'ZZZ', - name: 'Undefined', - count: undefinedLogItem.count, - link: `https://iptv-org.github.io/iptv/${undefinedLogItem.filepath}`, - children: new Collection() - }) - } - - items = items.orderBy(item => item.index) - - const output = items - .map(item => { - let row = `- ${item.name} ${item.link}` - - item.children - .orderBy(item => item.index) - .forEach(item => { - row += `\r\n - ${item.name} ${item.link}` - - item.children - .orderBy(item => item.index) - .forEach(item => { - row += `\r\n - ${item.name} ${item.link}` - }) - }) - - return row - }) - .join('\r\n') - - const readmeStorage = new Storage(README_DIR) - await readmeStorage.save('_countries.md', output) - } -} +import { LOGS_DIR, README_DIR } from '../constants' +import { Storage } from '@freearhey/storage-js' +import { Collection } from '@freearhey/core' +import { LogParser, LogItem } from '../core' +import * as sdk from '@iptv-org/sdk' +import { Table } from './table' +import { data } from '../api' + +type ListItem = { + index: string + count: number + link: string + name: string + children: Collection +} + +export class CountriesTable implements Table { + async create() { + const parser = new LogParser() + const logsStorage = new Storage(LOGS_DIR) + const generatorsLog = await logsStorage.load('generators.log') + const parsed = parser.parse(generatorsLog) + const logCountries = parsed.filter((logItem: LogItem) => logItem.type === 'country') + const logSubdivisions = parsed.filter((logItem: LogItem) => logItem.type === 'subdivision') + const logCities = parsed.filter((logItem: LogItem) => logItem.type === 'city') + + let items = new Collection() + data.countries.forEach((country: sdk.Models.Country) => { + const countryCode = country.code + const countriesLogItem = logCountries.find( + (logItem: LogItem) => logItem.filepath === `countries/${countryCode.toLowerCase()}.m3u` + ) + + const countryItem: ListItem = { + index: country.name, + count: 0, + link: `https://iptv-org.github.io/iptv/countries/${countryCode.toLowerCase()}.m3u`, + name: `${country.flag} ${country.name}`, + children: new Collection() + } + + if (countriesLogItem) { + countryItem.count = countriesLogItem.count + } + + const countrySubdivisions = data.subdivisions.filter( + (subdivision: sdk.Models.Subdivision) => subdivision.country === countryCode + ) + const countryCities = data.cities.filter( + (city: sdk.Models.City) => city.country === countryCode + ) + if (countrySubdivisions.isNotEmpty()) { + data.subdivisions.forEach((subdivision: sdk.Models.Subdivision) => { + if (subdivision.country !== countryCode) return + + const subdivisionCode = subdivision.code + const subdivisionCities = countryCities.filter( + (city: sdk.Models.City) => + (city.subdivision && city.subdivision === subdivisionCode) || + city.country === subdivision.country + ) + const subdivisionsLogItem = logSubdivisions.find( + (logItem: LogItem) => + logItem.filepath === `subdivisions/${subdivisionCode.toLowerCase()}.m3u` + ) + + const subdivisionItem: ListItem = { + index: subdivision.name, + name: subdivision.name, + count: 0, + link: `https://iptv-org.github.io/iptv/subdivisions/${subdivisionCode.toLowerCase()}.m3u`, + children: new Collection() + } + + if (subdivisionsLogItem) { + subdivisionItem.count = subdivisionsLogItem.count + } + + subdivisionCities.forEach((city: sdk.Models.City) => { + if (city.country !== countryCode || city.subdivision !== subdivisionCode) return + const citiesLogItem = logCities.find( + (logItem: LogItem) => logItem.filepath === `cities/${city.code.toLowerCase()}.m3u` + ) + + if (!citiesLogItem) return + + subdivisionItem.children.add({ + index: city.name, + name: city.name, + count: citiesLogItem.count, + link: `https://iptv-org.github.io/iptv/${citiesLogItem.filepath}`, + children: new Collection() + }) + }) + + if (subdivisionItem.count > 0 || subdivisionItem.children.isNotEmpty()) { + countryItem.children.add(subdivisionItem) + } + }) + } else if (countryCities.isNotEmpty()) { + countryCities.forEach((city: sdk.Models.City) => { + const citiesLogItem = logCities.find( + (logItem: LogItem) => logItem.filepath === `cities/${city.code.toLowerCase()}.m3u` + ) + + if (!citiesLogItem) return + + countryItem.children.add({ + index: city.name, + name: city.name, + count: citiesLogItem.count, + link: `https://iptv-org.github.io/iptv/${citiesLogItem.filepath}`, + children: new Collection() + }) + }) + } + + if (countryItem.count > 0 || countryItem.children.isNotEmpty()) { + items.add(countryItem) + } + }) + + const internationalLogItem = logCountries.find( + (logItem: LogItem) => logItem.filepath === 'countries/int.m3u' + ) + + if (internationalLogItem) { + items.add({ + index: 'ZZ', + name: '🌐 International', + count: internationalLogItem.count, + link: `https://iptv-org.github.io/iptv/${internationalLogItem.filepath}`, + children: new Collection() + }) + } + + const undefinedLogItem = logCountries.find( + (logItem: LogItem) => logItem.filepath === 'countries/undefined.m3u' + ) + + if (undefinedLogItem) { + items.add({ + index: 'ZZZ', + name: 'Undefined', + count: undefinedLogItem.count, + link: `https://iptv-org.github.io/iptv/${undefinedLogItem.filepath}`, + children: new Collection() + }) + } + + items = items.sortBy(item => item.index) + + const output = items + .map((item: ListItem) => { + let row = `- ${item.name} ${item.link}` + + item.children + .sortBy((item: ListItem) => item.index) + .forEach((item: ListItem) => { + row += `\r\n - ${item.name} ${item.link}` + + item.children + .sortBy((item: ListItem) => item.index) + .forEach((item: ListItem) => { + row += `\r\n - ${item.name} ${item.link}` + }) + }) + + return row + }) + .join('\r\n') + + const readmeStorage = new Storage(README_DIR) + await readmeStorage.save('_countries.md', output) + } +} diff --git a/scripts/tables/languagesTable.ts b/scripts/tables/languagesTable.ts index 7621907453..469166fade 100644 --- a/scripts/tables/languagesTable.ts +++ b/scripts/tables/languagesTable.ts @@ -1,56 +1,63 @@ -import { Storage, Collection, File, Dictionary } from '@freearhey/core' -import { HTMLTable, LogParser, LogItem } from '../core' -import { LOGS_DIR, README_DIR } from '../constants' -import { Language } from '../models' -import { Table } from './table' - -type LanguagesTableProps = { - languagesKeyByCode: Dictionary -} - -export class LanguagesTable implements Table { - languagesKeyByCode: Dictionary - - constructor({ languagesKeyByCode }: LanguagesTableProps) { - this.languagesKeyByCode = languagesKeyByCode - } - - async make() { - const parser = new LogParser() - const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.load('generators.log') - - let data = new Collection() - parser - .parse(generatorsLog) - .filter((logItem: LogItem) => logItem.type === 'language') - .forEach((logItem: LogItem) => { - const file = new File(logItem.filepath) - const languageCode = file.name() - const language: Language = this.languagesKeyByCode.get(languageCode) - - data.add([ - language ? language.name : 'ZZ', - language ? language.name : 'Undefined', - logItem.count, - `https://iptv-org.github.io/iptv/${logItem.filepath}` - ]) - }) - - data = data - .orderBy(item => item[0]) - .map(item => { - item.shift() - return item - }) - - const table = new HTMLTable(data.all(), [ - { name: 'Language', align: 'left' }, - { name: 'Channels', align: 'right' }, - { name: 'Playlist', align: 'left', nowrap: true } - ]) - - const readmeStorage = new Storage(README_DIR) - await readmeStorage.save('_languages.md', table.toString()) - } -} +import { HTMLTable, LogParser, LogItem, HTMLTableColumn, HTMLTableItem } from '../core' +import { Storage, File } from '@freearhey/storage-js' +import { LOGS_DIR, README_DIR } from '../constants' +import { Collection } from '@freearhey/core' +import * as sdk from '@iptv-org/sdk' +import { Table } from './table' +import { data } from '../api' + +export class LanguagesTable implements Table { + async create() { + const parser = new LogParser() + const logsStorage = new Storage(LOGS_DIR) + const generatorsLog = await logsStorage.load('generators.log') + + let items = new Collection() + parser + .parse(generatorsLog) + .filter((logItem: LogItem) => logItem.type === 'language') + .forEach((logItem: LogItem) => { + if (logItem.filepath.includes('undefined')) { + items.add([ + 'ZZ', + 'Undefined', + logItem.count.toString(), + `https://iptv-org.github.io/iptv/${logItem.filepath}` + ]) + + return + } + + const file = new File(logItem.filepath) + const languageCode = file.name() + const language: sdk.Models.Language | undefined = data.languagesKeyByCode.get(languageCode) + + if (!language) return + + items.add([ + language.name, + language.name, + logItem.count.toString(), + `https://iptv-org.github.io/iptv/${logItem.filepath}` + ]) + }) + + items = items + .sortBy(item => item[0]) + .map(item => { + item.shift() + return item + }) + + const columns = new Collection([ + { name: 'Language', align: 'left' }, + { name: 'Channels', align: 'right' }, + { name: 'Playlist', align: 'left', nowrap: true } + ]) + + const table = new HTMLTable(items, columns) + + const readmeStorage = new Storage(README_DIR) + await readmeStorage.save('_languages.md', table.toString()) + } +} diff --git a/scripts/tables/regionsTable.ts b/scripts/tables/regionsTable.ts index 2bf4b74f4f..39c58d98b7 100644 --- a/scripts/tables/regionsTable.ts +++ b/scripts/tables/regionsTable.ts @@ -1,52 +1,49 @@ -import { Storage, Collection } from '@freearhey/core' -import { LogParser, LogItem } from '../core' -import { LOGS_DIR, README_DIR } from '../constants' -import { Region } from '../models' -import { Table } from './table' - -type RegionsTableProps = { - regions: Collection -} - -export class RegionsTable implements Table { - regions: Collection - - constructor({ regions }: RegionsTableProps) { - this.regions = regions - } - - async make() { - const parser = new LogParser() - const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.load('generators.log') - const parsed = parser.parse(generatorsLog) - const logRegions = parsed.filter((logItem: LogItem) => logItem.type === 'region') - - let items = new Collection() - this.regions.forEach((region: Region) => { - const logItem = logRegions.find( - (logItem: LogItem) => logItem.filepath === `regions/${region.code.toLowerCase()}.m3u` - ) - - if (!logItem) return - - items.add({ - index: region.name, - name: region.name, - count: logItem.count, - link: `https://iptv-org.github.io/iptv/${logItem.filepath}` - }) - }) - - items = items.orderBy(item => item.index) - - const output = items - .map(item => { - return `- ${item.name} ${item.link}` - }) - .join('\r\n') - - const readmeStorage = new Storage(README_DIR) - await readmeStorage.save('_regions.md', output) - } -} +import { LOGS_DIR, README_DIR } from '../constants' +import { Storage } from '@freearhey/storage-js' +import { LogParser, LogItem } from '../core' +import { Collection } from '@freearhey/core' +import * as sdk from '@iptv-org/sdk' +import { Table } from './table' +import { data } from '../api' + +type ListItem = { + name: string + count: number + link: string +} + +export class RegionsTable implements Table { + async create() { + const parser = new LogParser() + const logsStorage = new Storage(LOGS_DIR) + const generatorsLog = await logsStorage.load('generators.log') + const parsed = parser.parse(generatorsLog) + const logRegions = parsed.filter((logItem: LogItem) => logItem.type === 'region') + + let items = new Collection() + data.regions.forEach((region: sdk.Models.Region) => { + const logItem = logRegions.find( + (logItem: LogItem) => logItem.filepath === `regions/${region.code.toLowerCase()}.m3u` + ) + + if (!logItem) return + + items.add({ + name: region.name, + count: logItem.count, + link: `https://iptv-org.github.io/iptv/${logItem.filepath}` + }) + }) + + items = items.sortBy(item => item.name) + + const output = items + .map(item => { + return `- ${item.name} ${item.link}` + }) + .join('\r\n') + + const readmeStorage = new Storage(README_DIR) + await readmeStorage.save('_regions.md', output) + } +} diff --git a/scripts/tables/table.ts b/scripts/tables/table.ts index b8bd21bd7e..b342b5e7e8 100644 --- a/scripts/tables/table.ts +++ b/scripts/tables/table.ts @@ -1,3 +1,3 @@ -export interface Table { - make(): void -} +export interface Table { + create(): void +} diff --git a/scripts/types/blocklistRecord.d.ts b/scripts/types/blocklistRecord.d.ts deleted file mode 100644 index 4b1d9e7dc8..0000000000 --- a/scripts/types/blocklistRecord.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type BlocklistRecordData = { - channel: string - reason: string - ref: string -} diff --git a/scripts/types/category.d.ts b/scripts/types/category.d.ts deleted file mode 100644 index e78d6c62ed..0000000000 --- a/scripts/types/category.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type CategorySerializedData = { - id: string - name: string -} - -export type CategoryData = { - id: string - name: string -} diff --git a/scripts/types/channel.d.ts b/scripts/types/channel.d.ts deleted file mode 100644 index 814fc53a79..0000000000 --- a/scripts/types/channel.d.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Collection } from '@freearhey/core' -import type { CountrySerializedData } from './country' -import type { SubdivisionSerializedData } from './subdivision' -import type { CategorySerializedData } from './category' - -export type ChannelSerializedData = { - id: string - name: string - altNames: string[] - network?: string - owners: string[] - countryCode: string - country?: CountrySerializedData - subdivisionCode?: string - subdivision?: SubdivisionSerializedData - cityName?: string - categoryIds: string[] - categories?: CategorySerializedData[] - isNSFW: boolean - launched?: string - closed?: string - replacedBy?: string - website?: string -} - -export type ChannelData = { - id: string - name: string - alt_names: string[] - network: string - owners: Collection - country: string - subdivision: string - city: string - categories: Collection - is_nsfw: boolean - launched: string - closed: string - replaced_by: string - website: string -} - -export type ChannelSearchableData = { - id: string - name: string - altNames: string[] - guideNames: string[] - streamTitles: string[] - feedFullNames: string[] -} diff --git a/scripts/types/city.d.ts b/scripts/types/city.d.ts deleted file mode 100644 index 5c33ba5a9e..0000000000 --- a/scripts/types/city.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CountrySerializedData } from './country' -import { SubdivisionSerializedData } from './subdivision' - -export type CitySerializedData = { - code: string - name: string - countryCode: string - country?: CountrySerializedData - subdivisionCode: string | null - subdivision?: SubdivisionSerializedData - wikidataId: string -} - -export type CityData = { - code: string - name: string - country: string - subdivision: string | null - wikidata_id: string -} diff --git a/scripts/types/country.d.ts b/scripts/types/country.d.ts deleted file mode 100644 index 9554d4c68c..0000000000 --- a/scripts/types/country.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { LanguageSerializedData } from './language' -import type { SubdivisionSerializedData } from './subdivision' -import type { RegionSerializedData } from './region' - -export type CountrySerializedData = { - code: string - name: string - flag: string - languageCode: string - language: LanguageSerializedData | null - subdivisions: SubdivisionSerializedData[] - regions: RegionSerializedData[] -} - -export type CountryData = { - code: string - name: string - lang: string - flag: string -} diff --git a/scripts/types/dataLoader.d.ts b/scripts/types/dataLoader.d.ts deleted file mode 100644 index 708361de99..0000000000 --- a/scripts/types/dataLoader.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Storage } from '@freearhey/core' - -export type DataLoaderProps = { - storage: Storage -} - -export type DataLoaderData = { - countries: object | object[] - regions: object | object[] - subdivisions: object | object[] - languages: object | object[] - categories: object | object[] - blocklist: object | object[] - channels: object | object[] - feeds: object | object[] - logos: object | object[] - timezones: object | object[] - guides: object | object[] - streams: object | object[] - cities: object | object[] -} diff --git a/scripts/types/dataProcessor.d.ts b/scripts/types/dataProcessor.d.ts deleted file mode 100644 index bc76dc28b4..0000000000 --- a/scripts/types/dataProcessor.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Collection, Dictionary } from '@freearhey/core' - -export type DataProcessorData = { - blocklistRecordsGroupedByChannelId: Dictionary - subdivisionsGroupedByCountryCode: Dictionary - feedsGroupedByChannelId: Dictionary - guidesGroupedByStreamId: Dictionary - logosGroupedByStreamId: Dictionary - subdivisionsKeyByCode: Dictionary - countriesKeyByCode: Dictionary - languagesKeyByCode: Dictionary - streamsGroupedById: Dictionary - categoriesKeyById: Dictionary - timezonesKeyById: Dictionary - regionsKeyByCode: Dictionary - blocklistRecords: Collection - channelsKeyById: Dictionary - citiesKeyByCode: Dictionary - subdivisions: Collection - categories: Collection - countries: Collection - languages: Collection - timezones: Collection - channels: Collection - regions: Collection - streams: Collection - cities: Collection - guides: Collection - feeds: Collection - logos: Collection -} diff --git a/scripts/types/feed.d.ts b/scripts/types/feed.d.ts deleted file mode 100644 index ef4aea4669..0000000000 --- a/scripts/types/feed.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type FeedData = { - channel: string - id: string - name: string - is_main: boolean - broadcast_area: string[] - languages: string[] - timezones: string[] - video_format: string -} diff --git a/scripts/types/guide.d.ts b/scripts/types/guide.d.ts deleted file mode 100644 index 63a6ecdb19..0000000000 --- a/scripts/types/guide.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -export type GuideSerializedData = { - channelId?: string - feedId?: string - siteDomain: string - siteId: string - siteName: string - languageCode: string -} - -export type GuideData = { - channel: string - feed: string - site: string - site_id: string - site_name: string - lang: string -} diff --git a/scripts/types/language.d.ts b/scripts/types/language.d.ts deleted file mode 100644 index 2b9d4525c0..0000000000 --- a/scripts/types/language.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type LanguageSerializedData = { - code: string - name: string -} - -export type LanguageData = { - code: string - name: string -} diff --git a/scripts/types/logo.d.ts b/scripts/types/logo.d.ts deleted file mode 100644 index 47cc384537..0000000000 --- a/scripts/types/logo.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type LogoData = { - channel: string - feed: string | null - tags: string[] - width: number - height: number - format: string | null - url: string -} diff --git a/scripts/types/region.d.ts b/scripts/types/region.d.ts deleted file mode 100644 index 798224ee7f..0000000000 --- a/scripts/types/region.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CitySerializedData } from './city' -import { CountrySerializedData } from './country' -import { SubdivisionSerializedData } from './subdivision' - -export type RegionSerializedData = { - code: string - name: string - countryCodes: string[] - countries?: CountrySerializedData[] - subdivisions?: SubdivisionSerializedData[] - cities?: CitySerializedData[] -} - -export type RegionData = { - code: string - name: string - countries: string[] -} diff --git a/scripts/types/stream.d.ts b/scripts/types/stream.d.ts deleted file mode 100644 index aebd4bbd9f..0000000000 --- a/scripts/types/stream.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type StreamData = { - channelId: string | null - feedId: string | null - title: string | null - url: string - referrer: string | null - userAgent: string | null - quality: string | null - label: string | null - directives: string[] -} diff --git a/scripts/types/subdivision.d.ts b/scripts/types/subdivision.d.ts deleted file mode 100644 index b2a25982dd..0000000000 --- a/scripts/types/subdivision.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CountrySerializedData } from './country' - -export type SubdivisionSerializedData = { - code: string - name: string - countryCode: string - country?: CountrySerializedData - parentCode: string | null -} - -export type SubdivisionData = { - code: string - name: string - country: string - parent: string | null -} diff --git a/scripts/utils.ts b/scripts/utils.ts index 7ff419de21..d58b80406d 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -1,8 +1,23 @@ -export function isURI(string: string): boolean { - try { - new URL(string) - return true - } catch { - return false - } -} +import normalizeUrl from 'normalize-url' + +export function isURI(string: string): boolean { + try { + new URL(string) + return true + } catch { + return false + } +} + +export function normalizeURL(url: string): string { + const normalized = normalizeUrl(url, { stripWWW: false }) + + return decodeURIComponent(normalized).replace(/\s/g, '+').toString() +} + +export function truncate(string: string, limit: number = 100) { + if (!string) return string + if (string.length < limit) return string + + return string.slice(0, limit - 3) + '...' +} From 705f7daece322aee72bb9b4f6b80c68604ab4007 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:25:48 +0300 Subject: [PATCH 34/51] Update dependencies --- package-lock.json | 15752 ++++++++++++++++++++++---------------------- package.json | 164 +- 2 files changed, 7987 insertions(+), 7929 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3503626d19..84cff3f8bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7849 +1,7903 @@ -{ - "name": "iptv", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "iptv", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@alex_neo/jest-expect-message": "^1.0.5", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.32.0", - "@freearhey/core": "^0.10.2", - "@freearhey/search-js": "^0.1.2", - "@inquirer/prompts": "^7.8.0", - "@octokit/core": "^7.0.3", - "@octokit/plugin-paginate-rest": "^13.1.1", - "@octokit/plugin-rest-endpoint-methods": "^16.0.0", - "@octokit/types": "^14.1.0", - "@stylistic/eslint-plugin": "^5.2.2", - "@swc/jest": "^0.2.39", - "@types/async": "^3.2.25", - "@types/cli-progress": "^3.11.6", - "@types/fs-extra": "^11.0.4", - "@types/jest": "^30.0.0", - "@types/lodash.uniqueid": "^4.0.9", - "@typescript-eslint/eslint-plugin": "^8.38.0", - "@typescript-eslint/parser": "^8.38.0", - "async-es": "^3.2.6", - "axios": "^1.11.0", - "chalk": "^5.4.1", - "cli-progress": "^3.12.0", - "commander": "^14.0.0", - "console-table-printer": "^2.14.6", - "cross-env": "^10.0.0", - "eslint": "^9.32.0", - "glob": "^11.0.3", - "globals": "^16.3.0", - "iptv-playlist-parser": "^0.15.0", - "jest": "^30.0.5", - "jest-expect-message": "^1.1.3", - "lodash.uniqueid": "^4.0.1", - "m3u-linter": "^0.4.2", - "mediainfo.js": "^0.3.6", - "node-cleanup": "^2.1.2", - "socks-proxy-agent": "^8.0.5", - "tsx": "^4.20.3" - } - }, - "node_modules/@alex_neo/jest-expect-message": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@alex_neo/jest-expect-message/-/jest-expect-message-1.0.5.tgz", - "integrity": "sha512-1eBykZCd0pPGl5qKtV6Z5ARA6yuhXzHsVN2h5GH5/H6svYa37Jr7vMio5OFpiw1LBHtscrZs7amSkZkcwm0cvQ==" - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "license": "MIT" - }, - "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@epic-web/invariant": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@freearhey/core": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@freearhey/core/-/core-0.10.2.tgz", - "integrity": "sha512-crIE1oVYnhmCvISuNvJ4eP70tmoPzCTg6emlPxDIimu8LAtC8FVyckC04nBQCMYaXjLuju7tI80vHmKRBXniVg==", - "license": "MIT", - "dependencies": { - "consola": "^3.4.2", - "dayjs": "^1.11.13", - "fs-extra": "^11.3.0", - "glob": "^11.0.1", - "lodash": "^4.17.21", - "natural-orderby": "^5.0.0", - "normalize-url": "^6.1.0", - "object-treeify": "^2.1.1", - "pako": "^2.1.0", - "timer-node": "^5.0.9" - } - }, - "node_modules/@freearhey/search-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.1.2.tgz", - "integrity": "sha512-F2o+xpGCXOK4OsZfKEHfXNNkAZmny2eBnPOp+P0iyV20ja7gJGfTFaEc6okcuEo6OB6P7LnSxTvISkoArFtlfg==", - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", - "integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", - "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.0.tgz", - "integrity": "sha512-JHwGbQ6wjf1dxxnalDYpZwZxUEosT+6CPGD9Zh4sm9WXdtUp9XODCQD3NjSTmu+0OAyxWXNOqf0spjIymJa2Tw==", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.2.0", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.15", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", - "micromatch": "^4.0.8", - "pretty-format": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.0.5.tgz", - "integrity": "sha512-W1kmkwPq/WTMQWgvbzWSCbXSqvjI6rkqBQCxuvYmd+g6o4b5gHP98ikfh/Ei0SKzHvWdI84TOXp0hRcbpr8Q0w==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-mock": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", - "license": "MIT", - "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@jest/reporters/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.0.5", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/core": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz", - "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.1", - "@octokit/request": "^10.0.2", - "@octokit/request-error": "^7.0.0", - "@octokit/types": "^14.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/endpoint": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", - "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", - "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^10.0.2", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", - "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz", - "integrity": "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.1.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz", - "integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.1.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/request": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", - "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^11.0.0", - "@octokit/request-error": "^7.0.0", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^3.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/request-error": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", - "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^14.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.38", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", - "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz", - "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.37.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@swc/core": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", - "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.21" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.24", - "@swc/core-darwin-x64": "1.11.24", - "@swc/core-linux-arm-gnueabihf": "1.11.24", - "@swc/core-linux-arm64-gnu": "1.11.24", - "@swc/core-linux-arm64-musl": "1.11.24", - "@swc/core-linux-x64-gnu": "1.11.24", - "@swc/core-linux-x64-musl": "1.11.24", - "@swc/core-win32-arm64-msvc": "1.11.24", - "@swc/core-win32-ia32-msvc": "1.11.24", - "@swc/core-win32-x64-msvc": "1.11.24" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", - "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", - "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", - "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", - "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", - "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", - "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", - "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", - "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", - "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", - "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/jest": { - "version": "0.2.39", - "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", - "integrity": "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==", - "license": "MIT", - "dependencies": { - "@jest/create-cache-key-function": "^30.0.0", - "@swc/counter": "^0.1.3", - "jsonc-parser": "^3.2.0" - }, - "engines": { - "npm": ">= 7.0.0" - }, - "peerDependencies": { - "@swc/core": "*" - } - }, - "node_modules/@swc/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", - "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", - "peer": true, - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/async": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz", - "integrity": "sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cli-progress": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", - "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" - }, - "node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "license": "MIT" - }, - "node_modules/@types/lodash.uniqueid": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/lodash.uniqueid/-/lodash.uniqueid-4.0.9.tgz", - "integrity": "sha512-SEzkJBS8t+tqAUnSmyqbuWqxKU+Z/Xu2cgPtD+Ik0l+M7L2q7So9VoN2rQ8H0mmL87lJ00ykxal8oB54QRet6g==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.38.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/async-es": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async-es/-/async-es-3.2.6.tgz", - "integrity": "sha512-9C2+oOPd7/EzIeneF4k24o75oY7OcHU/Isl7xIot12EBRwXonyuqKsmxwLuAbFWL6B/FucTQip09xTbiu1CA8A==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", - "license": "MIT", - "dependencies": { - "@jest/transform": "30.0.5", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "license": "Apache-2.0" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" - }, - "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", - "license": "MIT" - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-table-printer": { - "version": "2.14.6", - "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.6.tgz", - "integrity": "sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==", - "license": "MIT", - "dependencies": { - "simple-wcswidth": "^1.0.1" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz", - "integrity": "sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==", - "license": "MIT", - "dependencies": { - "@epic-web/invariant": "^1.0.0", - "cross-spawn": "^7.0.6" - }, - "bin": { - "cross-env": "dist/bin/cross-env.js", - "cross-env-shell": "dist/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.192", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", - "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz", - "integrity": "sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/iptv-playlist-parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/iptv-playlist-parser/-/iptv-playlist-parser-0.15.0.tgz", - "integrity": "sha512-9EGiQ5y95UZsV24HBSHuSyOuqzFR4YCAm7X8MqJNHlcm9jP38DHH7inYU0YJuXVq9fAttij3Yh8MJZkV1Bu/SA==", - "dependencies": { - "is-valid-path": "^0.1.1", - "validator": "^13.7.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", - "license": "MIT", - "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", - "import-local": "^3.2.0", - "jest-cli": "30.0.5" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.0.5", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "p-limit": "^3.1.0", - "pretty-format": "30.0.5", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", - "license": "MIT", - "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "micromatch": "^4.0.8", - "parse-json": "^5.2.0", - "pretty-format": "30.0.5", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-config/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", - "chalk": "^4.1.2", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-expect-message": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.1.3.tgz", - "integrity": "sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==" - }, - "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", - "micromatch": "^4.0.8", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.0.5", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-runtime/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", - "chalk": "^4.1.2", - "expect": "30.0.5", - "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.0.5", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.uniqueid": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz", - "integrity": "sha512-GQQWaIeGlL6DIIr06kj1j6sSmBxyNMwI8kaX9aKpHR/XsMTiaXDVPNPAkiboOTK9OJpTJF/dXT3xYoFQnj386Q==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/m3u-linter": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/m3u-linter/-/m3u-linter-0.4.2.tgz", - "integrity": "sha512-KeUirh5JnGRuFDb+7tsc8Dkb+q/slco3hszKE7lwbmGKKo+QnSr7198e1ATYZ9HkY8sbvEQBuTj2hPsv9o3gGw==", - "dependencies": { - "chalk": "^4.1.1", - "commander": "^7.2.0", - "glob": "^11.0.0", - "is-valid-path": "^0.1.1" - }, - "bin": { - "m3u-linter": "bin/m3u-linter.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/m3u-linter/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/m3u-linter/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mediainfo.js": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.6.tgz", - "integrity": "sha512-3xVRlxwlVWIZV3z1q7pb8LzFOO7iKi/DXoRiFRZdOlrUEhPyJDaaRt0uK32yQJabArQicRBeq7cRxmdZlIBTyA==", - "dependencies": { - "yargs": "^18.0.0" - }, - "bin": { - "mediainfo.js": "dist/esm/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/mediainfo.js/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/mediainfo.js/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/mediainfo.js/node_modules/emoji-regex": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", - "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==" - }, - "node_modules/mediainfo.js/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mediainfo.js/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/mediainfo.js/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/mediainfo.js/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", - "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-orderby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", - "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-treeify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-2.1.1.tgz", - "integrity": "sha512-ofXhazOvXTYWbbibExMiS+asaTbYG/ZWopVroXFFOdjmc8ehXMq9R2VUaTx/C3CnZkQbT52wAZT4DrBLK/nQfw==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-wcswidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz", - "integrity": "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/timer-node": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/timer-node/-/timer-node-5.0.9.tgz", - "integrity": "sha512-zXxCE/5/YDi0hY9pygqgRqjRbrFRzigYxOudG0I3syaqAAmX9/w9sxex1bNFCN6c1S66RwPtEIJv65dN+1psew==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - }, - "node_modules/universal-user-agent": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validator": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", - "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} +{ + "name": "iptv", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iptv", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@alex_neo/jest-expect-message": "^1.0.5", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.32.0", + "@freearhey/core": "^0.14.3", + "@freearhey/search-js": "^0.1.2", + "@freearhey/storage-js": "^0.1.0", + "@inquirer/prompts": "^7.8.0", + "@iptv-org/sdk": "^1.0.2", + "@octokit/core": "^7.0.3", + "@octokit/plugin-paginate-rest": "^13.1.1", + "@octokit/plugin-rest-endpoint-methods": "^16.0.0", + "@octokit/types": "^14.1.0", + "@stylistic/eslint-plugin": "^5.2.2", + "@swc/jest": "^0.2.39", + "@types/async": "^3.2.25", + "@types/cli-progress": "^3.11.6", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^30.0.0", + "@types/lodash.uniqueid": "^4.0.9", + "@types/node-cleanup": "^2.1.5", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "async": "^3.2.6", + "axios": "^1.11.0", + "chalk": "^5.4.1", + "cli-progress": "^3.12.0", + "commander": "^14.0.0", + "console-table-printer": "^2.14.6", + "cross-env": "^10.0.0", + "eslint": "^9.32.0", + "glob": "^11.0.3", + "globals": "^16.3.0", + "iptv-playlist-parser": "^0.15.0", + "jest": "^30.0.5", + "jest-expect-message": "^1.1.3", + "lodash.uniqueid": "^4.0.1", + "m3u-linter": "^0.4.2", + "mediainfo.js": "^0.3.6", + "node-cleanup": "^2.1.2", + "normalize-url": "^8.1.0", + "socks-proxy-agent": "^8.0.5", + "tsx": "^4.20.3" + } + }, + "node_modules/@alex_neo/jest-expect-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@alex_neo/jest-expect-message/-/jest-expect-message-1.0.5.tgz", + "integrity": "sha512-1eBykZCd0pPGl5qKtV6Z5ARA6yuhXzHsVN2h5GH5/H6svYa37Jr7vMio5OFpiw1LBHtscrZs7amSkZkcwm0cvQ==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", + "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", + "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", + "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", + "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", + "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", + "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", + "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", + "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", + "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", + "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", + "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", + "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", + "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", + "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", + "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", + "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", + "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", + "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", + "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", + "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", + "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", + "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", + "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", + "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", + "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", + "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "dependencies": { + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@freearhey/core": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@freearhey/core/-/core-0.14.3.tgz", + "integrity": "sha512-w/kaoUdZlbqvOSOmid0nrBI9iGZkUZ+KLZUfkWpfZRPXOEu/FxlEP5gPANGgovwijrgogAbVf/qnf9VV+429ag==", + "dependencies": { + "@types/lodash": "^4.14.198", + "@types/pako": "^2.0.3", + "consola": "^3.4.2", + "dayjs": "^1.11.13", + "glob": "^11.0.1", + "lodash": "^4.17.21", + "natural-orderby": "^5.0.0", + "normalize-url": "^8.1.0", + "object-treeify": "^2.1.1", + "pako": "^2.1.0", + "timer-node": "^5.0.9" + } + }, + "node_modules/@freearhey/search-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.1.2.tgz", + "integrity": "sha512-F2o+xpGCXOK4OsZfKEHfXNNkAZmny2eBnPOp+P0iyV20ja7gJGfTFaEc6okcuEo6OB6P7LnSxTvISkoArFtlfg==", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@freearhey/storage-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@freearhey/storage-js/-/storage-js-0.1.0.tgz", + "integrity": "sha512-1TR5vPPkVewwNVelM4atDMxgjUaBE1kz/sD9z82zOVSMoyWahachhXW2/pxSHSElENg7SBY75Wki99kS+Kouxw==", + "dependencies": { + "fs-extra": "^11.3.1", + "glob": "^11.0.3" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", + "integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", + "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", + "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/external-editor": "^1.0.1", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", + "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", + "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", + "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", + "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", + "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.0.tgz", + "integrity": "sha512-JHwGbQ6wjf1dxxnalDYpZwZxUEosT+6CPGD9Zh4sm9WXdtUp9XODCQD3NjSTmu+0OAyxWXNOqf0spjIymJa2Tw==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.0", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.15", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", + "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", + "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", + "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@iptv-org/sdk": { + "version": "1.0.2", + "resolved": "https://npm.pkg.github.com/download/@iptv-org/sdk/1.0.2/131e5145ff68ffb5e213eb02d26d43db91a8a5a3", + "integrity": "sha512-Lpq+5vko9HkqOMDaXpeLBzKVgJikuKax7dJgBjr+XIgxRgMB1gucCjbvTNCR5AHhnORWvX+LFaodzy06jKukOA==", + "license": "UNLICENSED", + "dependencies": { + "@freearhey/core": "^0.14.3", + "@freearhey/search-js": "^0.2.0", + "@ntlab/sfetch": "^1.2.0", + "axios": "^1.11.0", + "dayjs": "^1.11.18" + } + }, + "node_modules/@iptv-org/sdk/node_modules/@freearhey/search-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.2.0.tgz", + "integrity": "sha512-1sxfCRbxM12Js3nM/S51cVKLYEjoksERidz539bleMAXes44eTC2m0TEQTJzJyE7l1pw2qUwsIhjd2l2l88fSw==", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", + "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.0.5", + "jest-util": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", + "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.0.5", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.0.5", + "@jest/test-result": "30.0.5", + "@jest/transform": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.0.5", + "jest-config": "30.0.5", + "jest-haste-map": "30.0.5", + "jest-message-util": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.0.5", + "jest-resolve-dependencies": "30.0.5", + "jest-runner": "30.0.5", + "jest-runtime": "30.0.5", + "jest-snapshot": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.0.5", + "jest-watcher": "30.0.5", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.0.5.tgz", + "integrity": "sha512-W1kmkwPq/WTMQWgvbzWSCbXSqvjI6rkqBQCxuvYmd+g6o4b5gHP98ikfh/Ei0SKzHvWdI84TOXp0hRcbpr8Q0w==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", + "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", + "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", + "license": "MIT", + "dependencies": { + "expect": "30.0.5", + "jest-snapshot": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", + "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", + "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.0.5", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", + "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", + "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.0.5", + "@jest/expect": "30.0.5", + "@jest/types": "30.0.5", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", + "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.0.5", + "@jest/test-result": "30.0.5", + "@jest/transform": "30.0.5", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.0.5", + "jest-util": "30.0.5", + "jest-worker": "30.0.5", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", + "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", + "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.0.5", + "@jest/types": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", + "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.0.5", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", + "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.0", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@ntlab/sfetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ntlab/sfetch/-/sfetch-1.2.0.tgz", + "integrity": "sha512-9SE4NnqWo8l6mG0rnAkgng6ozSamIpF3EC+GOTQGGa6eAC0tNJvzrylMz6YRjjEGH6mOfn7ZBAuKj5WIZUul6A==", + "dependencies": { + "axios": "^1.7.9" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz", + "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.1", + "@octokit/request": "^10.0.2", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", + "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", + "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.2", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz", + "integrity": "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.1.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz", + "integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.1.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", + "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.0", + "@octokit/request-error": "^7.0.0", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", + "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.38", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.38.tgz", + "integrity": "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz", + "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.37.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@swc/core": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", + "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.21" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.11.24", + "@swc/core-darwin-x64": "1.11.24", + "@swc/core-linux-arm-gnueabihf": "1.11.24", + "@swc/core-linux-arm64-gnu": "1.11.24", + "@swc/core-linux-arm64-musl": "1.11.24", + "@swc/core-linux-x64-gnu": "1.11.24", + "@swc/core-linux-x64-musl": "1.11.24", + "@swc/core-win32-arm64-msvc": "1.11.24", + "@swc/core-win32-ia32-msvc": "1.11.24", + "@swc/core-win32-x64-msvc": "1.11.24" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", + "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", + "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", + "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", + "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", + "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", + "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", + "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", + "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", + "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", + "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/jest": { + "version": "0.2.39", + "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", + "integrity": "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^30.0.0", + "@swc/counter": "^0.1.3", + "jsonc-parser": "^3.2.0" + }, + "engines": { + "npm": ">= 7.0.0" + }, + "peerDependencies": { + "@swc/core": "*" + } + }, + "node_modules/@swc/types": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", + "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/async": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz", + "integrity": "sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cli-progress": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", + "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash.uniqueid": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/lodash.uniqueid/-/lodash.uniqueid-4.0.9.tgz", + "integrity": "sha512-SEzkJBS8t+tqAUnSmyqbuWqxKU+Z/Xu2cgPtD+Ik0l+M7L2q7So9VoN2rQ8H0mmL87lJ00ykxal8oB54QRet6g==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-cleanup": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/node-cleanup/-/node-cleanup-2.1.5.tgz", + "integrity": "sha512-+82RAk5uYiqiMoEv2fPeh03AL4pB5d3TL+Pf+hz31Mme6ECFI1kRlgmxYjdSlHzDbJ9yLorTnKi4Op5FA54kQQ==" + }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.1.tgz", + "integrity": "sha512-Kn4kbSXpkFHCGE6rBFNwIv0GQs4AvDT80jlveJDKFxjbTYMUeB4QtsdPCv6H8Cm19Je7IU6VFtRl2zWZI0rudQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", + "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "30.0.5", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.0", + "babel-preset-jest": "30.0.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", + "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", + "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", + "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.0.1", + "babel-preset-current-node-syntax": "^1.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" + }, + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", + "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", + "license": "MIT" + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/console-table-printer": { + "version": "2.14.6", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.6.tgz", + "integrity": "sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz", + "integrity": "sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==", + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.192", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", + "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", + "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.3", + "@esbuild/android-arm": "0.25.3", + "@esbuild/android-arm64": "0.25.3", + "@esbuild/android-x64": "0.25.3", + "@esbuild/darwin-arm64": "0.25.3", + "@esbuild/darwin-x64": "0.25.3", + "@esbuild/freebsd-arm64": "0.25.3", + "@esbuild/freebsd-x64": "0.25.3", + "@esbuild/linux-arm": "0.25.3", + "@esbuild/linux-arm64": "0.25.3", + "@esbuild/linux-ia32": "0.25.3", + "@esbuild/linux-loong64": "0.25.3", + "@esbuild/linux-mips64el": "0.25.3", + "@esbuild/linux-ppc64": "0.25.3", + "@esbuild/linux-riscv64": "0.25.3", + "@esbuild/linux-s390x": "0.25.3", + "@esbuild/linux-x64": "0.25.3", + "@esbuild/netbsd-arm64": "0.25.3", + "@esbuild/netbsd-x64": "0.25.3", + "@esbuild/openbsd-arm64": "0.25.3", + "@esbuild/openbsd-x64": "0.25.3", + "@esbuild/sunos-x64": "0.25.3", + "@esbuild/win32-arm64": "0.25.3", + "@esbuild/win32-ia32": "0.25.3", + "@esbuild/win32-x64": "0.25.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", + "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", + "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.0.5", + "@jest/get-type": "30.0.1", + "jest-matcher-utils": "30.0.5", + "jest-message-util": "30.0.5", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz", + "integrity": "sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/iptv-playlist-parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/iptv-playlist-parser/-/iptv-playlist-parser-0.15.0.tgz", + "integrity": "sha512-9EGiQ5y95UZsV24HBSHuSyOuqzFR4YCAm7X8MqJNHlcm9jP38DHH7inYU0YJuXVq9fAttij3Yh8MJZkV1Bu/SA==", + "dependencies": { + "is-valid-path": "^0.1.1", + "validator": "^13.7.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", + "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "30.0.5", + "@jest/types": "30.0.5", + "import-local": "^3.2.0", + "jest-cli": "30.0.5" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", + "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.0.5", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", + "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.0.5", + "@jest/expect": "30.0.5", + "@jest/test-result": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.0.5", + "jest-matcher-utils": "30.0.5", + "jest-message-util": "30.0.5", + "jest-runtime": "30.0.5", + "jest-snapshot": "30.0.5", + "jest-util": "30.0.5", + "p-limit": "^3.1.0", + "pretty-format": "30.0.5", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", + "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", + "license": "MIT", + "dependencies": { + "@jest/core": "30.0.5", + "@jest/test-result": "30.0.5", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.0.5", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", + "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.0.1", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.0.5", + "@jest/types": "30.0.5", + "babel-jest": "30.0.5", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.0.5", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.0.5", + "jest-runner": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.0.5", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-diff": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", + "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-docblock": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", + "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", + "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.0.1", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "jest-util": "30.0.5", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", + "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.0.5", + "@jest/fake-timers": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-expect-message": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.1.3.tgz", + "integrity": "sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==" + }, + "node_modules/jest-haste-map": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", + "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "jest-worker": "30.0.5", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", + "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.0.1", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", + "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.0.1", + "chalk": "^4.1.2", + "jest-diff": "30.0.5", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", + "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", + "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.0.5", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.0.5", + "jest-validate": "30.0.5", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", + "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", + "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", + "license": "MIT", + "dependencies": { + "@jest/console": "30.0.5", + "@jest/environment": "30.0.5", + "@jest/test-result": "30.0.5", + "@jest/transform": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.0.5", + "jest-haste-map": "30.0.5", + "jest-leak-detector": "30.0.5", + "jest-message-util": "30.0.5", + "jest-resolve": "30.0.5", + "jest-runtime": "30.0.5", + "jest-util": "30.0.5", + "jest-watcher": "30.0.5", + "jest-worker": "30.0.5", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", + "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.0.5", + "@jest/fake-timers": "30.0.5", + "@jest/globals": "30.0.5", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.0.5", + "@jest/transform": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.0.5", + "jest-message-util": "30.0.5", + "jest-mock": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.0.5", + "jest-snapshot": "30.0.5", + "jest-util": "30.0.5", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-runtime/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-snapshot": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", + "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.0.5", + "@jest/get-type": "30.0.1", + "@jest/snapshot-utils": "30.0.5", + "@jest/transform": "30.0.5", + "@jest/types": "30.0.5", + "babel-preset-current-node-syntax": "^1.1.0", + "chalk": "^4.1.2", + "expect": "30.0.5", + "graceful-fs": "^4.2.11", + "jest-diff": "30.0.5", + "jest-matcher-utils": "30.0.5", + "jest-message-util": "30.0.5", + "jest-util": "30.0.5", + "pretty-format": "30.0.5", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", + "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.0.1", + "@jest/types": "30.0.5", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", + "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.0.5", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.0.5", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-worker": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", + "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.0.5", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.uniqueid": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz", + "integrity": "sha512-GQQWaIeGlL6DIIr06kj1j6sSmBxyNMwI8kaX9aKpHR/XsMTiaXDVPNPAkiboOTK9OJpTJF/dXT3xYoFQnj386Q==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/m3u-linter": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/m3u-linter/-/m3u-linter-0.4.2.tgz", + "integrity": "sha512-KeUirh5JnGRuFDb+7tsc8Dkb+q/slco3hszKE7lwbmGKKo+QnSr7198e1ATYZ9HkY8sbvEQBuTj2hPsv9o3gGw==", + "dependencies": { + "chalk": "^4.1.1", + "commander": "^7.2.0", + "glob": "^11.0.0", + "is-valid-path": "^0.1.1" + }, + "bin": { + "m3u-linter": "bin/m3u-linter.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/m3u-linter/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/m3u-linter/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mediainfo.js": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.6.tgz", + "integrity": "sha512-3xVRlxwlVWIZV3z1q7pb8LzFOO7iKi/DXoRiFRZdOlrUEhPyJDaaRt0uK32yQJabArQicRBeq7cRxmdZlIBTyA==", + "dependencies": { + "yargs": "^18.0.0" + }, + "bin": { + "mediainfo.js": "dist/esm/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/mediainfo.js/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mediainfo.js/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/mediainfo.js/node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==" + }, + "node_modules/mediainfo.js/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mediainfo.js/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mediainfo.js/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/mediainfo.js/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", + "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-cleanup": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-treeify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-2.1.1.tgz", + "integrity": "sha512-ofXhazOvXTYWbbibExMiS+asaTbYG/ZWopVroXFFOdjmc8ehXMq9R2VUaTx/C3CnZkQbT52wAZT4DrBLK/nQfw==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-wcswidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz", + "integrity": "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/timer-node": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/timer-node/-/timer-node-5.0.9.tgz", + "integrity": "sha512-zXxCE/5/YDi0hY9pygqgRqjRbrFRzigYxOudG0I3syaqAAmX9/w9sxex1bNFCN6c1S66RwPtEIJv65dN+1psew==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/tsx": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 276eb517f9..6f0e2aac74 100644 --- a/package.json +++ b/package.json @@ -1,80 +1,84 @@ -{ - "name": "iptv", - "scripts": { - "act:check": "act pull_request -W .github/workflows/check.yml", - "act:format": "act workflow_dispatch -W .github/workflows/format.yml", - "act:update": "act workflow_dispatch -W .github/workflows/update.yml", - "api:load": "tsx scripts/commands/api/load.ts", - "api:generate": "tsx scripts/commands/api/generate.ts", - "api:deploy": "npx gh-pages-clean && npx gh-pages -a -m \"Deploy to iptv-org/api\" -d .api -r https://$GITHUB_TOKEN@github.com/iptv-org/api.git", - "playlist:format": "tsx scripts/commands/playlist/format.ts", - "playlist:update": "tsx scripts/commands/playlist/update.ts", - "playlist:generate": "tsx scripts/commands/playlist/generate.ts", - "playlist:validate": "tsx scripts/commands/playlist/validate.ts", - "playlist:lint": "npx m3u-linter -c m3u-linter.json", - "playlist:test": "tsx scripts/commands/playlist/test.ts", - "playlist:edit": "tsx scripts/commands/playlist/edit.ts", - "playlist:deploy": "npx gh-pages-clean && npx gh-pages -m \"Deploy to GitHub Pages\" -d .gh-pages -r https://$GITHUB_TOKEN@github.com/iptv-org/iptv.git", - "readme:update": "tsx scripts/commands/readme/update.ts", - "report:create": "tsx scripts/commands/report/create.ts", - "check": "npm run playlist:lint && npm run playlist:validate", - "format": "npm run playlist:format", - "update": "npm run playlist:generate && npm run api:generate && npm run readme:update", - "deploy": "npm run playlist:deploy && npm run api:deploy", - "lint": "npx eslint \"scripts/**/*.{ts,js}\" \"tests/**/*.{ts,js}\"", - "test": "jest --runInBand", - "postinstall": "npm run api:load" - }, - "jest": { - "transform": { - "^.+\\.ts$": "@swc/jest" - }, - "testRegex": "tests/(.*?/)?.*test.ts$", - "setupFilesAfterEnv": [ - "jest-expect-message" - ] - }, - "author": "Arhey", - "private": true, - "license": "MIT", - "dependencies": { - "@alex_neo/jest-expect-message": "^1.0.5", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.32.0", - "@freearhey/core": "^0.10.2", - "@freearhey/search-js": "^0.1.2", - "@inquirer/prompts": "^7.8.0", - "@octokit/core": "^7.0.3", - "@octokit/plugin-paginate-rest": "^13.1.1", - "@octokit/plugin-rest-endpoint-methods": "^16.0.0", - "@octokit/types": "^14.1.0", - "@stylistic/eslint-plugin": "^5.2.2", - "@swc/jest": "^0.2.39", - "@types/async": "^3.2.25", - "@types/cli-progress": "^3.11.6", - "@types/fs-extra": "^11.0.4", - "@types/jest": "^30.0.0", - "@types/lodash.uniqueid": "^4.0.9", - "@typescript-eslint/eslint-plugin": "^8.38.0", - "@typescript-eslint/parser": "^8.38.0", - "async-es": "^3.2.6", - "axios": "^1.11.0", - "chalk": "^5.4.1", - "cli-progress": "^3.12.0", - "commander": "^14.0.0", - "console-table-printer": "^2.14.6", - "cross-env": "^10.0.0", - "eslint": "^9.32.0", - "glob": "^11.0.3", - "globals": "^16.3.0", - "iptv-playlist-parser": "^0.15.0", - "jest": "^30.0.5", - "jest-expect-message": "^1.1.3", - "lodash.uniqueid": "^4.0.1", - "m3u-linter": "^0.4.2", - "mediainfo.js": "^0.3.6", - "node-cleanup": "^2.1.2", - "socks-proxy-agent": "^8.0.5", - "tsx": "^4.20.3" - } -} +{ + "name": "iptv", + "scripts": { + "act:check": "act pull_request -W .github/workflows/check.yml -s GITHUB_TOKEN=\"$(gh auth token)\"", + "act:format": "act workflow_dispatch -W .github/workflows/format.yml -s GITHUB_TOKEN=\"$(gh auth token)\"", + "act:update": "act workflow_dispatch -W .github/workflows/update.yml -s GITHUB_TOKEN=\"$(gh auth token)\"", + "api:load": "tsx scripts/commands/api/load.ts", + "api:generate": "tsx scripts/commands/api/generate.ts", + "api:deploy": "npx gh-pages-clean && npx gh-pages -a -m \"Deploy to iptv-org/api\" -d .api -r https://$GITHUB_TOKEN@github.com/iptv-org/api.git", + "playlist:format": "tsx scripts/commands/playlist/format.ts", + "playlist:update": "tsx scripts/commands/playlist/update.ts", + "playlist:generate": "tsx scripts/commands/playlist/generate.ts", + "playlist:validate": "tsx scripts/commands/playlist/validate.ts", + "playlist:lint": "npx m3u-linter -c m3u-linter.json", + "playlist:test": "tsx scripts/commands/playlist/test.ts", + "playlist:edit": "tsx scripts/commands/playlist/edit.ts", + "playlist:deploy": "npx gh-pages-clean && npx gh-pages -m \"Deploy to GitHub Pages\" -d .gh-pages -r https://$GITHUB_TOKEN@github.com/iptv-org/iptv.git", + "readme:update": "tsx scripts/commands/readme/update.ts", + "report:create": "tsx scripts/commands/report/create.ts", + "check": "npm run playlist:lint && npm run playlist:validate", + "format": "npm run playlist:format", + "update": "npm run playlist:generate && npm run api:generate && npm run readme:update", + "deploy": "npm run playlist:deploy && npm run api:deploy", + "lint": "npx eslint \"scripts/**/*.{ts,js}\" \"tests/**/*.{ts,js}\"", + "test": "jest --runInBand", + "postinstall": "npm run api:load" + }, + "jest": { + "transform": { + "^.+\\.ts$": "@swc/jest" + }, + "testRegex": "tests/(.*?/)?.*test.ts$", + "setupFilesAfterEnv": [ + "jest-expect-message" + ] + }, + "author": "Arhey", + "private": true, + "license": "MIT", + "dependencies": { + "@alex_neo/jest-expect-message": "^1.0.5", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.32.0", + "@freearhey/core": "^0.14.3", + "@freearhey/search-js": "^0.1.2", + "@freearhey/storage-js": "^0.1.0", + "@inquirer/prompts": "^7.8.0", + "@iptv-org/sdk": "^1.0.2", + "@octokit/core": "^7.0.3", + "@octokit/plugin-paginate-rest": "^13.1.1", + "@octokit/plugin-rest-endpoint-methods": "^16.0.0", + "@octokit/types": "^14.1.0", + "@stylistic/eslint-plugin": "^5.2.2", + "@swc/jest": "^0.2.39", + "@types/async": "^3.2.25", + "@types/cli-progress": "^3.11.6", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^30.0.0", + "@types/lodash.uniqueid": "^4.0.9", + "@types/node-cleanup": "^2.1.5", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "async": "^3.2.6", + "axios": "^1.11.0", + "chalk": "^5.4.1", + "cli-progress": "^3.12.0", + "commander": "^14.0.0", + "console-table-printer": "^2.14.6", + "cross-env": "^10.0.0", + "eslint": "^9.32.0", + "glob": "^11.0.3", + "globals": "^16.3.0", + "iptv-playlist-parser": "^0.15.0", + "jest": "^30.0.5", + "jest-expect-message": "^1.1.3", + "lodash.uniqueid": "^4.0.1", + "m3u-linter": "^0.4.2", + "mediainfo.js": "^0.3.6", + "node-cleanup": "^2.1.2", + "normalize-url": "^8.1.0", + "socks-proxy-agent": "^8.0.5", + "tsx": "^4.20.3" + } +} From 3cb2edd94fc4a7327dba6881864cf1d4143e84b5 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:25:52 +0300 Subject: [PATCH 35/51] Update eslint.config.mjs --- eslint.config.mjs | 112 +++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index b6d59ca58d..8f9eab0e77 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,56 +1,56 @@ -import typescriptEslint from '@typescript-eslint/eslint-plugin' -import globals from 'globals' -import tsParser from '@typescript-eslint/parser' -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import js from '@eslint/js' -import stylistic from '@stylistic/eslint-plugin' -import { FlatCompat } from '@eslint/eslintrc' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all -}) - -export default [ - ...compat.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended'), - { - plugins: { - '@typescript-eslint': typescriptEslint, - '@stylistic': stylistic - }, - - languageOptions: { - globals: { - ...globals.browser - }, - - parser: tsParser, - ecmaVersion: 'latest', - sourceType: 'module' - }, - - rules: { - 'no-case-declarations': 'off', - - indent: [ - 'error', - 2, - { - SwitchCase: 1 - } - ], - - '@stylistic/linebreak-style': ['error', 'windows'], - quotes: ['error', 'single'], - semi: ['error', 'never'] - } - }, - - { - ignores: ['tests/__data__/**'] - } -] +import typescriptEslint from '@typescript-eslint/eslint-plugin' +import stylistic from '@stylistic/eslint-plugin' +import tsParser from '@typescript-eslint/parser' +import { FlatCompat } from '@eslint/eslintrc' +import { fileURLToPath } from 'node:url' +import globals from 'globals' +import path from 'node:path' +import js from '@eslint/js' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}) + +export default [ + ...compat.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended'), + { + plugins: { + '@typescript-eslint': typescriptEslint, + '@stylistic': stylistic + }, + + languageOptions: { + globals: { + ...globals.browser + }, + + parser: tsParser, + ecmaVersion: 'latest', + sourceType: 'module' + }, + + rules: { + 'no-case-declarations': 'off', + + indent: [ + 'error', + 2, + { + SwitchCase: 1 + } + ], + + '@stylistic/linebreak-style': ['error', 'windows'], + quotes: ['error', 'single'], + semi: ['error', 'never'] + } + }, + + { + ignores: ['tests/__data__/**'] + } +] From 40221ab2d2aa812e0305d7ac7bc0e81505bc15d4 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:26:10 +0300 Subject: [PATCH 36/51] Update workflows --- .github/workflows/check.yml | 77 +++++++------- .github/workflows/format.yml | 193 +++++++++++------------------------ .github/workflows/stale.yml | 49 ++++----- .github/workflows/update.yml | 167 +++++++++++++++--------------- 4 files changed, 213 insertions(+), 273 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 97f49404e2..c215aab1c6 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,37 +1,42 @@ -name: check -on: - workflow_dispatch: - pull_request: - types: [opened, synchronize, reopened, edited] -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true -jobs: - check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: changed files - id: files - run: | - git fetch origin master:master - ANY_CHANGED=false - ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') - if [ -n "${ALL_CHANGED_FILES}" ]; then - ANY_CHANGED=true - fi - echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" - echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" - - uses: actions/setup-node@v4 - if: ${{ !env.ACT && steps.files.outputs.any_changed == 'true' }} - with: - node-version: 22 - cache: 'npm' - - name: install dependencies - if: steps.files.outputs.any_changed == 'true' - run: npm install - - name: validate - if: steps.files.outputs.any_changed == 'true' - run: | - npm run playlist:lint -- ${{ steps.files.outputs.all_changed_files }} +name: check +on: + workflow_dispatch: + pull_request: + types: [opened, synchronize, reopened, edited] +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get list of changed files + id: files + run: | + git fetch origin master:master + ANY_CHANGED=false + ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') + if [ -n "${ALL_CHANGED_FILES}" ]; then + ANY_CHANGED=true + fi + echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" + echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" + - uses: actions/setup-node@v4 + if: steps.files.outputs.any_changed == 'true' + with: + node-version: 22 + cache: 'npm' + - name: Setup .npmrc for GitHub Packages + run: | + echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc + echo "@iptv-org:registry=https://npm.pkg.github.com/" >> .npmrc + echo "always-auth=true" >> .npmrc + - name: Install dependencies + if: steps.files.outputs.any_changed == 'true' + run: npm install + - name: Validate changed files + if: steps.files.outputs.any_changed == 'true' + run: | + npm run playlist:lint -- ${{ steps.files.outputs.all_changed_files }} npm run playlist:validate -- ${{ steps.files.outputs.all_changed_files }} \ No newline at end of file diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 439c21e9eb..7b7a5b82b4 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -1,131 +1,62 @@ -name: format -on: - workflow_dispatch: - # pull_request: - # types: [closed] - # branches: - # - master - # schedule: - # - cron: "0 12 * * *" -jobs: - on_trigger: - # if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }} - if: ${{ github.event_name == 'workflow_dispatch' }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: tibdex/github-app-token@v1.8.2 - if: ${{ !env.ACT }} - id: create-app-token - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - uses: actions/checkout@v4 - if: ${{ !env.ACT }} - with: - token: ${{ steps.create-app-token.outputs.token }} - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: 'npm' - - name: setup git - run: | - git config user.name "iptv-bot[bot]" - git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com" - - name: install dependencies - run: npm install - - name: format internal playlists - run: npm run playlist:format - - name: check internal playlists - run: | - npm run playlist:lint - npm run playlist:validate - - name: changed files - id: files_after - run: | - ANY_CHANGED=false - ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') - if [ -n "${ALL_CHANGED_FILES}" ]; then - ANY_CHANGED=true - fi - echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" - echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" - - name: git status - run: git status - - name: commit changes - if: steps.files_after.outputs.any_changed == 'true' - run: | - git add streams - git status - git commit -m "[Bot] Format /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [format](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify - - name: push all changes to the repository - if: ${{ !env.ACT && github.ref == 'refs/heads/master' && steps.files_after.outputs.any_changed == 'true' }} - run: git push - on_merge: - if: github.event.pull_request.merged == true - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: tibdex/github-app-token@v1.8.2 - if: ${{ !env.ACT }} - id: create-app-token - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - uses: actions/checkout@v4 - if: ${{ !env.ACT }} - with: - token: ${{ steps.create-app-token.outputs.token }} - - name: changed files - id: files - run: | - ANY_CHANGED=false - ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') - if [ -n "${ALL_CHANGED_FILES}" ]; then - ANY_CHANGED=true - fi - echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" - echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" - - uses: actions/setup-node@v4 - if: ${{ steps.files.outputs.any_changed == 'true' }} - with: - node-version: 22 - cache: 'npm' - - name: setup git - if: steps.files.outputs.any_changed == 'true' - run: | - git config user.name "iptv-bot[bot]" - git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com" - - name: install dependencies - if: steps.files.outputs.any_changed == 'true' - run: npm install - - name: format internal playlists - if: steps.files.outputs.any_changed == 'true' - run: npm run playlist:format -- ${{ steps.files.outputs.all_changed_files }} - - name: check internal playlists - if: steps.files.outputs.any_changed == 'true' - run: | - npm run playlist:lint -- ${{ steps.files.outputs.all_changed_files }} - npm run playlist:validate -- ${{ steps.files.outputs.all_changed_files }} - - name: git status - if: steps.files.outputs.any_changed == 'true' - run: git status - - name: changed files - id: files_after - run: | - ANY_CHANGED=false - ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') - if [ -n "${ALL_CHANGED_FILES}" ]; then - ANY_CHANGED=true - fi - echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" - echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" - - name: commit changes - if: steps.files_after.outputs.any_changed == 'true' - run: | - git add streams - git status - git commit -m "[Bot] Format /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [format](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify - - name: push all changes to the repository - if: ${{ !env.ACT && github.ref == 'refs/heads/master' && steps.files_after.outputs.any_changed == 'true' }} - run: git push +name: format +on: + workflow_dispatch: + # schedule: + # - cron: "0 12 * * *" +jobs: + on_trigger: + # if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }} + if: ${{ github.event_name == 'workflow_dispatch' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: tibdex/github-app-token@v1.8.2 + if: ${{ !env.ACT }} + id: create-app-token + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + - uses: actions/checkout@v4 + if: ${{ !env.ACT }} + with: + token: ${{ steps.create-app-token.outputs.token }} + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'npm' + - name: Setup .npmrc for GitHub Packages + run: | + echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc + echo "@iptv-org:registry=https://npm.pkg.github.com/" >> .npmrc + echo "always-auth=true" >> .npmrc + - name: Install dependencies + run: npm install + - name: Format internal playlists + run: npm run playlist:format + - name: Check internal playlists + run: | + npm run playlist:lint + npm run playlist:validate + - name: Get list of changed files + id: files_after + run: | + ANY_CHANGED=false + ALL_CHANGED_FILES=$(git diff --name-only master -- streams/ | tr '\n' ' ') + if [ -n "${ALL_CHANGED_FILES}" ]; then + ANY_CHANGED=true + fi + echo "all_changed_files=$ALL_CHANGED_FILES" >> "$GITHUB_OUTPUT" + echo "any_changed=$ANY_CHANGED" >> "$GITHUB_OUTPUT" + - name: Setup git + run: | + git config user.name "iptv-bot[bot]" + git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com" + - name: Commit changes to /streams + if: steps.files_after.outputs.any_changed == 'true' + run: | + git add streams + git status + git commit -m "[Bot] Format /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [format](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify + - name: Push all changes to the repository + if: ${{ !env.ACT && github.ref == 'refs/heads/master' && steps.files_after.outputs.any_changed == 'true' }} + run: git push \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 4bf3b0fae0..f305a4fd75 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,25 +1,26 @@ -name: stale -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * *' -permissions: - issues: write -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: tibdex/github-app-token@v1.8.2 - id: create-app-token - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - uses: actions/stale@v9 - with: - repo-token: ${{ steps.create-app-token.outputs.token }} - days-before-stale: 180 - days-before-close: 7 - operations-per-run: 500 - stale-issue-label: 'stale' - any-of-issue-labels: 'channel search' +name: stale +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' +permissions: + actions: write + issues: write +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: tibdex/github-app-token@v1.8.2 + id: create-app-token + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + - uses: actions/stale@v9 + with: + repo-token: ${{ steps.create-app-token.outputs.token }} + days-before-stale: 180 + days-before-close: 7 + operations-per-run: 500 + stale-issue-label: 'stale' + any-of-issue-labels: 'channel search' close-issue-message: 'This request has been closed because it has been inactive for more than 180 days.' \ No newline at end of file diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index a44b59538b..82928fac93 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -1,82 +1,85 @@ -name: update -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * *' -jobs: - main: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: tibdex/github-app-token@v1.8.2 - if: ${{ !env.ACT }} - id: create-app-token - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.APP_PRIVATE_KEY }} - - uses: actions/checkout@v3 - if: ${{ !env.ACT }} - with: - token: ${{ steps.create-app-token.outputs.token }} - - name: setup git - run: | - git config user.name "iptv-bot[bot]" - git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com" - - uses: actions/setup-node@v3 - if: ${{ !env.ACT }} - with: - node-version: 20 - cache: 'npm' - - name: install dependencies - run: npm install - - name: update internal playlists - run: npm run playlist:update --silent >> $GITHUB_OUTPUT - id: playlist-update - - name: check internal playlists - run: | - npm run playlist:lint - npm run playlist:validate - - name: generate public playlists - run: npm run playlist:generate - - name: generate .api/streams.json - run: npm run api:generate - - name: update readme - run: npm run readme:update - - run: git status - - name: commit changes to /streams - run: | - git add streams - git status - git commit --allow-empty -m "[Bot] Update /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." -m "${{ steps.playlist-update.outputs.OUTPUT }}" --no-verify - - name: commit changes to playlists.md - run: | - git add PLAYLISTS.md - git status - git commit --allow-empty -m "[Bot] Update PLAYLISTS.md" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify - - name: push all changes to the repository - if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} - run: git push - - name: deploy public playlists to github pages - uses: JamesIves/github-pages-deploy-action@4.1.1 - if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} - with: - repository-name: iptv-org/iptv - branch: gh-pages - folder: .gh-pages - token: ${{ steps.create-app-token.outputs.token }} - git-config-name: iptv-bot[bot] - git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit-message: '[Bot] Deploy to GitHub Pages' - clean: true - - name: move .api/streams.json to iptv-org/api - uses: JamesIves/github-pages-deploy-action@4.1.1 - if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} - with: - repository-name: iptv-org/api - branch: gh-pages - folder: .api - token: ${{ steps.create-app-token.outputs.token }} - git-config-name: iptv-bot[bot] - git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com - commit-message: '[Bot] Deploy to iptv-org/api' - clean: false +name: update +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' +jobs: + main: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: tibdex/github-app-token@v1.8.2 + if: ${{ !env.ACT }} + id: create-app-token + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.APP_PRIVATE_KEY }} + - uses: actions/checkout@v4 + if: ${{ !env.ACT }} + with: + token: ${{ steps.create-app-token.outputs.token }} + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: 'npm' + - name: Setup .npmrc for GitHub Packages + run: | + echo "//npm.pkg.github.com/:_authToken=$GITHUB_TOKEN" >> .npmrc + echo "@iptv-org:registry=https://npm.pkg.github.com/" >> .npmrc + echo "always-auth=true" >> .npmrc + - name: Install dependencies + run: npm install + - name: Update internal playlists + run: npm run playlist:update --silent >> $GITHUB_OUTPUT + id: playlist-update + - name: Check internal playlists + run: | + npm run playlist:lint + npm run playlist:validate + - name: Generate public playlists + run: npm run playlist:generate + - name: Generate .api/streams.json + run: npm run api:generate + - name: Update readme + run: npm run readme:update + - name: Setup git + run: | + git config user.name "iptv-bot[bot]" + git config user.email "84861620+iptv-bot[bot]@users.noreply.github.com" + - name: Commit changes to /streams + run: | + git add streams + git status + git commit --allow-empty -m "[Bot] Update /streams" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." -m "${{ steps.playlist-update.outputs.OUTPUT }}" --no-verify + - name: Commit changes to PLAYLIST.md + run: | + git add PLAYLISTS.md + git status + git commit --allow-empty -m "[Bot] Update PLAYLISTS.md" -m "Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/${{ github.run_id }}) workflow." --no-verify + - name: Push all changes to the repository + if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} + run: git push + - name: Deploy public playlists to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.1 + if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} + with: + repository-name: iptv-org/iptv + branch: gh-pages + folder: .gh-pages + token: ${{ steps.create-app-token.outputs.token }} + git-config-name: iptv-bot[bot] + git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com + commit-message: '[Bot] Deploy to GitHub Pages' + clean: true + - name: Move .api/streams.json to iptv-org/api + uses: JamesIves/github-pages-deploy-action@4.1.1 + if: ${{ !env.ACT && github.ref == 'refs/heads/master' }} + with: + repository-name: iptv-org/api + branch: gh-pages + folder: .api + token: ${{ steps.create-app-token.outputs.token }} + git-config-name: iptv-bot[bot] + git-config-email: 84861620+iptv-bot[bot]@users.noreply.github.com + commit-message: '[Bot] Deploy to iptv-org/api' + clean: false From 5e7549f836d8c33241add7bf206c9f4dfd8b8b27 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:28:26 +0300 Subject: [PATCH 37/51] Fix issue templates --- .github/ISSUE_TEMPLATE/1_streams_add.yml | 2 +- .github/ISSUE_TEMPLATE/2_streams_edit.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1_streams_add.yml b/.github/ISSUE_TEMPLATE/1_streams_add.yml index 6a49621a26..099fe3504d 100644 --- a/.github/ISSUE_TEMPLATE/1_streams_add.yml +++ b/.github/ISSUE_TEMPLATE/1_streams_add.yml @@ -64,7 +64,7 @@ body: id: directives attributes: label: Directives - description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#VLCOPT`.' + description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' placeholder: '#KODIPROP:inputstream=inputstream.adaptive' - type: textarea diff --git a/.github/ISSUE_TEMPLATE/2_streams_edit.yml b/.github/ISSUE_TEMPLATE/2_streams_edit.yml index ece9afd024..c6a1485fe3 100644 --- a/.github/ISSUE_TEMPLATE/2_streams_edit.yml +++ b/.github/ISSUE_TEMPLATE/2_streams_edit.yml @@ -76,7 +76,7 @@ body: id: directives attributes: label: Directives - description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#VLCOPT`.' + description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' placeholder: '#KODIPROP:inputstream=inputstream.adaptive' - type: textarea From dcb0c86a0a3af094ad4f44b208dc32f5d7248a13 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 21:29:15 +0300 Subject: [PATCH 38/51] Replace LF with CRLF --- .github/ISSUE_TEMPLATE/1_streams_add.yml | 164 ++++++++-------- .github/ISSUE_TEMPLATE/2_streams_edit.yml | 188 +++++++++---------- .github/ISSUE_TEMPLATE/3_streams_report.yml | 98 +++++----- .github/ISSUE_TEMPLATE/4_channel-search.yml | 56 +++--- .github/ISSUE_TEMPLATE/5_bug-report.yml | 36 ++-- .github/ISSUE_TEMPLATE/6_copyright-claim.yml | 100 +++++----- .github/ISSUE_TEMPLATE/config.yml | 22 +-- 7 files changed, 332 insertions(+), 332 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1_streams_add.yml b/.github/ISSUE_TEMPLATE/1_streams_add.yml index 099fe3504d..6c54d31493 100644 --- a/.github/ISSUE_TEMPLATE/1_streams_add.yml +++ b/.github/ISSUE_TEMPLATE/1_streams_add.yml @@ -1,82 +1,82 @@ -name: ➕ Add stream -description: Request to add a new stream link into the playlist -title: 'Add: ' -labels: ['streams:add'] - -body: - - type: input - id: stream_id - attributes: - label: Stream ID (required) - description: "ID of the stream consisting of `` or `@`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request." - placeholder: 'BBCAmerica.us@East' - validations: - required: true - - - type: input - id: stream_url - attributes: - label: Stream URL (required) - description: Link to be added to the playlist - placeholder: 'https://example.com/playlist.m3u8' - validations: - required: true - - - type: dropdown - id: quality - attributes: - label: Quality - description: Maximum video resolution available on the link - options: - - 2160p - - 1280p - - 1080p - - 1080i - - 720p - - 576p - - 576i - - 480p - - 480i - - 360p - - - type: dropdown - id: label - attributes: - label: Label - description: Is there any reason why the broadcast may not work? - options: - - 'Not 24/7' - - 'Geo-blocked' - - - type: input - id: http_user_agent - attributes: - label: HTTP User Agent - placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246' - - - type: input - id: http_referrer - attributes: - label: HTTP Referrer - placeholder: 'https://example.com/' - - - type: textarea - id: directives - attributes: - label: Directives - description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' - placeholder: '#KODIPROP:inputstream=inputstream.adaptive' - - - type: textarea - id: notes - attributes: - label: Notes - description: 'Anything else we should know about this broadcast?' - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) - required: true +name: ➕ Add stream +description: Request to add a new stream link into the playlist +title: 'Add: ' +labels: ['streams:add'] + +body: + - type: input + id: stream_id + attributes: + label: Stream ID (required) + description: "ID of the stream consisting of `` or `@`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request." + placeholder: 'BBCAmerica.us@East' + validations: + required: true + + - type: input + id: stream_url + attributes: + label: Stream URL (required) + description: Link to be added to the playlist + placeholder: 'https://example.com/playlist.m3u8' + validations: + required: true + + - type: dropdown + id: quality + attributes: + label: Quality + description: Maximum video resolution available on the link + options: + - 2160p + - 1280p + - 1080p + - 1080i + - 720p + - 576p + - 576i + - 480p + - 480i + - 360p + + - type: dropdown + id: label + attributes: + label: Label + description: Is there any reason why the broadcast may not work? + options: + - 'Not 24/7' + - 'Geo-blocked' + + - type: input + id: http_user_agent + attributes: + label: HTTP User Agent + placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246' + + - type: input + id: http_referrer + attributes: + label: HTTP Referrer + placeholder: 'https://example.com/' + + - type: textarea + id: directives + attributes: + label: Directives + description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' + placeholder: '#KODIPROP:inputstream=inputstream.adaptive' + + - type: textarea + id: notes + attributes: + label: Notes + description: 'Anything else we should know about this broadcast?' + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) + required: true diff --git a/.github/ISSUE_TEMPLATE/2_streams_edit.yml b/.github/ISSUE_TEMPLATE/2_streams_edit.yml index c6a1485fe3..7cd0b8a9f0 100644 --- a/.github/ISSUE_TEMPLATE/2_streams_edit.yml +++ b/.github/ISSUE_TEMPLATE/2_streams_edit.yml @@ -1,94 +1,94 @@ -name: ✏️ Edit stream -description: Request to edit stream description -title: 'Edit: ' -labels: ['streams:edit'] - -body: - - type: input - id: stream_url - attributes: - label: Stream URL (required) - description: Link to the stream to be updated - placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8' - validations: - required: true - - - type: markdown - attributes: - value: | - What exactly needs to be changed? To delete an existing value without replacement use the `~` symbol. - - - type: input - id: new_stream_url - attributes: - label: New Stream URL - description: New link to the stream - placeholder: 'https://servilive.com:3126/live/tele2000live.m3u8' - - - type: input - id: stream_id - attributes: - label: Stream ID - description: "ID of the stream consisting of `` or `@`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request." - placeholder: 'BBCAmerica.us@East' - - - type: dropdown - id: quality - attributes: - label: Quality - description: Maximum video resolution available on the link - options: - - 2160p - - 1280p - - 1080p - - 1080i - - 720p - - 576p - - 576i - - 480p - - 480i - - 360p - - '~' - - - type: dropdown - id: label - attributes: - label: Label - description: Is there any reason why the broadcast may not work? - options: - - 'Not 24/7' - - 'Geo-blocked' - - '~' - - - type: input - id: http_user_agent - attributes: - label: HTTP User Agent - placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246' - - - type: input - id: http_referrer - attributes: - label: HTTP Referrer - placeholder: 'https://example.com/' - - - type: textarea - id: directives - attributes: - label: Directives - description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' - placeholder: '#KODIPROP:inputstream=inputstream.adaptive' - - - type: textarea - id: notes - attributes: - label: Notes - placeholder: 'Anything else we should know?' - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) - required: true +name: ✏️ Edit stream +description: Request to edit stream description +title: 'Edit: ' +labels: ['streams:edit'] + +body: + - type: input + id: stream_url + attributes: + label: Stream URL (required) + description: Link to the stream to be updated + placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8' + validations: + required: true + + - type: markdown + attributes: + value: | + What exactly needs to be changed? To delete an existing value without replacement use the `~` symbol. + + - type: input + id: new_stream_url + attributes: + label: New Stream URL + description: New link to the stream + placeholder: 'https://servilive.com:3126/live/tele2000live.m3u8' + + - type: input + id: stream_id + attributes: + label: Stream ID + description: "ID of the stream consisting of `` or `@`. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request." + placeholder: 'BBCAmerica.us@East' + + - type: dropdown + id: quality + attributes: + label: Quality + description: Maximum video resolution available on the link + options: + - 2160p + - 1280p + - 1080p + - 1080i + - 720p + - 576p + - 576i + - 480p + - 480i + - 360p + - '~' + + - type: dropdown + id: label + attributes: + label: Label + description: Is there any reason why the broadcast may not work? + options: + - 'Not 24/7' + - 'Geo-blocked' + - '~' + + - type: input + id: http_user_agent + attributes: + label: HTTP User Agent + placeholder: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246' + + - type: input + id: http_referrer + attributes: + label: HTTP Referrer + placeholder: 'https://example.com/' + + - type: textarea + id: directives + attributes: + label: Directives + description: 'List of directives telling players how to play the stream. Supported `#KODIPROP` and `#EXTVLCOPT`.' + placeholder: '#KODIPROP:inputstream=inputstream.adaptive' + + - type: textarea + id: notes + attributes: + label: Notes + placeholder: 'Anything else we should know?' + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) + required: true diff --git a/.github/ISSUE_TEMPLATE/3_streams_report.yml b/.github/ISSUE_TEMPLATE/3_streams_report.yml index 8ed86525f0..b55918cfc7 100644 --- a/.github/ISSUE_TEMPLATE/3_streams_report.yml +++ b/.github/ISSUE_TEMPLATE/3_streams_report.yml @@ -1,49 +1,49 @@ -name: 🚧 Report a stream -description: Report a broken or unstable stream -title: 'Report: ' -labels: ['streams:remove'] - -body: - - type: markdown - attributes: - value: | - Please fill out the form as much as you can so we could efficiently process your request. To suggest a new replacement link, use this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+). - - - type: textarea - id: stream_url - attributes: - label: Stream URL - description: List all links in question (one per line) - placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8' - validations: - required: true - - - type: dropdown - id: reason - attributes: - label: What happened to the stream? - options: - - Not loading - - Constantly interrupts/lagging - - Stuck at a single frame - - I see visual artifacts - - Shows looped video - - No sound - - Displays a message asking to renew subscription - - Other - validations: - required: true - - - type: textarea - id: notes - attributes: - label: Notes (optional) - placeholder: 'Anything else we should know?' - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) - required: true +name: 🚧 Report a stream +description: Report a broken or unstable stream +title: 'Report: ' +labels: ['streams:remove'] + +body: + - type: markdown + attributes: + value: | + Please fill out the form as much as you can so we could efficiently process your request. To suggest a new replacement link, use this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+). + + - type: textarea + id: stream_url + attributes: + label: Stream URL + description: List all links in question (one per line) + placeholder: 'https://lnc-kdfw-fox-aws.tubi.video/index.m3u8' + validations: + required: true + + - type: dropdown + id: reason + attributes: + label: What happened to the stream? + options: + - Not loading + - Constantly interrupts/lagging + - Stuck at a single frame + - I see visual artifacts + - Shows looped video + - No sound + - Displays a message asking to renew subscription + - Other + validations: + required: true + + - type: textarea + id: notes + attributes: + label: Notes (optional) + placeholder: 'Anything else we should know?' + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) + required: true diff --git a/.github/ISSUE_TEMPLATE/4_channel-search.yml b/.github/ISSUE_TEMPLATE/4_channel-search.yml index 26b4f6a220..19f0e4d22b 100644 --- a/.github/ISSUE_TEMPLATE/4_channel-search.yml +++ b/.github/ISSUE_TEMPLATE/4_channel-search.yml @@ -1,28 +1,28 @@ -name: 🔍 Channel search -description: Ask for help in finding a link to the channel stream. -title: 'Find: ' -labels: ['channel search'] - -body: - - type: input - id: stream_id - attributes: - label: Channel ID (required) - description: Unique channel ID from [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request. - placeholder: 'BBCAmericaEast.us' - validations: - required: true - - - type: textarea - id: notes - attributes: - label: Notes - description: 'Any additional information that may help find a link to the stream faster?' - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) - required: true +name: 🔍 Channel search +description: Ask for help in finding a link to the channel stream. +title: 'Find: ' +labels: ['channel search'] + +body: + - type: input + id: stream_id + attributes: + label: Channel ID (required) + description: Unique channel ID from [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request. + placeholder: 'BBCAmericaEast.us' + validations: + required: true + + - type: textarea + id: notes + attributes: + label: Notes + description: 'Any additional information that may help find a link to the stream faster?' + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) + required: true diff --git a/.github/ISSUE_TEMPLATE/5_bug-report.yml b/.github/ISSUE_TEMPLATE/5_bug-report.yml index d93ed317ed..d0a4f81d7f 100644 --- a/.github/ISSUE_TEMPLATE/5_bug-report.yml +++ b/.github/ISSUE_TEMPLATE/5_bug-report.yml @@ -1,19 +1,19 @@ -name: 🐞 Bug report -description: Report an error in this repository -labels: ['bug'] - -body: - - type: textarea - attributes: - label: Describe your issue - description: Please describe the error in as much detail as possible so that we can fix it quickly. - validations: - required: true - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) +name: 🐞 Bug report +description: Report an error in this repository +labels: ['bug'] + +body: + - type: textarea + attributes: + label: Describe your issue + description: Please describe the error in as much detail as possible so that we can fix it quickly. + validations: + required: true + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/6_copyright-claim.yml b/.github/ISSUE_TEMPLATE/6_copyright-claim.yml index 4e3d779567..4265fc342f 100644 --- a/.github/ISSUE_TEMPLATE/6_copyright-claim.yml +++ b/.github/ISSUE_TEMPLATE/6_copyright-claim.yml @@ -1,50 +1,50 @@ -name: ©️ Copyright removal request -description: Request to remove content -labels: ['removal request'] -body: - - type: input - attributes: - label: Your full legal name - validations: - required: true - - - type: dropdown - attributes: - label: Are you the copyright holder or authorized to act on the copyright owner's behalf? - description: We cannot process your request unless it is submitted by the copyright owner or an agent authorized to act on behalf of the copyright owner. - options: - - Yes, I am the copyright holder. - - Yes, I am authorized to act on the copyright owner's behalf. - - No. - validations: - required: true - - - type: textarea - attributes: - label: Please describe the nature of your copyright ownership or authorization to act on the owner's behalf. - validations: - required: true - - - type: textarea - attributes: - label: Please provide a detailed description of the original copyrighted work that has allegedly been infringed. If possible, include a URL to where it is posted online. - validations: - required: true - - - type: textarea - attributes: - label: What content should be removed? Please specify the URL for each item or, if it is an entire file, the file's URL. - validations: - required: true - - - type: textarea - attributes: - label: Any additional information we need to know? - - - type: checkboxes - attributes: - label: Contributing Guide - description: 'Please read this guide before posting your request' - options: - - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) - required: true +name: ©️ Copyright removal request +description: Request to remove content +labels: ['removal request'] +body: + - type: input + attributes: + label: Your full legal name + validations: + required: true + + - type: dropdown + attributes: + label: Are you the copyright holder or authorized to act on the copyright owner's behalf? + description: We cannot process your request unless it is submitted by the copyright owner or an agent authorized to act on behalf of the copyright owner. + options: + - Yes, I am the copyright holder. + - Yes, I am authorized to act on the copyright owner's behalf. + - No. + validations: + required: true + + - type: textarea + attributes: + label: Please describe the nature of your copyright ownership or authorization to act on the owner's behalf. + validations: + required: true + + - type: textarea + attributes: + label: Please provide a detailed description of the original copyrighted work that has allegedly been infringed. If possible, include a URL to where it is posted online. + validations: + required: true + + - type: textarea + attributes: + label: What content should be removed? Please specify the URL for each item or, if it is an entire file, the file's URL. + validations: + required: true + + - type: textarea + attributes: + label: Any additional information we need to know? + + - type: checkboxes + attributes: + label: Contributing Guide + description: 'Please read this guide before posting your request' + options: + - label: I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md) + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index d42fd2acbf..b837a3ab6c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,11 @@ -blank_issues_enabled: false -contact_links: - - name: 💡 Ideas - url: https://github.com/orgs/iptv-org/discussions/categories/ideas - about: Share ideas for new features - - name: 🙌 Show and tell - url: https://github.com/orgs/iptv-org/discussions/categories/show-and-tell - about: Show off something you've made - - name: ❓ Q&A - url: https://github.com/orgs/iptv-org/discussions/categories/q-a - about: Ask the community for help +blank_issues_enabled: false +contact_links: + - name: 💡 Ideas + url: https://github.com/orgs/iptv-org/discussions/categories/ideas + about: Share ideas for new features + - name: 🙌 Show and tell + url: https://github.com/orgs/iptv-org/discussions/categories/show-and-tell + about: Show off something you've made + - name: ❓ Q&A + url: https://github.com/orgs/iptv-org/discussions/categories/q-a + about: Ask the community for help From c7d9e78be50d2a8e5fef5824fd10ef4759fcbd30 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:07:27 +0300 Subject: [PATCH 39/51] Update 4_channel-search.yml --- tests/__data__/input/issues.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/__data__/input/issues.js b/tests/__data__/input/issues.js index af111b9b72..e628a7e89d 100644 --- a/tests/__data__/input/issues.js +++ b/tests/__data__/input/issues.js @@ -2194,7 +2194,7 @@ module.exports = [ author_association: 'NONE', sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, active_lock_reason: null, - body: '### Channel ID (required)\n\n13thStreet.au\n\n### Notes\n\n_No response_', + body: '### Stream ID (required)\n\n13thStreet.au\n\n### Notes\n\n_No response_', closed_by: null, reactions: { url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/reactions', @@ -2267,7 +2267,7 @@ module.exports = [ author_association: 'NONE', sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, active_lock_reason: null, - body: '### Channel ID (required)\n\nIONTV.us\n\n### Notes\n\n_No response_', + body: '### Stream ID (required)\n\nIONTV.us\n\n### Notes\n\n_No response_', closed_by: null, reactions: { url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/reactions', From 45bfeb431da5af8899ae75a8a67dd904ecf2e48b Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:07:30 +0300 Subject: [PATCH 40/51] Update create.test.ts --- tests/commands/report/create.test.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/commands/report/create.test.ts b/tests/commands/report/create.test.ts index 391a6b8015..cb9fd3ab98 100644 --- a/tests/commands/report/create.test.ts +++ b/tests/commands/report/create.test.ts @@ -11,20 +11,20 @@ describe('report:create', () => { expect( stdout.includes(` -┌─────────┬─────────────┬──────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────┐ -│ (index) │ issueNumber │ type │ streamId │ streamUrl │ status │ -├─────────┼─────────────┼──────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────┤ -│ 0 │ 14120 │ 'streams:edit' │ 'boo.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'invalid_id' │ -│ 1 │ 14135 │ 'streams:add' │ 'BBCWorldNews.uk@SouthAsia' │ 'http://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8' │ 'wrong_id' │ -│ 2 │ 14177 │ 'streams:add' │ 'TUTV.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'on_playlist' │ -│ 3 │ 14178 │ 'streams:add' │ 'TV3.my' │ 'https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m...' │ 'blocked' │ -│ 4 │ 14179 │ 'streams:add' │ 'ManoramaNews.in' │ '(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Vid...' │ 'invalid_link' │ -│ 5 │ 16120 │ 'streams:remove' │ undefined │ 'http://190.61.102.67:2000/play/a038/index.m3u8' │ 'wrong_link' │ -│ 6 │ 19956 │ 'channel search' │ 'CNBCe.tr' │ undefined │ 'invalid_id' │ -│ 7 │ 19957 │ 'channel search' │ '13thStreet.au' │ undefined │ 'closed' │ -│ 8 │ 20956 │ 'channel search' │ 'IONTV.us' │ undefined │ 'fulfilled' │ -│ 9 │ 25157 │ 'streams:add' │ 'OnTimeSports.eg@SD' │ 'OnTime Sports SD.mu38' │ 'invalid_link' │ -└─────────┴─────────────┴──────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────┘`) +┌─────────┬─────────────┬──────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────┬──────────────────────┐ +│ (index) │ issueNumber │ type │ streamId │ streamUrl │ status │ +├─────────┼─────────────┼──────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────────────────┤ +│ 0 │ 14120 │ 'streams:edit' │ 'boo.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'invalid_channel_id' │ +│ 1 │ 14135 │ 'streams:add' │ 'BBCWorldNews.uk@SouthAsia' │ 'http://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8' │ 'invalid_channel_id' │ +│ 2 │ 14177 │ 'streams:add' │ 'TUTV.us' │ 'https://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8' │ 'duplicate_link' │ +│ 3 │ 14178 │ 'streams:add' │ 'TV3.my' │ 'https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m...' │ 'channel_blocked' │ +│ 4 │ 14179 │ 'streams:add' │ 'ManoramaNews.in' │ '(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Vid...' │ 'invalid_stream_url' │ +│ 5 │ 16120 │ 'streams:remove' │ undefined │ 'http://190.61.102.67:2000/play/a038/index.m3u8' │ 'nonexistent_link' │ +│ 6 │ 19956 │ 'channel search' │ 'CNBCe.tr' │ undefined │ 'invalid_channel_id' │ +│ 7 │ 19957 │ 'channel search' │ '13thStreet.au' │ undefined │ 'channel_closed' │ +│ 8 │ 20956 │ 'channel search' │ 'IONTV.us' │ undefined │ 'fulfilled' │ +│ 9 │ 25157 │ 'streams:add' │ 'OnTimeSports.eg@SD' │ 'OnTime Sports SD.mu38' │ 'invalid_stream_url' │ +└─────────┴─────────────┴──────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────────┘`) ).toBe(true) }) }) From 29d77177255e990b28582888207561c86bd9246c Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:07:33 +0300 Subject: [PATCH 41/51] Update create.ts --- scripts/commands/report/create.ts | 69 +++++++++++++++++++------------ 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/scripts/commands/report/create.ts b/scripts/commands/report/create.ts index e7c31704d9..52986637fd 100644 --- a/scripts/commands/report/create.ts +++ b/scripts/commands/report/create.ts @@ -6,6 +6,20 @@ import { STREAMS_DIR } from '../../constants' import { Issue, Stream } from '../../models' import { data, loadData } from '../../api' +const status = { + PENDING: 'pending', + FULFILLED: 'fulfilled', + MISSING_CHANNEL_ID: 'missing_channel_id', + INVALID_CHANNEL_ID: 'invalid_channel_id', + MISSING_STREAM_URL: 'missing_stream_url', + INVALID_STREAM_URL: 'invalid_stream_url', + NONEXISTENT_LINK: 'nonexistent_link', + CHANNEL_BLOCKED: 'channel_blocked', + CHANNEL_CLOSED: 'channel_closed', + DUPLICATE_LINK: 'duplicate_link', + DUPLICATE_REQUEST: 'duplicate_request' +} + async function main() { const logger = new Logger() const issueLoader = new IssueLoader() @@ -41,7 +55,7 @@ async function main() { type: 'streams:remove', streamId: undefined, streamUrl: undefined, - status: 'missing_link' + status: status.NONEXISTENT_LINK } report.add(result) @@ -52,11 +66,11 @@ async function main() { type: 'streams:remove', streamId: undefined, streamUrl: truncate(streamUrl), - status: 'pending' + status: status.PENDING } if (streamsGroupedByUrl.missing(streamUrl)) { - result.status = 'wrong_link' + result.status = status.NONEXISTENT_LINK } report.add(result) @@ -77,17 +91,18 @@ async function main() { type: 'streams:add', streamId: streamId || undefined, streamUrl: truncate(streamUrl), - status: 'pending' + status: status.PENDING } - if (!channelId) result.status = 'missing_id' - else if (!streamUrl) result.status = 'missing_link' - else if (!isURI(streamUrl)) result.status = 'invalid_link' - else if (data.blocklistRecordsGroupedByChannel.has(channelId)) result.status = 'blocked' - else if (data.channelsKeyById.missing(channelId)) result.status = 'wrong_id' - else if (streamsGroupedByUrl.has(streamUrl)) result.status = 'on_playlist' - else if (addRequestsBuffer.has(streamUrl)) result.status = 'duplicate' - else result.status = 'pending' + if (!channelId) result.status = status.MISSING_CHANNEL_ID + else if (!streamUrl) result.status = status.MISSING_STREAM_URL + else if (!isURI(streamUrl)) result.status = status.INVALID_STREAM_URL + else if (data.blocklistRecordsGroupedByChannel.has(channelId)) + result.status = status.CHANNEL_BLOCKED + else if (data.channelsKeyById.missing(channelId)) result.status = status.INVALID_CHANNEL_ID + else if (streamsGroupedByUrl.has(streamUrl)) result.status = status.DUPLICATE_LINK + else if (addRequestsBuffer.has(streamUrl)) result.status = status.DUPLICATE_REQUEST + else result.status = status.PENDING addRequestsBuffer.set(streamUrl, true) @@ -108,12 +123,13 @@ async function main() { type: 'streams:edit', streamId: streamId || undefined, streamUrl: truncate(streamUrl), - status: 'pending' + status: status.PENDING } - if (!streamUrl) result.status = 'missing_link' - else if (streamsGroupedByUrl.missing(streamUrl)) result.status = 'invalid_link' - else if (channelId && data.channelsKeyById.missing(channelId)) result.status = 'invalid_id' + if (!streamUrl) result.status = status.MISSING_STREAM_URL + else if (streamsGroupedByUrl.missing(streamUrl)) result.status = status.NONEXISTENT_LINK + else if (channelId && data.channelsKeyById.missing(channelId)) + result.status = status.INVALID_CHANNEL_ID report.add(result) }) @@ -124,7 +140,7 @@ async function main() { ) const channelSearchRequestsBuffer = new Dictionary() channelSearchRequests.forEach((issue: Issue) => { - const streamId = issue.data.getString('channelId') || '' + const streamId = issue.data.getString('streamId') || issue.data.getString('channelId') || '' const [channelId, feedId] = streamId.split('@') const result = { @@ -132,18 +148,19 @@ async function main() { type: 'channel search', streamId: streamId || undefined, streamUrl: undefined, - status: 'pending' + status: status.PENDING } - if (!channelId) result.status = 'missing_id' - else if (data.channelsKeyById.missing(channelId)) result.status = 'invalid_id' - else if (channelSearchRequestsBuffer.has(streamId)) result.status = 'duplicate' - else if (data.blocklistRecordsGroupedByChannel.has(channelId)) result.status = 'blocked' - else if (streamsGroupedById.has(streamId)) result.status = 'fulfilled' - else if (!feedId && streamsGroupedByChannel.has(channelId)) result.status = 'fulfilled' + if (!channelId) result.status = status.MISSING_CHANNEL_ID + else if (data.channelsKeyById.missing(channelId)) result.status = status.INVALID_CHANNEL_ID + else if (channelSearchRequestsBuffer.has(streamId)) result.status = status.DUPLICATE_REQUEST + else if (data.blocklistRecordsGroupedByChannel.has(channelId)) + result.status = status.CHANNEL_BLOCKED + else if (streamsGroupedById.has(streamId)) result.status = status.FULFILLED + else if (!feedId && streamsGroupedByChannel.has(channelId)) result.status = status.FULFILLED else { const channelData = data.channelsKeyById.get(channelId) - if (channelData && channelData.isClosed()) result.status = 'closed' + if (channelData && channelData.isClosed()) result.status = status.CHANNEL_CLOSED } channelSearchRequestsBuffer.set(streamId, true) @@ -151,7 +168,7 @@ async function main() { report.add(result) }) - report = report.sortBy(item => item.issueNumber).filter(item => item.status !== 'pending') + report = report.sortBy(item => item.issueNumber).filter(item => item.status !== status.PENDING) console.table(report.all()) } From a1d2ea2541b8da34d3840273d2160a8c660cf221 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:07:56 +0300 Subject: [PATCH 42/51] Update 4_channel-search.yml --- .github/ISSUE_TEMPLATE/4_channel-search.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/4_channel-search.yml b/.github/ISSUE_TEMPLATE/4_channel-search.yml index 19f0e4d22b..9d6888c507 100644 --- a/.github/ISSUE_TEMPLATE/4_channel-search.yml +++ b/.github/ISSUE_TEMPLATE/4_channel-search.yml @@ -7,9 +7,9 @@ body: - type: input id: stream_id attributes: - label: Channel ID (required) - description: Unique channel ID from [iptv-org.github.io](https://iptv-org.github.io/). If you can't find the channel you want in the list, please let us know through this [form](https://github.com/iptv-org/database/issues/new?assignees=&labels=channels%3Aadd&projects=&template=channels_add.yml&title=Add%3A+) before posting your request. - placeholder: 'BBCAmericaEast.us' + label: Stream ID (required) + description: Unique ID of the channel and feed from [iptv-org.github.io](https://iptv-org.github.io/). If you cannot find the channel or feed you are looking for in the list, please let us know via one of the [forms](https://github.com/iptv-org/database/issues/new/choose) before posting your request. + placeholder: 'BBCAmerica.us@East' validations: required: true From 31e79a4386ee51b84dcc069a646d28a0c7f369e5 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:28:55 +0300 Subject: [PATCH 43/51] Update dependencies --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84cff3f8bf..a5f14a99b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "eslint": "^9.32.0", "glob": "^11.0.3", "globals": "^16.3.0", - "iptv-playlist-parser": "^0.15.0", + "iptv-playlist-parser": "^0.15.1", "jest": "^30.0.5", "jest-expect-message": "^1.1.3", "lodash.uniqueid": "^4.0.1", @@ -5057,9 +5057,9 @@ } }, "node_modules/iptv-playlist-parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/iptv-playlist-parser/-/iptv-playlist-parser-0.15.0.tgz", - "integrity": "sha512-9EGiQ5y95UZsV24HBSHuSyOuqzFR4YCAm7X8MqJNHlcm9jP38DHH7inYU0YJuXVq9fAttij3Yh8MJZkV1Bu/SA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/iptv-playlist-parser/-/iptv-playlist-parser-0.15.1.tgz", + "integrity": "sha512-Fsm0uGiKsxZxOFvrpO0YY8eZtZLA9yqre7ne+T5AN2xvMsxFF2yY84CbFF6CTMYm7S+/AUQ+hPVst+uo9dGEuA==", "dependencies": { "is-valid-path": "^0.1.1", "validator": "^13.7.0" diff --git a/package.json b/package.json index 6f0e2aac74..3fe38c50db 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "eslint": "^9.32.0", "glob": "^11.0.3", "globals": "^16.3.0", - "iptv-playlist-parser": "^0.15.0", + "iptv-playlist-parser": "^0.15.1", "jest": "^30.0.5", "jest-expect-message": "^1.1.3", "lodash.uniqueid": "^4.0.1", From 4861c60b74047ec43748d8e3730c08a5069fe38d Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:29:04 +0300 Subject: [PATCH 44/51] Update tests/__data__ --- tests/__data__/expected/playlist_format/in.m3u | 2 +- tests/__data__/input/playlist_format/in.m3u | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/__data__/expected/playlist_format/in.m3u b/tests/__data__/expected/playlist_format/in.m3u index 2615da4e4c..84637bfe5c 100644 --- a/tests/__data__/expected/playlist_format/in.m3u +++ b/tests/__data__/expected/playlist_format/in.m3u @@ -1,3 +1,3 @@ #EXTM3U -#EXTINF:-1 tvg-id="",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] +#EXTINF:-1 tvg-id="" http-referrer="http://test.com" http-user-agent="Mozilla/5.0",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 diff --git a/tests/__data__/input/playlist_format/in.m3u b/tests/__data__/input/playlist_format/in.m3u index 3d0bcd3596..0a013ba7a1 100644 --- a/tests/__data__/input/playlist_format/in.m3u +++ b/tests/__data__/input/playlist_format/in.m3u @@ -1,3 +1,3 @@ #EXTM3U -#EXTINF:-1 tvg-id="mn.in",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] +#EXTINF:-1 tvg-id="mn.in" http-referrer="http://test.com" http-user-agent="Mozilla/5.0",Manorama News -2 [U3] (480p) [Geo-blocked] [Not 24/7] https://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8 From eb467ba38a6a232f0cf8de236736a0b877a4691f Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 00:12:53 +0000 Subject: [PATCH 45/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18361420582) workflow. closes #27906, closes #27903, closes #27902, closes #27901, closes #27900, closes #27898, closes #27897, closes #27896, closes #27895, closes #27893, closes #27892, closes #27891, closes #27890, closes #27889, closes #27888, closes #27852, closes #27850, closes #27785, closes #27731, closes #27712, closes #27638 --- streams/ae.m3u | 2 ++ streams/br.m3u | 2 ++ streams/cl.m3u | 2 ++ streams/co.m3u | 2 ++ streams/eg.m3u | 2 ++ streams/fr.m3u | 2 ++ streams/id.m3u | 2 +- streams/ly.m3u | 2 ++ streams/mx.m3u | 10 ++++++++++ streams/pe.m3u | 2 ++ streams/pk.m3u | 10 ++++++++++ streams/rw.m3u | 2 ++ streams/us.m3u | 4 +++- streams/zw.m3u | 2 ++ 14 files changed, 44 insertions(+), 2 deletions(-) diff --git a/streams/ae.m3u b/streams/ae.m3u index e4daa5dfad..249f53504e 100644 --- a/streams/ae.m3u +++ b/streams/ae.m3u @@ -147,3 +147,5 @@ http://213.57.91.138:8000/play/a05s http://213.57.91.138:8000/play/a05t #EXTINF:-1 tvg-id="ZeeAlwan.ae@Egypt",Zee Alwan Egypt (576p) http://213.57.91.138:8000/play/a05u +#EXTINF:-1 tvg-id="DubaiOne.ae@SD",Dubai One +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/dubaione/playlist.m3u8 diff --git a/streams/br.m3u b/streams/br.m3u index 68a3771c69..2b0b2f88ab 100644 --- a/streams/br.m3u +++ b/streams/br.m3u @@ -408,3 +408,5 @@ http://unitvaovivo.ufrgs.br:8080/live.ogg https://sistemavrt.vrtchannel.tv.br:3473/stream/play.m3u8 #EXTINF:-1 tvg-id="VV8TV.br",VV8 TV (720p) https://video01.kshost.com.br/seap8272/seap8272/playlist.m3u8 +#EXTINF:-1 tvg-id="TVGuarapari.br@SD",TV Guarapari (1080p) +https://ikki.hubcloud.tv.br/TVGuarapari/index.m3u8 diff --git a/streams/cl.m3u b/streams/cl.m3u index 0f08210089..050451eaac 100644 --- a/streams/cl.m3u +++ b/streams/cl.m3u @@ -193,3 +193,5 @@ http://38.250.127.17:9800/play/a067/index.m3u8 http://38.250.127.17:9800/play/a05h/index.m3u8 #EXTINF:-1 tvg-id="CanalClaro.cl",Canal Claro (480p) http://181.188.216.5:18000/play/a09l/index.m3u8 +#EXTINF:-1 tvg-id="JuntosTV.cl@SD",Juntos TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/juntos/playlist.m3u8 diff --git a/streams/co.m3u b/streams/co.m3u index 0e6db3b45f..b7a65c6328 100644 --- a/streams/co.m3u +++ b/streams/co.m3u @@ -160,3 +160,5 @@ http://192.144.113.132:1935/live/ViveTV/playlist.m3u8 https://canalzoom.smoothcloud.co:3027/live/canalzoombr1live.m3u8 #EXTINF:-1 tvg-id="CanalRCN.co",Canal RCN (480p) http://38.183.182.166:8000/play/a10i/index.m3u8 +#EXTINF:-1 tvg-id="NTN24.co@SD",NTN24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/rcnnoticias/playlist.m3u8 diff --git a/streams/eg.m3u b/streams/eg.m3u index 8b73dc55a3..cfcb0a8de4 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -90,3 +90,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/alhadathalyoum/play https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/egyptiantvhd/playlist.m3u8 #EXTINF:-1 tvg-id="AghapyTV.eg@SD",Aghapy TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/aghapytv/playlist.m3u8 +#EXTINF:-1 tvg-id="MixHollywood.eg@SD",Mix Hollywood +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119198/mix/playlist.m3u8 diff --git a/streams/fr.m3u b/streams/fr.m3u index ed56b3ff3b..91793d3aae 100644 --- a/streams/fr.m3u +++ b/streams/fr.m3u @@ -367,3 +367,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/dbmtv/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/telesud/playlist.m3u8 #EXTINF:-1 tvg-id="BSmartTV.fr@SD",B Smart TV (320p) https://raw.githubusercontent.com/Sibprod/streams/main/ressources/dm/py/hls/bsmart.m3u8 +#EXTINF:-1 tvg-id="NOVO19.fr@HD",NOVO19 (720p) +https://viamotionhsi.netplus.ch/live/eds/novo19/browser-HLS8/novo19.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index e04cd24979..5fe83330d5 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -293,5 +293,5 @@ http://122.248.43.242:1935/JAWAPOSTVBALI/_definst_/myStream/playlist.m3u8 https://hgmtv.com:19360/asthatv/asthatv.m3u8 #EXTINF:-1 tvg-id="BatamTV.id@SD",Batam TV (480p) [Not 24/7] http://122.248.43.242:1935/BATAMTV/_definst_/myStream/playlist.m3u8 -#EXTINF:-1 tvg-id="MadaniTV.id@SD" http-referrer="https://madanitv.net/livestream",Madani TV (720p) +#EXTINF:-1 tvg-id="MadaniTV.id@SD",Madani TV (720p) https://stream.asianastream.com/madani/madanitv.smil/playlist.m3u8 diff --git a/streams/ly.m3u b/streams/ly.m3u index 8691d84a22..1221c6d004 100644 --- a/streams/ly.m3u +++ b/streams/ly.m3u @@ -19,3 +19,5 @@ https://tip.stream.tanasuh.tv:4434/live/smil:tanasuhtv.smil/playlist.m3u8 https://alwasattv.hibridcdn.net/alwasattv/alwasat_abr/playlist.m3u8 #EXTINF:-1 tvg-id="LibyaAlrasmiaChannel.ly@SD",Libya Alrasmia Channel https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/libyaalrasmia/playlist.m3u8 +#EXTINF:-1 tvg-id="TanasuhTV.ly@HD",Tanasuh TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/tanasuhtv/playlist.m3u8 diff --git a/streams/mx.m3u b/streams/mx.m3u index 31820b8d4b..238743a89a 100644 --- a/streams/mx.m3u +++ b/streams/mx.m3u @@ -404,3 +404,13 @@ https://stream.oursnetworktv.com/latin/encoder73/playlist.m3u8 https://stream8.mexiserver.com:1936/xtinetwork/xtinetwork/playlist.m3u8 #EXTINF:-1 tvg-id="ZAZ.mx",ZAZ https://cloud.fastchannel.es/mic/manifiest/hls/zaztv/zaztv.m3u8 +#EXTINF:-1 tvg-id="AzClic.mx@SD",Az Clic +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/aztecaclic/playlist.m3u8 +#EXTINF:-1 tvg-id="AzCorazon.mx@SD",Az Corazon +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/aztecacorazon/playlist.m3u8 +#EXTINF:-1 tvg-id="AztecaInternacional.mx@SD",Azteca Internacional +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/aztecainternacional/playlist.m3u8 +#EXTINF:-1 tvg-id="TVLibertad.mx@SD",TV Libertad +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/tvlibertad/playlist.m3u8 +#EXTINF:-1 tvg-id="ADN40.mx@SD",ADN 40 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/adn40/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index 51558674e8..3cfe93caae 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -187,3 +187,5 @@ http://38.183.182.166:8000/play/a12t/index.m3u8 http://38.183.182.166:8000/play/a120/index.m3u8 #EXTINF:-1 tvg-id="TVPeru.pe",TV Peru (1080p) http://38.183.182.166:8000/play/a12u/index.m3u8 +#EXTINF:-1 tvg-id="AmericaTelevision.pe@SD",America Television +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/americatv1/playlist.m3u8 diff --git a/streams/pk.m3u b/streams/pk.m3u index e384a19247..85d36d4e19 100644 --- a/streams/pk.m3u +++ b/streams/pk.m3u @@ -99,3 +99,13 @@ http://116.90.120.149:8000/play/a01g/index.m3u8 http://116.90.120.149:8000/play/a01f/index.m3u8 #EXTINF:-1 tvg-id="Minimax.pk@SD",Minimax (576p) [Not 24/7] http://116.90.120.149:8000/play/a01c/index.m3u8 +#EXTINF:-1 tvg-id="SABTV.pk@SD",SAB TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119688/sabtv/playlist.m3u8 +#EXTINF:-1 tvg-id="ChannelFive.pk@SD",Channel Five +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119688/channel5/playlist.m3u8 +#EXTINF:-1 tvg-id="SindhTVNews.pk@SD",Sindh TV News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119688/sindhnews/playlist.m3u8 +#EXTINF:-1 tvg-id="SindhTV.pk@SD",Sindh TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119688/sindhtv/playlist.m3u8 +#EXTINF:-1 tvg-id="DiscoverPakistan.pk@SD",Discover Pakistan +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119688/discoverpakistan/playlist.m3u8 diff --git a/streams/rw.m3u b/streams/rw.m3u index d727dd32ca..05aa868d39 100644 --- a/streams/rw.m3u +++ b/streams/rw.m3u @@ -29,3 +29,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/btn/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/kc2tv/playlist.m3u8 #EXTINF:-1 tvg-id="RwandaTV.rw@SD",Rwanda TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/rwandatv/playlist.m3u8 +#EXTINF:-1 tvg-id="BPlusTV.rw@SD",B+ TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120681/bplus/playlist.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index 49a7b4c1dd..3581257a8e 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1080,5 +1080,7 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/elbeshara/playlist. https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/ebstv/playlist.m3u8 #EXTINF:-1 tvg-id="ESPNDeportes.us@SD",ESPN Deportes (1080p) [Not 24/7] https://stream.mux.com/DyxPGQOWJuWUxJ7uY2lhrnI0102Z3lo3qUxlaW01zQ2Ozs.m3u8 -#EXTINF:-1 tvg-id="DirecTVSports.us" http-referrer="https://www.directvsports.com/",DirecTV Sports (1080p) +#EXTINF:-1 tvg-id="DirecTVSports.us",DirecTV Sports (1080p) http://38.183.182.166:8000/play/a125/index.m3u8 +#EXTINF:-1 tvg-id="HistoryLatinAmerica.us" http-referrer="http://www.history.com/",History Latin America (480p) +http://181.188.216.5:18000/play/a0cf/index.m3u8 diff --git a/streams/zw.m3u b/streams/zw.m3u index 0436397268..5957e136b3 100644 --- a/streams/zw.m3u +++ b/streams/zw.m3u @@ -7,3 +7,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/yadahtvplus/playlis https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/3ktv/playlist.m3u8 #EXTINF:-1 tvg-id="ZBCTV.zw@SD",ZBC TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/zbctv/playlist.m3u8 +#EXTINF:-1 tvg-id="MeribaTV.zw@SD",Meriba TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/meribatv/playlist.m3u8 From a80a6b0b594febb18f23b1357378e551038f0429 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 00:12:53 +0000 Subject: [PATCH 46/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18361420582) workflow. --- PLAYLISTS.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 65906ac578..fe03557344 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -29,30 +29,30 @@ Same thing, but split up into separate files: Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u Culture169https://iptv-org.github.io/iptv/categories/culture.m3u - Documentary124https://iptv-org.github.io/iptv/categories/documentary.m3u + Documentary125https://iptv-org.github.io/iptv/categories/documentary.m3u Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment635https://iptv-org.github.io/iptv/categories/entertainment.m3u + Entertainment641https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General2427https://iptv-org.github.io/iptv/categories/general.m3u + General2437https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u Kids271https://iptv-org.github.io/iptv/categories/kids.m3u Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle106https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies373https://iptv-org.github.io/iptv/categories/movies.m3u + Lifestyle108https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Movies377https://iptv-org.github.io/iptv/categories/movies.m3u Music633https://iptv-org.github.io/iptv/categories/music.m3u - News831https://iptv-org.github.io/iptv/categories/news.m3u + News834https://iptv-org.github.io/iptv/categories/news.m3u Outdoor43https://iptv-org.github.io/iptv/categories/outdoor.m3u - Public26https://iptv-org.github.io/iptv/categories/public.m3u + Public29https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u - Religious722https://iptv-org.github.io/iptv/categories/religious.m3u + Religious723https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u - Series261https://iptv-org.github.io/iptv/categories/series.m3u + Series265https://iptv-org.github.io/iptv/categories/series.m3u Shop85https://iptv-org.github.io/iptv/categories/shop.m3u Sports301https://iptv-org.github.io/iptv/categories/sports.m3u Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3693https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3696https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -86,7 +86,7 @@ Same thing, but split up into separate files: Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic8https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic441https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic442https://iptv-org.github.io/iptv/languages/ara.m3u Armenian7https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -125,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2404https://iptv-org.github.io/iptv/languages/eng.m3u + English2406https://iptv-org.github.io/iptv/languages/eng.m3u Estonian9https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -133,7 +133,7 @@ Same thing, but split up into separate files: Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u Finnish16https://iptv-org.github.io/iptv/languages/fin.m3u Fon3https://iptv-org.github.io/iptv/languages/fon.m3u - French521https://iptv-org.github.io/iptv/languages/fra.m3u + French522https://iptv-org.github.io/iptv/languages/fra.m3u Fulah3https://iptv-org.github.io/iptv/languages/ful.m3u Gaelic2https://iptv-org.github.io/iptv/languages/gla.m3u Ganda12https://iptv-org.github.io/iptv/languages/lug.m3u @@ -223,7 +223,7 @@ Same thing, but split up into separate files: Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u Persian226https://iptv-org.github.io/iptv/languages/fas.m3u Polish67https://iptv-org.github.io/iptv/languages/pol.m3u - Portuguese254https://iptv-org.github.io/iptv/languages/por.m3u + Portuguese255https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian98https://iptv-org.github.io/iptv/languages/ron.m3u @@ -243,7 +243,7 @@ Same thing, but split up into separate files: South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1725https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1748https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u Swahili38https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u @@ -271,7 +271,7 @@ Same thing, but split up into separate files: Turkmen8https://iptv-org.github.io/iptv/languages/tuk.m3u Uighur3https://iptv-org.github.io/iptv/languages/uig.m3u Ukrainian58https://iptv-org.github.io/iptv/languages/ukr.m3u - Urdu53https://iptv-org.github.io/iptv/languages/urd.m3u + Urdu55https://iptv-org.github.io/iptv/languages/urd.m3u Uzbek24https://iptv-org.github.io/iptv/languages/uzb.m3u Venda1https://iptv-org.github.io/iptv/languages/ven.m3u Vietnamese82https://iptv-org.github.io/iptv/languages/vie.m3u @@ -286,7 +286,7 @@ Same thing, but split up into separate files: Yue Chinese5https://iptv-org.github.io/iptv/languages/yue.m3u Zarma4https://iptv-org.github.io/iptv/languages/dje.m3u Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u - Undefined2176https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined2178https://iptv-org.github.io/iptv/languages/undefined.m3u @@ -501,6 +501,8 @@ Same thing, but split up into separate files: - 🇨🇫 Central African Republic https://iptv-org.github.io/iptv/countries/cf.m3u - 🇹🇩 Chad https://iptv-org.github.io/iptv/countries/td.m3u - 🇨🇱 Chile https://iptv-org.github.io/iptv/countries/cl.m3u + - Biobio https://iptv-org.github.io/iptv/subdivisions/cl-bi.m3u + - Yumbel https://iptv-org.github.io/iptv/cities/clyum.m3u - La Araucania https://iptv-org.github.io/iptv/subdivisions/cl-ar.m3u - Libertador General Bernardo O'Higgins https://iptv-org.github.io/iptv/subdivisions/cl-li.m3u - Pichilemu https://iptv-org.github.io/iptv/cities/clplm.m3u From 60fde4cc8c03f02b47ebe0b6373971e610081713 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Thu, 9 Oct 2025 03:20:46 +0300 Subject: [PATCH 47/51] Replace LF with CRLF --- .github/CODE_OF_CONDUCT.md | 26 +- .github/FUNDING.yml | 24 +- .gitignore | 16 +- .readme/.gitignore | 6 +- .readme/template.md | 176 +- CONTRIBUTING.md | 430 +- FAQ.md | 46 +- LICENSE | 48 +- PLAYLISTS.md | 176 +- README.md | 158 +- m3u-linter.json | 34 +- scripts/constants.ts | 22 +- scripts/core/logParser.ts | 28 +- scripts/core/numberParser.ts | 20 +- scripts/core/proxyParser.ts | 62 +- scripts/generators/generator.ts | 6 +- scripts/models/issue.ts | 38 +- scripts/tables/index.ts | 8 +- .../playlist_generate/logs/generators.log | 170 +- .../expected/readme_update/playlists.md | 354 +- tests/__data__/input/issues.js | 4794 ++++++++--------- tests/__data__/input/playlist_test/results.js | 28 +- tests/commands/api/generate.test.ts | 52 +- tests/commands/playlist/edit.test.ts | 76 +- tests/commands/playlist/format.test.ts | 73 +- tests/commands/playlist/generate.test.ts | 86 +- tests/commands/playlist/test.test.ts | 42 +- tests/commands/playlist/validate.test.ts | 89 +- tests/commands/readme/update.test.ts | 52 +- tsconfig.json | 38 +- 30 files changed, 3590 insertions(+), 3588 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 760ee26d2c..91ec0a38e8 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -1,13 +1,13 @@ -# Contributor Code of Conduct - -As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. - -We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. - -Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at https://www.contributor-covenant.org/version/1/0/0/code-of-conduct.html +# Contributor Code of Conduct + +As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at https://www.contributor-covenant.org/version/1/0/0/code-of-conduct.html diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 7d4c3fe13e..0e164e4b09 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,12 +1,12 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: iptv-org -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: iptv-org +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore index ad225b41d1..199606266c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -node_modules -.artifacts -.secrets -.actrc -.DS_Store -/.gh-pages/ -/.api/ -.env +node_modules +.artifacts +.secrets +.actrc +.DS_Store +/.gh-pages/ +/.api/ +.env /temp/ \ No newline at end of file diff --git a/.readme/.gitignore b/.readme/.gitignore index a2ac441348..3d74e4ba3f 100644 --- a/.readme/.gitignore +++ b/.readme/.gitignore @@ -1,4 +1,4 @@ -_categories.md -_countries.md -_languages.md +_categories.md +_countries.md +_languages.md _regions.md \ No newline at end of file diff --git a/.readme/template.md b/.readme/template.md index 74e1549f92..4b7a9594e2 100644 --- a/.readme/template.md +++ b/.readme/template.md @@ -1,88 +1,88 @@ -## Playlists - -There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). - -### Grouped by category - -Playlists in which channels are grouped by category. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.category.m3u -``` - -Same thing, but split up into separate files: - - -#include "./.readme/_categories.md" - -
- -### Grouped by language - -Playlists in which channels are grouped by the language in which they are broadcast. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.language.m3u -``` - -Same thing, but split up into separate files: - - -#include "./.readme/_languages.md" - -
- -### Grouped by broadcast area - -Playlists in which channels are grouped by broadcast area. - -
-Expand - -#### Countries - -``` -https://iptv-org.github.io/iptv/index.country.m3u -``` - -Same thing, but split up into separate files: - - -#include "./.readme/_countries.md" - -#### Regions - - -#include "./.readme/_regions.md" - -
- -### Grouped by sources - -Playlists in which channels are grouped by broadcast source. - -
-Expand -
- -To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. - -``` -https://iptv-org.github.io/iptv/sources/.m3u -``` - -
- -Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: - -``` -https://iptv-org.github.io/iptv/raw/.m3u -``` +## Playlists + +There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). + +### Grouped by category + +Playlists in which channels are grouped by category. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.category.m3u +``` + +Same thing, but split up into separate files: + + +#include "./.readme/_categories.md" + +
+ +### Grouped by language + +Playlists in which channels are grouped by the language in which they are broadcast. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.language.m3u +``` + +Same thing, but split up into separate files: + + +#include "./.readme/_languages.md" + +
+ +### Grouped by broadcast area + +Playlists in which channels are grouped by broadcast area. + +
+Expand + +#### Countries + +``` +https://iptv-org.github.io/iptv/index.country.m3u +``` + +Same thing, but split up into separate files: + + +#include "./.readme/_countries.md" + +#### Regions + + +#include "./.readme/_regions.md" + +
+ +### Grouped by sources + +Playlists in which channels are grouped by broadcast source. + +
+Expand +
+ +To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. + +``` +https://iptv-org.github.io/iptv/sources/.m3u +``` + +
+ +Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: + +``` +https://iptv-org.github.io/iptv/raw/.m3u +``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fefa6edd3d..925c5b8584 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,215 +1,215 @@ -# Contributing Guide - -- [How to?](#how-to) -- [Stream Description Scheme](#stream-description-scheme) -- [Project Structure](#project-structure) -- [Scripts](#scripts) -- [Workflows](#workflows) - -## How to? - -### How to add a new stream link to a playlists? - -You have several options: - -1. Create a new request using this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+) and if approved, the link will automatically be added to the playlist on the next update. - -2. Add the link to the playlist directly using a [pull request](https://github.com/iptv-org/iptv/pulls). - -Regardless of which option you choose, before posting your request please do the following: - -- Make sure the link you want to add works stably. To check this, open it in one of the players (for example, [VLC player](https://www.videolan.org/vlc/index.html)) and watch the broadcast for at least a minute (some test streams are interrupted after 15-30 seconds). -- Make sure the link is not already in the playlist. This can be done by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository. -- Find the ID of the channel you want on [iptv-org.github.io](https://iptv-org.github.io/). If your desired channel is not on the list you can leave a request to add it [here](https://github.com/iptv-org/database/issues/new/choose). -- Make sure the channel is not blocklisted. It can also be done through [iptv-org.github.io](https://iptv-org.github.io/). -- The link does not lead to the Xtream Codes server. [Why don't you accept links to Xtream Codes server?](FAQ.md#why-dont-you-accept-links-to-xtream-codes-server) -- If you know that the broadcast only works in certain countries or it is periodically interrupted, do not forget to indicate this in the request. - -A requests without a valid stream ID or working link to the stream will be closed immediately. - -Note all links in playlists are sorted automatically by scripts so there is no need to sort them manually. For more info, see [Scripts](#scripts). - -### How to fix the stream description? - -Most of the stream description (channel name, feed name, categories, languages, broadcast area, logo) we load from the [iptv-org/database](https://github.com/iptv-org/database) using the stream ID. - -So first of all, make sure that the desired stream has the correct ID. A full list of all supported channels and their corresponding IDs can be found on [iptv-org.github.io](https://iptv-org.github.io/). To change the stream ID of any link in the playlist, just fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams%3Aedit&projects=&template=2_streams_edit.yml&title=Edit%3A+). - -If, however, you have found an error in the database itself, this is the place to go: [How to edit channel description?](https://github.com/iptv-org/database/blob/master/CONTRIBUTING.md#how-to-edit-channel-description) - -### How to distinguish a link to an Xtream Codes server from a regular one? - -Most of them have this form: - -`http(s)://{hostname}:{port}/{username}/{password}/{channelID}` (port is often `25461`) - -To make sure that the link leads to the Xtream Codes server, copy the `hostname`, `port`, `username` and `password` into the link below and try to open it in a browser: - -`http(s)://{hostname}:{port}/panel_api.php?username={username}&password={password}` - -If the link answers, you're with an Xtream Codes server. - -### How to report a broken stream? - -Fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:remove&projects=&template=3_streams_report.yml&title=Broken%3A+) and as soon as a working replacement appears, we will add it to the playlist or at least remove the non-working one. - -The only thing before publishing your report is to make sure that: - -- The link is still in our playlists. You can verify this by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository. -- The link really doesn't work and is not just [geo-blocked](https://en.wikipedia.org/wiki/Geo-blocking). To check this, you can either use a [VPN](https://en.wikipedia.org/wiki/Virtual_private_network) or services such as [streamtest.in](https://streamtest.in/). - -An issue without a valid link will be closed immediately. - -### How to find a broken stream? - -For starters, you can just try to open the playlist in [VLC player](https://www.videolan.org/vlc/). The player outputs all errors to the log (Tools -> Messages) so you'll be able to determine pretty accurately why a link isn't working. - -Another way to test links is to use the NPM script. To do this, first make sure you have [Node.js](https://nodejs.org/en) installed on your system. Then go to the `iptv` folder using [Console](https://en.wikipedia.org/wiki/Windows_Console) (or [Terminal]() if you have macOS) and run the command: - -```sh -npm run playlist:test path/to/playlist.m3u -``` - -This command will run an automatic check of all links in the playlist and display their status: - -```sh -npm run playlist:test streams/fr.m3u - -streams/fr.m3u -┌─────┬───────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────────────┐ -│ │ tvg-id │ url │ status │ -├─────┼───────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────────────────────┤ -│ 0 │ 6ter.fr │ https://origin-caf900c010ea8046.live.6cloud.fr/out/v1/29c7a579af3348b48230f76cd75699a5/dash_short... │ LOADING... │ -│ 1 │ 20MinutesTV.fr │ https://lives.digiteka.com/stream/86d3e867-a272-496b-8412-f59aa0104771/index.m3u8 │ FFMPEG_STREAMS_NOT_FOUND │ -│ 2 │ │ https://video1.getstreamhosting.com:1936/8420/8420/playlist.m3u8 │ OK │ -│ 3 │ ADNTVPlus.fr │ https://samsunguk-adn-samsung-fre-qfrlc.amagi.tv/playlist/samsunguk-adn-samsung-fre/playlist.m3u8 │ HTTP_FORBIDDEN │ -│ 4 │ Africa24.fr │ https://edge12.vedge.infomaniak.com/livecast/ik:africa24/manifest.m3u8 │ OK │ -│ 5 │ Africa24English.fr │ https://edge17.vedge.infomaniak.com/livecast/ik:africa24sport/manifest.m3u8 │ OK │ -│ 6 │ AfricanewsEnglish.fr │ https://37c774660687468c821a51190046facf.mediatailor.us-east-1.amazonaws.com/v1/master/04fd913bb2... │ HTTP_GATEWAY_TIMEOUT │ -│ 7 │ AlpedHuezTV.fr │ https://edge.vedge.infomaniak.com/livecast/ik:adhtv/chunklist.m3u8 │ HTTP_NOT_FOUND │ -``` - -After that, all you have to do is report any broken streams you find. - -### How to replace a broken stream? - -This can be done either by filling out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams%3Aedit&projects=&template=2_streams_edit.yml&title=Edit%3A+). - -Either by directly updating the files in the [/streams](/streams) folder and then creating a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). - -### How to remove my channel from playlist? - -To request removal of a link to a channel from the repository, you need to fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=removal+request&projects=&template=6_copyright-claim.yml&title=Remove%3A+) and wait for the request to be reviewed (this usually takes no more than 1 business day). And if the request is approved, links to the channel will be immediately removed from the repository. - -The channel will also be added to our [blocklist](https://github.com/iptv-org/database/blob/master/data/blocklist.csv) to avoid its appearance in our playlists in the future. - -Please note that we only accept removal requests from channel owners and their official representatives, all other requests will be closed immediately. - -## Stream Description Scheme - -For a stream to be approved, its description must follow this template: - -``` -#EXTINF:-1 tvg-id="STREAM_ID",STREAM_TITLE (QUALITY) [LABEL] -STREAM_URL -``` - -| Attribute | Description | Required | Valid values | -| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- | -| `STREAM_ID` | Stream ID consisting of channel ID and feed ID. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). | Optional | `` or `@` | -| `STREAM_TITLE` | Stream title consisting of channel name and feed name. May contain any characters except: `,`, `[`, `]`. | Required | - | -| `QUALITY` | Maximum stream quality. | Optional | `2160p`, `1080p`, `720p`, `480p`, `360p` etc | -| `LABEL` | Specified in cases where the broadcast for some reason may not be available to some users. | Optional | `Geo-blocked` or `Not 24/7` | -| `STREAM_URL` | Stream URL. | Required | - | - -Example: - -```xml -#EXTINF:-1 tvg-id="ExampleTV.us@East",Example TV East (720p) [Not 24/7] -https://example.com/playlist.m3u8 -``` - -Also, if necessary, you can specify custom [HTTP User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) and [HTTP Referrer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) through additional attributes: - -```xml -#EXTINF:-1 tvg-id="ExampleTV.us" http-referrer="http://example.com/" http-user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)",Example TV -http://example.com/stream.m3u8 -``` - -or use player-specific directives: - -_VLC_ - -```xml -#EXTINF:-1 tvg-id="ExampleTV.us@VLC",Example TV -#EXTVLCOPT:http-referrer=http://example.com/ -#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) -http://example.com/stream.m3u8 -``` - -_Kodi_ - -```xml -#EXTINF:-1 tvg-id="ExampleTV.us@Kodi",Example TV -#KODIPROP:inputstream=inputstream.adaptive -#KODIPROP:inputstream.adaptive.stream_headers=Referer=http://example.com/&User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) -http://example.com/stream.m3u8 -``` - -## Project Structure - -- `.github/` - - `ISSUE_TEMPLATE/`: issue templates for the repository. - - `workflows`: contains [GitHub actions](https://docs.github.com/en/actions/quickstart) workflows. - - `CODE_OF_CONDUCT.md`: rules you shouldn't break if you don't want to get banned. -- `.readme/` - - `config.json`: config for the `markdown-include` package, which is used to compile everything into one `PLAYLISTS.md` file. - - `preview.png`: image displayed in the `README.md`. - - `template.md`: template for `PLAYLISTS.md`. -- `scripts/`: contains all scripts used in the repository. -- `streams/`: contains all streams broken down by the country from which they are broadcast. -- `tests/`: contains tests to check the scripts. -- `CONTRIBUTING.md`: file you are currently reading. -- `PLAYLISTS.md`: auto-updated list of available playlists. -- `README.md`: project description. - -## Scripts - -These scripts are created to automate routine processes in the repository and make it a bit easier to maintain. - -For scripts to work, you must have [Node.js](https://nodejs.org/en) installed on your computer. - -To run scripts use the `npm run ` command. - -- `act:check`: allows to run the [check](https://github.com/iptv-org/iptv/blob/master/.github/workflows/check.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). -- `act:format`: allows to test the [format](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). -- `act:update`: allows to test the [update](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). -- `api:load`: downloads the latest channel and stream data from the [iptv-org/api](https://github.com/iptv-org/api). -- `api:generate`: generates a JSON file with all streams for the [iptv-org/api](https://github.com/iptv-org/api) repository. -- `api:deploy`: allows to manually upload a JSON file created via `api:generate` to the [iptv-org/api](https://github.com/iptv-org/api) repository. To run the script you must provide your [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) with write access to the repository. -- `playlist:format`: formats internal playlists. The process includes [URL normalization](https://en.wikipedia.org/wiki/URI_normalization), duplicate removal, removing invalid id's and sorting links by channel name, quality, and label. -- `playlist:update`: triggers an update of internal playlists. The process involves processing approved requests from issues. -- `playlist:generate`: generates all public playlists. -- `playlist:validate`: сhecks ids and links in internal playlists for errors. -- `playlist:lint`: сhecks internal playlists for syntax errors. -- `playlist:test`: tests links in internal playlists. -- `playlist:edit`: utility for quick streams mapping. -- `playlist:deploy`: allows to manually publish all generated via `playlist:generate` playlists. To run the script you must provide your [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) with write access to the repository. -- `readme:update`: updates the list of playlists in [README.md](README.md). -- `report:create`: creates a report on current issues. -- `check`: (shorthand) sequentially runs the `playlist:lint` and `playlist:validate` scripts. -- `format`: (shorthand) runs the `playlist:format` script. -- `update`: (shorthand) sequentially runs the `playlist:generate`, `api:generate` and `readme:update` scripts. -- `deploy`: (shorthand) sequentially runs the `playlist:deploy` and `api:deploy` scripts. -- `lint`: сhecks the scripts for syntax errors. -- `test`: runs a test of all the scripts described above. - -## Workflows - -To automate the run of the scripts described above, we use the [GitHub Actions workflows](https://docs.github.com/en/actions/using-workflows). - -Each workflow includes its own set of scripts that can be run either manually or in response to an event. - -- `check`: sequentially runs the `api:load`, `playlist:check` and `playlist:validate` scripts when a new pull request appears, and blocks the merge if it detects an error in it. -- `format`: sequentially runs `api:load`, `playlist:format`, `playlist:lint` and `playlist:validate` scripts. -- `update`: every day at 0:00 UTC sequentially runs `api:load`, `playlist:update`, `playlist:lint`, `playlist:validate`, `playlist:generate`, `api:generate` and `readme:update` scripts and deploys the output files if successful. +# Contributing Guide + +- [How to?](#how-to) +- [Stream Description Scheme](#stream-description-scheme) +- [Project Structure](#project-structure) +- [Scripts](#scripts) +- [Workflows](#workflows) + +## How to? + +### How to add a new stream link to a playlists? + +You have several options: + +1. Create a new request using this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:add&projects=&template=1_streams_add.yml&title=Add%3A+) and if approved, the link will automatically be added to the playlist on the next update. + +2. Add the link to the playlist directly using a [pull request](https://github.com/iptv-org/iptv/pulls). + +Regardless of which option you choose, before posting your request please do the following: + +- Make sure the link you want to add works stably. To check this, open it in one of the players (for example, [VLC player](https://www.videolan.org/vlc/index.html)) and watch the broadcast for at least a minute (some test streams are interrupted after 15-30 seconds). +- Make sure the link is not already in the playlist. This can be done by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository. +- Find the ID of the channel you want on [iptv-org.github.io](https://iptv-org.github.io/). If your desired channel is not on the list you can leave a request to add it [here](https://github.com/iptv-org/database/issues/new/choose). +- Make sure the channel is not blocklisted. It can also be done through [iptv-org.github.io](https://iptv-org.github.io/). +- The link does not lead to the Xtream Codes server. [Why don't you accept links to Xtream Codes server?](FAQ.md#why-dont-you-accept-links-to-xtream-codes-server) +- If you know that the broadcast only works in certain countries or it is periodically interrupted, do not forget to indicate this in the request. + +A requests without a valid stream ID or working link to the stream will be closed immediately. + +Note all links in playlists are sorted automatically by scripts so there is no need to sort them manually. For more info, see [Scripts](#scripts). + +### How to fix the stream description? + +Most of the stream description (channel name, feed name, categories, languages, broadcast area, logo) we load from the [iptv-org/database](https://github.com/iptv-org/database) using the stream ID. + +So first of all, make sure that the desired stream has the correct ID. A full list of all supported channels and their corresponding IDs can be found on [iptv-org.github.io](https://iptv-org.github.io/). To change the stream ID of any link in the playlist, just fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams%3Aedit&projects=&template=2_streams_edit.yml&title=Edit%3A+). + +If, however, you have found an error in the database itself, this is the place to go: [How to edit channel description?](https://github.com/iptv-org/database/blob/master/CONTRIBUTING.md#how-to-edit-channel-description) + +### How to distinguish a link to an Xtream Codes server from a regular one? + +Most of them have this form: + +`http(s)://{hostname}:{port}/{username}/{password}/{channelID}` (port is often `25461`) + +To make sure that the link leads to the Xtream Codes server, copy the `hostname`, `port`, `username` and `password` into the link below and try to open it in a browser: + +`http(s)://{hostname}:{port}/panel_api.php?username={username}&password={password}` + +If the link answers, you're with an Xtream Codes server. + +### How to report a broken stream? + +Fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams:remove&projects=&template=3_streams_report.yml&title=Broken%3A+) and as soon as a working replacement appears, we will add it to the playlist or at least remove the non-working one. + +The only thing before publishing your report is to make sure that: + +- The link is still in our playlists. You can verify this by [searching](https://github.com/search?q=repo%3Aiptv-org%2Fiptv+http%3A%2F%2Fexample.com&type=code) the repository. +- The link really doesn't work and is not just [geo-blocked](https://en.wikipedia.org/wiki/Geo-blocking). To check this, you can either use a [VPN](https://en.wikipedia.org/wiki/Virtual_private_network) or services such as [streamtest.in](https://streamtest.in/). + +An issue without a valid link will be closed immediately. + +### How to find a broken stream? + +For starters, you can just try to open the playlist in [VLC player](https://www.videolan.org/vlc/). The player outputs all errors to the log (Tools -> Messages) so you'll be able to determine pretty accurately why a link isn't working. + +Another way to test links is to use the NPM script. To do this, first make sure you have [Node.js](https://nodejs.org/en) installed on your system. Then go to the `iptv` folder using [Console](https://en.wikipedia.org/wiki/Windows_Console) (or [Terminal]() if you have macOS) and run the command: + +```sh +npm run playlist:test path/to/playlist.m3u +``` + +This command will run an automatic check of all links in the playlist and display their status: + +```sh +npm run playlist:test streams/fr.m3u + +streams/fr.m3u +┌─────┬───────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────────────┐ +│ │ tvg-id │ url │ status │ +├─────┼───────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────┼───────────────────────────┤ +│ 0 │ 6ter.fr │ https://origin-caf900c010ea8046.live.6cloud.fr/out/v1/29c7a579af3348b48230f76cd75699a5/dash_short... │ LOADING... │ +│ 1 │ 20MinutesTV.fr │ https://lives.digiteka.com/stream/86d3e867-a272-496b-8412-f59aa0104771/index.m3u8 │ FFMPEG_STREAMS_NOT_FOUND │ +│ 2 │ │ https://video1.getstreamhosting.com:1936/8420/8420/playlist.m3u8 │ OK │ +│ 3 │ ADNTVPlus.fr │ https://samsunguk-adn-samsung-fre-qfrlc.amagi.tv/playlist/samsunguk-adn-samsung-fre/playlist.m3u8 │ HTTP_FORBIDDEN │ +│ 4 │ Africa24.fr │ https://edge12.vedge.infomaniak.com/livecast/ik:africa24/manifest.m3u8 │ OK │ +│ 5 │ Africa24English.fr │ https://edge17.vedge.infomaniak.com/livecast/ik:africa24sport/manifest.m3u8 │ OK │ +│ 6 │ AfricanewsEnglish.fr │ https://37c774660687468c821a51190046facf.mediatailor.us-east-1.amazonaws.com/v1/master/04fd913bb2... │ HTTP_GATEWAY_TIMEOUT │ +│ 7 │ AlpedHuezTV.fr │ https://edge.vedge.infomaniak.com/livecast/ik:adhtv/chunklist.m3u8 │ HTTP_NOT_FOUND │ +``` + +After that, all you have to do is report any broken streams you find. + +### How to replace a broken stream? + +This can be done either by filling out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=streams%3Aedit&projects=&template=2_streams_edit.yml&title=Edit%3A+). + +Either by directly updating the files in the [/streams](/streams) folder and then creating a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). + +### How to remove my channel from playlist? + +To request removal of a link to a channel from the repository, you need to fill out this [form](https://github.com/iptv-org/iptv/issues/new?assignees=&labels=removal+request&projects=&template=6_copyright-claim.yml&title=Remove%3A+) and wait for the request to be reviewed (this usually takes no more than 1 business day). And if the request is approved, links to the channel will be immediately removed from the repository. + +The channel will also be added to our [blocklist](https://github.com/iptv-org/database/blob/master/data/blocklist.csv) to avoid its appearance in our playlists in the future. + +Please note that we only accept removal requests from channel owners and their official representatives, all other requests will be closed immediately. + +## Stream Description Scheme + +For a stream to be approved, its description must follow this template: + +``` +#EXTINF:-1 tvg-id="STREAM_ID",STREAM_TITLE (QUALITY) [LABEL] +STREAM_URL +``` + +| Attribute | Description | Required | Valid values | +| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- | +| `STREAM_ID` | Stream ID consisting of channel ID and feed ID. Full list of supported channels with corresponding ID could be found on [iptv-org.github.io](https://iptv-org.github.io/). | Optional | `` or `@` | +| `STREAM_TITLE` | Stream title consisting of channel name and feed name. May contain any characters except: `,`, `[`, `]`. | Required | - | +| `QUALITY` | Maximum stream quality. | Optional | `2160p`, `1080p`, `720p`, `480p`, `360p` etc | +| `LABEL` | Specified in cases where the broadcast for some reason may not be available to some users. | Optional | `Geo-blocked` or `Not 24/7` | +| `STREAM_URL` | Stream URL. | Required | - | + +Example: + +```xml +#EXTINF:-1 tvg-id="ExampleTV.us@East",Example TV East (720p) [Not 24/7] +https://example.com/playlist.m3u8 +``` + +Also, if necessary, you can specify custom [HTTP User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) and [HTTP Referrer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) through additional attributes: + +```xml +#EXTINF:-1 tvg-id="ExampleTV.us" http-referrer="http://example.com/" http-user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)",Example TV +http://example.com/stream.m3u8 +``` + +or use player-specific directives: + +_VLC_ + +```xml +#EXTINF:-1 tvg-id="ExampleTV.us@VLC",Example TV +#EXTVLCOPT:http-referrer=http://example.com/ +#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) +http://example.com/stream.m3u8 +``` + +_Kodi_ + +```xml +#EXTINF:-1 tvg-id="ExampleTV.us@Kodi",Example TV +#KODIPROP:inputstream=inputstream.adaptive +#KODIPROP:inputstream.adaptive.stream_headers=Referer=http://example.com/&User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) +http://example.com/stream.m3u8 +``` + +## Project Structure + +- `.github/` + - `ISSUE_TEMPLATE/`: issue templates for the repository. + - `workflows`: contains [GitHub actions](https://docs.github.com/en/actions/quickstart) workflows. + - `CODE_OF_CONDUCT.md`: rules you shouldn't break if you don't want to get banned. +- `.readme/` + - `config.json`: config for the `markdown-include` package, which is used to compile everything into one `PLAYLISTS.md` file. + - `preview.png`: image displayed in the `README.md`. + - `template.md`: template for `PLAYLISTS.md`. +- `scripts/`: contains all scripts used in the repository. +- `streams/`: contains all streams broken down by the country from which they are broadcast. +- `tests/`: contains tests to check the scripts. +- `CONTRIBUTING.md`: file you are currently reading. +- `PLAYLISTS.md`: auto-updated list of available playlists. +- `README.md`: project description. + +## Scripts + +These scripts are created to automate routine processes in the repository and make it a bit easier to maintain. + +For scripts to work, you must have [Node.js](https://nodejs.org/en) installed on your computer. + +To run scripts use the `npm run ` command. + +- `act:check`: allows to run the [check](https://github.com/iptv-org/iptv/blob/master/.github/workflows/check.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). +- `act:format`: allows to test the [format](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). +- `act:update`: allows to test the [update](https://github.com/iptv-org/iptv/blob/master/.github/workflows/update.yml) workflow locally. Depends on [nektos/act](https://github.com/nektos/act). +- `api:load`: downloads the latest channel and stream data from the [iptv-org/api](https://github.com/iptv-org/api). +- `api:generate`: generates a JSON file with all streams for the [iptv-org/api](https://github.com/iptv-org/api) repository. +- `api:deploy`: allows to manually upload a JSON file created via `api:generate` to the [iptv-org/api](https://github.com/iptv-org/api) repository. To run the script you must provide your [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) with write access to the repository. +- `playlist:format`: formats internal playlists. The process includes [URL normalization](https://en.wikipedia.org/wiki/URI_normalization), duplicate removal, removing invalid id's and sorting links by channel name, quality, and label. +- `playlist:update`: triggers an update of internal playlists. The process involves processing approved requests from issues. +- `playlist:generate`: generates all public playlists. +- `playlist:validate`: сhecks ids and links in internal playlists for errors. +- `playlist:lint`: сhecks internal playlists for syntax errors. +- `playlist:test`: tests links in internal playlists. +- `playlist:edit`: utility for quick streams mapping. +- `playlist:deploy`: allows to manually publish all generated via `playlist:generate` playlists. To run the script you must provide your [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) with write access to the repository. +- `readme:update`: updates the list of playlists in [README.md](README.md). +- `report:create`: creates a report on current issues. +- `check`: (shorthand) sequentially runs the `playlist:lint` and `playlist:validate` scripts. +- `format`: (shorthand) runs the `playlist:format` script. +- `update`: (shorthand) sequentially runs the `playlist:generate`, `api:generate` and `readme:update` scripts. +- `deploy`: (shorthand) sequentially runs the `playlist:deploy` and `api:deploy` scripts. +- `lint`: сhecks the scripts for syntax errors. +- `test`: runs a test of all the scripts described above. + +## Workflows + +To automate the run of the scripts described above, we use the [GitHub Actions workflows](https://docs.github.com/en/actions/using-workflows). + +Each workflow includes its own set of scripts that can be run either manually or in response to an event. + +- `check`: sequentially runs the `api:load`, `playlist:check` and `playlist:validate` scripts when a new pull request appears, and blocks the merge if it detects an error in it. +- `format`: sequentially runs `api:load`, `playlist:format`, `playlist:lint` and `playlist:validate` scripts. +- `update`: every day at 0:00 UTC sequentially runs `api:load`, `playlist:update`, `playlist:lint`, `playlist:validate`, `playlist:generate`, `api:generate` and `readme:update` scripts and deploys the output files if successful. diff --git a/FAQ.md b/FAQ.md index 4de9c73547..988fc265dc 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1,23 +1,23 @@ -# Frequently Asked Questions - -### My favorite channel is not on the playlist. - -Start by asking our community for help via [Discussions](https://github.com/orgs/iptv-org/discussions). It is quite possible that someone already has a link to the channel you need and they just haven't added it to our playlist yet. - -But keep in mind that not all TV channels are available for viewing online, and in this case there is little we can do about it. - -### Are you planning to include a Video On Demand (VOD) to the playlist? - -No. - -### Why is the channel on the iptv-org.github.io but not in the playlist? - -The site contains a list of all TV channels in the world and only those of them for which we have working stream links are included in the playlists. - -### Can I add a radio broadcast? - -Yes, if it is a [visual radio](https://en.wikipedia.org/wiki/Visual_radio) in which a video and audio are shown at the same time. - -### Why don't you accept links to Xtream Codes server? - -Xtream Codes streams tend to be very unstable, and often links to them fail very quickly, so it's easier for us to initially exclude them from the playlist than to search for expired ones every day. +# Frequently Asked Questions + +### My favorite channel is not on the playlist. + +Start by asking our community for help via [Discussions](https://github.com/orgs/iptv-org/discussions). It is quite possible that someone already has a link to the channel you need and they just haven't added it to our playlist yet. + +But keep in mind that not all TV channels are available for viewing online, and in this case there is little we can do about it. + +### Are you planning to include a Video On Demand (VOD) to the playlist? + +No. + +### Why is the channel on the iptv-org.github.io but not in the playlist? + +The site contains a list of all TV channels in the world and only those of them for which we have working stream links are included in the playlists. + +### Can I add a radio broadcast? + +Yes, if it is a [visual radio](https://en.wikipedia.org/wiki/Visual_radio) in which a video and audio are shown at the same time. + +### Why don't you accept links to Xtream Codes server? + +Xtream Codes streams tend to be very unstable, and often links to them fail very quickly, so it's easier for us to initially exclude them from the playlist than to search for expired ones every day. diff --git a/LICENSE b/LICENSE index 68a49daad8..edeed79019 100644 --- a/LICENSE +++ b/LICENSE @@ -1,24 +1,24 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 65906ac578..79d3e56e07 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -1,22 +1,22 @@ -## Playlists - -There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). - -### Grouped by category - -Playlists in which channels are grouped by category. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.category.m3u -``` - -Same thing, but split up into separate files: - - +## Playlists + +There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). + +### Grouped by category + +Playlists in which channels are grouped by category. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.category.m3u +``` + +Same thing, but split up into separate files: + + @@ -54,25 +54,25 @@ Same thing, but split up into separate files: -
CategoryChannelsPlaylist
XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u
Undefined3693https://iptv-org.github.io/iptv/categories/undefined.m3u
- -
- -### Grouped by language - -Playlists in which channels are grouped by the language in which they are broadcast. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.language.m3u -``` - -Same thing, but split up into separate files: - - + + +
+ +### Grouped by language + +Playlists in which channels are grouped by the language in which they are broadcast. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.language.m3u +``` + +Same thing, but split up into separate files: + + @@ -288,26 +288,26 @@ Same thing, but split up into separate files: -
LanguageChannelsPlaylist
Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u
Undefined2176https://iptv-org.github.io/iptv/languages/undefined.m3u
- -
- -### Grouped by broadcast area - -Playlists in which channels are grouped by broadcast area. - -
-Expand - -#### Countries - -``` -https://iptv-org.github.io/iptv/index.country.m3u -``` - -Same thing, but split up into separate files: - - + + +
+ +### Grouped by broadcast area + +Playlists in which channels are grouped by broadcast area. + +
+Expand + +#### Countries + +``` +https://iptv-org.github.io/iptv/index.country.m3u +``` + +Same thing, but split up into separate files: + + - 🇦🇫 Afghanistan https://iptv-org.github.io/iptv/countries/af.m3u - 🇦🇱 Albania https://iptv-org.github.io/iptv/countries/al.m3u - 🇩🇿 Algeria https://iptv-org.github.io/iptv/countries/dz.m3u @@ -1283,11 +1283,11 @@ Same thing, but split up into separate files: - 🇿🇲 Zambia https://iptv-org.github.io/iptv/countries/zm.m3u - 🇿🇼 Zimbabwe https://iptv-org.github.io/iptv/countries/zw.m3u - 🌐 International https://iptv-org.github.io/iptv/countries/int.m3u -- Undefined https://iptv-org.github.io/iptv/countries/undefined.m3u - -#### Regions - - +- Undefined https://iptv-org.github.io/iptv/countries/undefined.m3u + +#### Regions + + - Africa https://iptv-org.github.io/iptv/regions/afr.m3u - Americas https://iptv-org.github.io/iptv/regions/amer.m3u - Arab world https://iptv-org.github.io/iptv/regions/arab.m3u @@ -1329,28 +1329,28 @@ Same thing, but split up into separate files: - West Africa https://iptv-org.github.io/iptv/regions/waf.m3u - West Asia https://iptv-org.github.io/iptv/regions/was.m3u - Western Europe https://iptv-org.github.io/iptv/regions/wer.m3u -- Worldwide https://iptv-org.github.io/iptv/regions/ww.m3u - -
- -### Grouped by sources - -Playlists in which channels are grouped by broadcast source. - -
-Expand -
- -To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. - -``` -https://iptv-org.github.io/iptv/sources/.m3u -``` - -
- -Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: - -``` -https://iptv-org.github.io/iptv/raw/.m3u -``` +- Worldwide https://iptv-org.github.io/iptv/regions/ww.m3u + +
+ +### Grouped by sources + +Playlists in which channels are grouped by broadcast source. + +
+Expand +
+ +To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. + +``` +https://iptv-org.github.io/iptv/sources/.m3u +``` + +
+ +Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: + +``` +https://iptv-org.github.io/iptv/raw/.m3u +``` diff --git a/README.md b/README.md index 371afea056..24bb67ca03 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,79 @@ -# IPTV [![update](https://github.com/iptv-org/iptv/actions/workflows/update.yml/badge.svg)](https://github.com/iptv-org/iptv/actions/workflows/update.yml) - -Collection of publicly available IPTV (Internet Protocol television) channels from all over the world. - -## Table of contents - -- 🚀 [How to use?](#how-to-use) -- 📺 [Playlists](#playlists) -- 🗓 [EPG](#epg) -- 🗄 [Database](#database) -- 👨‍💻 [API](#api) -- 📚 [Resources](#resources) -- 💬 [Discussions](#discussions) -- ❓ [FAQ](#faq) -- 🛠 [Contribution](#contribution) -- ⚖ [Legal](#legal) -- © [License](#license) - -## How to use? - -Simply paste the link to one of the playlists into [any video player](https://github.com/iptv-org/awesome-iptv#apps) that supports live streaming and press _Open_. - -![VLC Network Panel](https://github.com/iptv-org/iptv/raw/master/.readme/preview.png) - -## Playlists - -The main playlist containing all channels available in the repository can be found at: - -``` -https://iptv-org.github.io/iptv/index.m3u -``` - -Links to other playlists can be found in the [PLAYLISTS.md](PLAYLISTS.md) file. - -## EPG - -[Electronic Program Guide](https://en.wikipedia.org/wiki/Electronic_program_guide) for most of the channels can be downloaded using utilities published in the [iptv-org/epg](https://github.com/iptv-org/epg) repository. - -## Database - -All channel data is taken from the [iptv-org/database](https://github.com/iptv-org/database) repository. If you find any errors please open a new [issue](https://github.com/iptv-org/database/issues) there. - -## API - -The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository. - -## Resources - -Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository. - -## Discussions - -If you need help finding a channel, have a question or idea, welcome to the [Discussions](https://github.com/orgs/iptv-org/discussions). - -## FAQ - -The answers to the most popular questions can be found in the [FAQ.md](FAQ.md) file. - -## Contribution - -Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request. - -And thank you to everyone who has already contributed! - -### Backers - - - -### Contributors - - - -## Legal - -No video files are stored in this repository. The repository simply contains user-submitted links to publicly available video stream URLs, which to the best of our knowledge have been intentionally made publicly by the copyright holders. If any links in these playlists infringe on your rights as a copyright holder, they may be removed by sending a [pull request](https://github.com/iptv-org/iptv/pulls) or opening an [issue](https://github.com/iptv-org/iptv/issues/new?assignees=freearhey&labels=removal+request&template=--removal-request.yml&title=Remove%3A+). However, note that we have **no control** over the destination of the link, and just removing the link from the playlist will not remove its contents from the web. Note that linking does not directly infringe copyright because no copy is made on the site providing the link, and thus this is **not** a valid reason to send a DMCA notice to GitHub. To remove this content from the web, you should contact the web host that's actually hosting the content (**not** GitHub, nor the maintainers of this repository). - -## License - -[![CC0](http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](LICENSE) +# IPTV [![update](https://github.com/iptv-org/iptv/actions/workflows/update.yml/badge.svg)](https://github.com/iptv-org/iptv/actions/workflows/update.yml) + +Collection of publicly available IPTV (Internet Protocol television) channels from all over the world. + +## Table of contents + +- 🚀 [How to use?](#how-to-use) +- 📺 [Playlists](#playlists) +- 🗓 [EPG](#epg) +- 🗄 [Database](#database) +- 👨‍💻 [API](#api) +- 📚 [Resources](#resources) +- 💬 [Discussions](#discussions) +- ❓ [FAQ](#faq) +- 🛠 [Contribution](#contribution) +- ⚖ [Legal](#legal) +- © [License](#license) + +## How to use? + +Simply paste the link to one of the playlists into [any video player](https://github.com/iptv-org/awesome-iptv#apps) that supports live streaming and press _Open_. + +![VLC Network Panel](https://github.com/iptv-org/iptv/raw/master/.readme/preview.png) + +## Playlists + +The main playlist containing all channels available in the repository can be found at: + +``` +https://iptv-org.github.io/iptv/index.m3u +``` + +Links to other playlists can be found in the [PLAYLISTS.md](PLAYLISTS.md) file. + +## EPG + +[Electronic Program Guide](https://en.wikipedia.org/wiki/Electronic_program_guide) for most of the channels can be downloaded using utilities published in the [iptv-org/epg](https://github.com/iptv-org/epg) repository. + +## Database + +All channel data is taken from the [iptv-org/database](https://github.com/iptv-org/database) repository. If you find any errors please open a new [issue](https://github.com/iptv-org/database/issues) there. + +## API + +The API documentation can be found in the [iptv-org/api](https://github.com/iptv-org/api) repository. + +## Resources + +Links to other useful IPTV-related resources can be found in the [iptv-org/awesome-iptv](https://github.com/iptv-org/awesome-iptv) repository. + +## Discussions + +If you need help finding a channel, have a question or idea, welcome to the [Discussions](https://github.com/orgs/iptv-org/discussions). + +## FAQ + +The answers to the most popular questions can be found in the [FAQ.md](FAQ.md) file. + +## Contribution + +Please make sure to read the [Contributing Guide](CONTRIBUTING.md) before sending an issue or making a pull request. + +And thank you to everyone who has already contributed! + +### Backers + + + +### Contributors + + + +## Legal + +No video files are stored in this repository. The repository simply contains user-submitted links to publicly available video stream URLs, which to the best of our knowledge have been intentionally made publicly by the copyright holders. If any links in these playlists infringe on your rights as a copyright holder, they may be removed by sending a [pull request](https://github.com/iptv-org/iptv/pulls) or opening an [issue](https://github.com/iptv-org/iptv/issues/new?assignees=freearhey&labels=removal+request&template=--removal-request.yml&title=Remove%3A+). However, note that we have **no control** over the destination of the link, and just removing the link from the playlist will not remove its contents from the web. Note that linking does not directly infringe copyright because no copy is made on the site providing the link, and thus this is **not** a valid reason to send a DMCA notice to GitHub. To remove this content from the web, you should contact the web host that's actually hosting the content (**not** GitHub, nor the maintainers of this repository). + +## License + +[![CC0](http://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg)](LICENSE) diff --git a/m3u-linter.json b/m3u-linter.json index 2f835c48dd..fc1f39a3d9 100644 --- a/m3u-linter.json +++ b/m3u-linter.json @@ -1,17 +1,17 @@ -{ - "files": ["streams/*.m3u"], - "rules": { - "no-empty-lines": true, - "require-header": true, - "attribute-quotes": true, - "require-info": true, - "require-title": true, - "no-trailing-spaces": false, - "no-whitespace-before-title": true, - "no-multi-spaces": true, - "no-extra-comma": true, - "space-before-paren": true, - "no-dash": true, - "require-link": true - } -} +{ + "files": ["streams/*.m3u"], + "rules": { + "no-empty-lines": true, + "require-header": true, + "attribute-quotes": true, + "require-info": true, + "require-title": true, + "no-trailing-spaces": false, + "no-whitespace-before-title": true, + "no-multi-spaces": true, + "no-extra-comma": true, + "space-before-paren": true, + "no-dash": true, + "require-link": true + } +} diff --git a/scripts/constants.ts b/scripts/constants.ts index f6b688714b..e607a87b5e 100644 --- a/scripts/constants.ts +++ b/scripts/constants.ts @@ -1,11 +1,11 @@ -export const ROOT_DIR = process.env.ROOT_DIR || './' -export const STREAMS_DIR = process.env.STREAMS_DIR || './streams' -export const PUBLIC_DIR = process.env.PUBLIC_DIR || './.gh-pages' -export const README_DIR = process.env.README_DIR || './.readme' -export const API_DIR = process.env.API_DIR || './.api' -export const DATA_DIR = process.env.DATA_DIR || './temp/data' -export const LOGS_DIR = process.env.LOGS_DIR || './temp/logs' -export const TESTING = process.env.NODE_ENV === 'test' ? true : false -export const OWNER = 'iptv-org' -export const REPO = 'iptv' -export const EOL = '\r\n' +export const ROOT_DIR = process.env.ROOT_DIR || './' +export const STREAMS_DIR = process.env.STREAMS_DIR || './streams' +export const PUBLIC_DIR = process.env.PUBLIC_DIR || './.gh-pages' +export const README_DIR = process.env.README_DIR || './.readme' +export const API_DIR = process.env.API_DIR || './.api' +export const DATA_DIR = process.env.DATA_DIR || './temp/data' +export const LOGS_DIR = process.env.LOGS_DIR || './temp/logs' +export const TESTING = process.env.NODE_ENV === 'test' ? true : false +export const OWNER = 'iptv-org' +export const REPO = 'iptv' +export const EOL = '\r\n' diff --git a/scripts/core/logParser.ts b/scripts/core/logParser.ts index fb888f6b5a..7b80f32460 100644 --- a/scripts/core/logParser.ts +++ b/scripts/core/logParser.ts @@ -1,14 +1,14 @@ -export type LogItem = { - type: string - filepath: string - count: number -} - -export class LogParser { - parse(content: string): LogItem[] { - if (!content) return [] - const lines = content.split('\n') - - return lines.map(line => (line ? JSON.parse(line) : null)).filter(l => l) - } -} +export type LogItem = { + type: string + filepath: string + count: number +} + +export class LogParser { + parse(content: string): LogItem[] { + if (!content) return [] + const lines = content.split('\n') + + return lines.map(line => (line ? JSON.parse(line) : null)).filter(l => l) + } +} diff --git a/scripts/core/numberParser.ts b/scripts/core/numberParser.ts index 187cc7469d..f9b5a4fbdf 100644 --- a/scripts/core/numberParser.ts +++ b/scripts/core/numberParser.ts @@ -1,10 +1,10 @@ -export default class NumberParser { - async parse(number: string) { - const parsed = parseInt(number) - if (isNaN(parsed)) { - throw new Error('numberParser:parse() Input value is not a number') - } - - return parsed - } -} +export default class NumberParser { + async parse(number: string) { + const parsed = parseInt(number) + if (isNaN(parsed)) { + throw new Error('numberParser:parse() Input value is not a number') + } + + return parsed + } +} diff --git a/scripts/core/proxyParser.ts b/scripts/core/proxyParser.ts index 9cede1afc5..545d190a90 100644 --- a/scripts/core/proxyParser.ts +++ b/scripts/core/proxyParser.ts @@ -1,31 +1,31 @@ -import { URL } from 'node:url' - -interface ProxyParserResult { - protocol: string | null - auth?: { - username?: string - password?: string - } - host: string - port: number | null -} - -export class ProxyParser { - parse(_url: string): ProxyParserResult { - const parsed = new URL(_url) - - const result: ProxyParserResult = { - protocol: parsed.protocol.replace(':', '') || null, - host: parsed.hostname, - port: parsed.port ? parseInt(parsed.port) : null - } - - if (parsed.username || parsed.password) { - result.auth = {} - if (parsed.username) result.auth.username = parsed.username - if (parsed.password) result.auth.password = parsed.password - } - - return result - } -} +import { URL } from 'node:url' + +interface ProxyParserResult { + protocol: string | null + auth?: { + username?: string + password?: string + } + host: string + port: number | null +} + +export class ProxyParser { + parse(_url: string): ProxyParserResult { + const parsed = new URL(_url) + + const result: ProxyParserResult = { + protocol: parsed.protocol.replace(':', '') || null, + host: parsed.hostname, + port: parsed.port ? parseInt(parsed.port) : null + } + + if (parsed.username || parsed.password) { + result.auth = {} + if (parsed.username) result.auth.username = parsed.username + if (parsed.password) result.auth.password = parsed.password + } + + return result + } +} diff --git a/scripts/generators/generator.ts b/scripts/generators/generator.ts index 4220df727d..bf44549064 100644 --- a/scripts/generators/generator.ts +++ b/scripts/generators/generator.ts @@ -1,3 +1,3 @@ -export interface Generator { - generate(): Promise -} +export interface Generator { + generate(): Promise +} diff --git a/scripts/models/issue.ts b/scripts/models/issue.ts index 74602e7457..4b81d69484 100644 --- a/scripts/models/issue.ts +++ b/scripts/models/issue.ts @@ -1,19 +1,19 @@ -import { IssueData } from '../core' - -type IssueProps = { - number: number - labels: string[] - data: IssueData -} - -export class Issue { - number: number - labels: string[] - data: IssueData - - constructor({ number, labels, data }: IssueProps) { - this.number = number - this.labels = labels - this.data = data - } -} +import { IssueData } from '../core' + +type IssueProps = { + number: number + labels: string[] + data: IssueData +} + +export class Issue { + number: number + labels: string[] + data: IssueData + + constructor({ number, labels, data }: IssueProps) { + this.number = number + this.labels = labels + this.data = data + } +} diff --git a/scripts/tables/index.ts b/scripts/tables/index.ts index f25c0a3a27..1cb7826ef3 100644 --- a/scripts/tables/index.ts +++ b/scripts/tables/index.ts @@ -1,4 +1,4 @@ -export * from './categoriesTable' -export * from './countriesTable' -export * from './languagesTable' -export * from './regionsTable' +export * from './categoriesTable' +export * from './countriesTable' +export * from './languagesTable' +export * from './regionsTable' diff --git a/tests/__data__/expected/playlist_generate/logs/generators.log b/tests/__data__/expected/playlist_generate/logs/generators.log index 19e38d5a8b..f913b380da 100644 --- a/tests/__data__/expected/playlist_generate/logs/generators.log +++ b/tests/__data__/expected/playlist_generate/logs/generators.log @@ -1,85 +1,85 @@ -{"type":"raw","filepath":"raw/ad.m3u","count":4} -{"type":"raw","filepath":"raw/ca.m3u","count":2} -{"type":"raw","filepath":"raw/in.m3u","count":1} -{"type":"raw","filepath":"raw/kg.m3u","count":1} -{"type":"raw","filepath":"raw/uk.m3u","count":1} -{"type":"raw","filepath":"raw/unsorted.m3u","count":4} -{"type":"category","filepath":"categories/auto.m3u","count":0} -{"type":"category","filepath":"categories/animation.m3u","count":0} -{"type":"category","filepath":"categories/classic.m3u","count":0} -{"type":"category","filepath":"categories/comedy.m3u","count":0} -{"type":"category","filepath":"categories/culture.m3u","count":0} -{"type":"category","filepath":"categories/documentary.m3u","count":0} -{"type":"category","filepath":"categories/business.m3u","count":0} -{"type":"category","filepath":"categories/cooking.m3u","count":0} -{"type":"category","filepath":"categories/education.m3u","count":0} -{"type":"category","filepath":"categories/family.m3u","count":0} -{"type":"category","filepath":"categories/legislative.m3u","count":0} -{"type":"category","filepath":"categories/news.m3u","count":1} -{"type":"category","filepath":"categories/kids.m3u","count":0} -{"type":"category","filepath":"categories/lifestyle.m3u","count":0} -{"type":"category","filepath":"categories/movies.m3u","count":0} -{"type":"category","filepath":"categories/religious.m3u","count":0} -{"type":"category","filepath":"categories/outdoor.m3u","count":0} -{"type":"category","filepath":"categories/general.m3u","count":3} -{"type":"category","filepath":"categories/relax.m3u","count":0} -{"type":"category","filepath":"categories/music.m3u","count":0} -{"type":"category","filepath":"categories/series.m3u","count":0} -{"type":"category","filepath":"categories/travel.m3u","count":0} -{"type":"category","filepath":"categories/sports.m3u","count":0} -{"type":"category","filepath":"categories/science.m3u","count":0} -{"type":"category","filepath":"categories/weather.m3u","count":1} -{"type":"category","filepath":"categories/shop.m3u","count":0} -{"type":"category","filepath":"categories/xxx.m3u","count":1} -{"type":"category","filepath":"categories/undefined.m3u","count":7} -{"type":"category","filepath":"categories/entertainment.m3u","count":0} -{"type":"language","filepath":"languages/cat.m3u","count":1} -{"type":"language","filepath":"languages/eng.m3u","count":1} -{"type":"language","filepath":"languages/undefined.m3u","count":8} -{"type":"language","filepath":"languages/rus.m3u","count":1} -{"type":"country","filepath":"countries/ad.m3u","count":1} -{"type":"country","filepath":"countries/ru.m3u","count":1} -{"type":"country","filepath":"countries/ca.m3u","count":2} -{"type":"country","filepath":"countries/int.m3u","count":4} -{"type":"country","filepath":"countries/undefined.m3u","count":4} -{"type":"subdivision","filepath":"subdivisions/ad-02.m3u","count":1} -{"type":"city","filepath":"cities/adcan.m3u","count":1} -{"type":"region","filepath":"regions/afr.m3u","count":2} -{"type":"source","filepath":"sources/in.m3u","count":1} -{"type":"subdivision","filepath":"subdivisions/ad-07.m3u","count":1} -{"type":"subdivision","filepath":"subdivisions/ca-on.m3u","count":1} -{"type":"region","filepath":"regions/amer.m3u","count":5} -{"type":"region","filepath":"regions/apac.m3u","count":2} -{"type":"region","filepath":"regions/cas.m3u","count":3} -{"type":"region","filepath":"regions/asean.m3u","count":2} -{"type":"region","filepath":"regions/cis.m3u","count":4} -{"type":"region","filepath":"regions/carib.m3u","count":2} -{"type":"region","filepath":"regions/arab.m3u","count":2} -{"type":"region","filepath":"regions/emea.m3u","count":5} -{"type":"region","filepath":"regions/asia.m3u","count":4} -{"type":"region","filepath":"regions/cenamer.m3u","count":2} -{"type":"region","filepath":"regions/ww.m3u","count":7} -{"type":"region","filepath":"regions/eur.m3u","count":5} -{"type":"region","filepath":"regions/lac.m3u","count":2} -{"type":"region","filepath":"regions/maghreb.m3u","count":2} -{"type":"region","filepath":"regions/latam.m3u","count":2} -{"type":"region","filepath":"regions/hispam.m3u","count":2} -{"type":"region","filepath":"regions/mena.m3u","count":2} -{"type":"region","filepath":"regions/mideast.m3u","count":2} -{"type":"region","filepath":"regions/nam.m3u","count":5} -{"type":"region","filepath":"regions/oce.m3u","count":2} -{"type":"region","filepath":"regions/nord.m3u","count":2} -{"type":"region","filepath":"regions/southam.m3u","count":2} -{"type":"region","filepath":"regions/noram.m3u","count":5} -{"type":"region","filepath":"regions/wafr.m3u","count":2} -{"type":"region","filepath":"regions/sas.m3u","count":2} -{"type":"region","filepath":"regions/ssa.m3u","count":2} -{"type":"source","filepath":"sources/unsorted.m3u","count":4} -{"type":"source","filepath":"sources/ca.m3u","count":2} -{"type":"source","filepath":"sources/ad.m3u","count":3} -{"type":"source","filepath":"sources/uk.m3u","count":1} -{"type":"source","filepath":"sources/kg.m3u","count":1} -{"type":"index","filepath":"index.m3u","count":11} -{"type":"index","filepath":"index.category.m3u","count":12} -{"type":"index","filepath":"index.country.m3u","count":12} -{"type":"index","filepath":"index.language.m3u","count":11} +{"type":"raw","filepath":"raw/ad.m3u","count":4} +{"type":"raw","filepath":"raw/ca.m3u","count":2} +{"type":"raw","filepath":"raw/in.m3u","count":1} +{"type":"raw","filepath":"raw/kg.m3u","count":1} +{"type":"raw","filepath":"raw/uk.m3u","count":1} +{"type":"raw","filepath":"raw/unsorted.m3u","count":4} +{"type":"category","filepath":"categories/auto.m3u","count":0} +{"type":"category","filepath":"categories/animation.m3u","count":0} +{"type":"category","filepath":"categories/classic.m3u","count":0} +{"type":"category","filepath":"categories/comedy.m3u","count":0} +{"type":"category","filepath":"categories/culture.m3u","count":0} +{"type":"category","filepath":"categories/documentary.m3u","count":0} +{"type":"category","filepath":"categories/business.m3u","count":0} +{"type":"category","filepath":"categories/cooking.m3u","count":0} +{"type":"category","filepath":"categories/education.m3u","count":0} +{"type":"category","filepath":"categories/family.m3u","count":0} +{"type":"category","filepath":"categories/legislative.m3u","count":0} +{"type":"category","filepath":"categories/news.m3u","count":1} +{"type":"category","filepath":"categories/kids.m3u","count":0} +{"type":"category","filepath":"categories/lifestyle.m3u","count":0} +{"type":"category","filepath":"categories/movies.m3u","count":0} +{"type":"category","filepath":"categories/religious.m3u","count":0} +{"type":"category","filepath":"categories/outdoor.m3u","count":0} +{"type":"category","filepath":"categories/general.m3u","count":3} +{"type":"category","filepath":"categories/relax.m3u","count":0} +{"type":"category","filepath":"categories/music.m3u","count":0} +{"type":"category","filepath":"categories/series.m3u","count":0} +{"type":"category","filepath":"categories/travel.m3u","count":0} +{"type":"category","filepath":"categories/sports.m3u","count":0} +{"type":"category","filepath":"categories/science.m3u","count":0} +{"type":"category","filepath":"categories/weather.m3u","count":1} +{"type":"category","filepath":"categories/shop.m3u","count":0} +{"type":"category","filepath":"categories/xxx.m3u","count":1} +{"type":"category","filepath":"categories/undefined.m3u","count":7} +{"type":"category","filepath":"categories/entertainment.m3u","count":0} +{"type":"language","filepath":"languages/cat.m3u","count":1} +{"type":"language","filepath":"languages/eng.m3u","count":1} +{"type":"language","filepath":"languages/undefined.m3u","count":8} +{"type":"language","filepath":"languages/rus.m3u","count":1} +{"type":"country","filepath":"countries/ad.m3u","count":1} +{"type":"country","filepath":"countries/ru.m3u","count":1} +{"type":"country","filepath":"countries/ca.m3u","count":2} +{"type":"country","filepath":"countries/int.m3u","count":4} +{"type":"country","filepath":"countries/undefined.m3u","count":4} +{"type":"subdivision","filepath":"subdivisions/ad-02.m3u","count":1} +{"type":"city","filepath":"cities/adcan.m3u","count":1} +{"type":"region","filepath":"regions/afr.m3u","count":2} +{"type":"source","filepath":"sources/in.m3u","count":1} +{"type":"subdivision","filepath":"subdivisions/ad-07.m3u","count":1} +{"type":"subdivision","filepath":"subdivisions/ca-on.m3u","count":1} +{"type":"region","filepath":"regions/amer.m3u","count":5} +{"type":"region","filepath":"regions/apac.m3u","count":2} +{"type":"region","filepath":"regions/cas.m3u","count":3} +{"type":"region","filepath":"regions/asean.m3u","count":2} +{"type":"region","filepath":"regions/cis.m3u","count":4} +{"type":"region","filepath":"regions/carib.m3u","count":2} +{"type":"region","filepath":"regions/arab.m3u","count":2} +{"type":"region","filepath":"regions/emea.m3u","count":5} +{"type":"region","filepath":"regions/asia.m3u","count":4} +{"type":"region","filepath":"regions/cenamer.m3u","count":2} +{"type":"region","filepath":"regions/ww.m3u","count":7} +{"type":"region","filepath":"regions/eur.m3u","count":5} +{"type":"region","filepath":"regions/lac.m3u","count":2} +{"type":"region","filepath":"regions/maghreb.m3u","count":2} +{"type":"region","filepath":"regions/latam.m3u","count":2} +{"type":"region","filepath":"regions/hispam.m3u","count":2} +{"type":"region","filepath":"regions/mena.m3u","count":2} +{"type":"region","filepath":"regions/mideast.m3u","count":2} +{"type":"region","filepath":"regions/nam.m3u","count":5} +{"type":"region","filepath":"regions/oce.m3u","count":2} +{"type":"region","filepath":"regions/nord.m3u","count":2} +{"type":"region","filepath":"regions/southam.m3u","count":2} +{"type":"region","filepath":"regions/noram.m3u","count":5} +{"type":"region","filepath":"regions/wafr.m3u","count":2} +{"type":"region","filepath":"regions/sas.m3u","count":2} +{"type":"region","filepath":"regions/ssa.m3u","count":2} +{"type":"source","filepath":"sources/unsorted.m3u","count":4} +{"type":"source","filepath":"sources/ca.m3u","count":2} +{"type":"source","filepath":"sources/ad.m3u","count":3} +{"type":"source","filepath":"sources/uk.m3u","count":1} +{"type":"source","filepath":"sources/kg.m3u","count":1} +{"type":"index","filepath":"index.m3u","count":11} +{"type":"index","filepath":"index.category.m3u","count":12} +{"type":"index","filepath":"index.country.m3u","count":12} +{"type":"index","filepath":"index.language.m3u","count":11} diff --git a/tests/__data__/expected/readme_update/playlists.md b/tests/__data__/expected/readme_update/playlists.md index f643ae9b83..f54d551be3 100644 --- a/tests/__data__/expected/readme_update/playlists.md +++ b/tests/__data__/expected/readme_update/playlists.md @@ -1,177 +1,177 @@ -## Playlists - -There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). - -### Grouped by category - -Playlists in which channels are grouped by category. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.category.m3u -``` - -Same thing, but split up into separate files: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CategoryChannelsPlaylist
Animation0https://iptv-org.github.io/iptv/categories/animation.m3u
Auto0https://iptv-org.github.io/iptv/categories/auto.m3u
Business0https://iptv-org.github.io/iptv/categories/business.m3u
Classic0https://iptv-org.github.io/iptv/categories/classic.m3u
Comedy0https://iptv-org.github.io/iptv/categories/comedy.m3u
Cooking0https://iptv-org.github.io/iptv/categories/cooking.m3u
Culture0https://iptv-org.github.io/iptv/categories/culture.m3u
Documentary0https://iptv-org.github.io/iptv/categories/documentary.m3u
Education0https://iptv-org.github.io/iptv/categories/education.m3u
Entertainment0https://iptv-org.github.io/iptv/categories/entertainment.m3u
Family0https://iptv-org.github.io/iptv/categories/family.m3u
General2https://iptv-org.github.io/iptv/categories/general.m3u
Kids0https://iptv-org.github.io/iptv/categories/kids.m3u
Legislative0https://iptv-org.github.io/iptv/categories/legislative.m3u
Lifestyle0https://iptv-org.github.io/iptv/categories/lifestyle.m3u
Movies0https://iptv-org.github.io/iptv/categories/movies.m3u
Music0https://iptv-org.github.io/iptv/categories/music.m3u
News1https://iptv-org.github.io/iptv/categories/news.m3u
Outdoor0https://iptv-org.github.io/iptv/categories/outdoor.m3u
Relax0https://iptv-org.github.io/iptv/categories/relax.m3u
Religious0https://iptv-org.github.io/iptv/categories/religious.m3u
Science0https://iptv-org.github.io/iptv/categories/science.m3u
Series0https://iptv-org.github.io/iptv/categories/series.m3u
Shop0https://iptv-org.github.io/iptv/categories/shop.m3u
Sports0https://iptv-org.github.io/iptv/categories/sports.m3u
Travel0https://iptv-org.github.io/iptv/categories/travel.m3u
Weather1https://iptv-org.github.io/iptv/categories/weather.m3u
XXX1https://iptv-org.github.io/iptv/categories/xxx.m3u
Undefined3https://iptv-org.github.io/iptv/categories/undefined.m3u
- -
- -### Grouped by language - -Playlists in which channels are grouped by the language in which they are broadcast. - -
-Expand -
- -``` -https://iptv-org.github.io/iptv/index.language.m3u -``` - -Same thing, but split up into separate files: - - - - - - - - - - - - - -
LanguageChannelsPlaylist
Catalan1https://iptv-org.github.io/iptv/languages/cat.m3u
English1https://iptv-org.github.io/iptv/languages/eng.m3u
French1https://iptv-org.github.io/iptv/languages/fra.m3u
Russian1https://iptv-org.github.io/iptv/languages/rus.m3u
Undefined2https://iptv-org.github.io/iptv/languages/undefined.m3u
- -
- -### Grouped by broadcast area - -Playlists in which channels are grouped by broadcast area. - -
-Expand - -#### Countries - -``` -https://iptv-org.github.io/iptv/index.country.m3u -``` - -Same thing, but split up into separate files: - - -- 🇦🇩 Andorra https://iptv-org.github.io/iptv/countries/ad.m3u - - Canillo https://iptv-org.github.io/iptv/subdivisions/ad-02.m3u - - Canillo https://iptv-org.github.io/iptv/cities/adcan.m3u -- 🇨🇲 Cameroon https://iptv-org.github.io/iptv/countries/cm.m3u -- 🇨🇦 Canada https://iptv-org.github.io/iptv/countries/ca.m3u - - Ontario https://iptv-org.github.io/iptv/subdivisions/ca-on.m3u -- 🇨🇻 Cape Verde https://iptv-org.github.io/iptv/countries/cv.m3u -- 🇭🇰 Hong Kong https://iptv-org.github.io/iptv/countries/hk.m3u - - Sai Kung https://iptv-org.github.io/iptv/cities/hk9sk.m3u -- 🇨🇬 Republic of the Congo https://iptv-org.github.io/iptv/countries/cg.m3u -- 🇷🇪 Réunion https://iptv-org.github.io/iptv/countries/re.m3u -- 🇷🇴 Romania https://iptv-org.github.io/iptv/countries/ro.m3u -- 🇷🇺 Russia https://iptv-org.github.io/iptv/countries/ru.m3u -- 🇷🇼 Rwanda https://iptv-org.github.io/iptv/countries/rw.m3u -- 🇧🇱 Saint Barthélemy https://iptv-org.github.io/iptv/countries/bl.m3u -- 🇸🇭 Saint Helena https://iptv-org.github.io/iptv/countries/sh.m3u -- 🇰🇳 Saint Kitts and Nevis https://iptv-org.github.io/iptv/countries/kn.m3u -- 🌐 International https://iptv-org.github.io/iptv/countries/int.m3u -- Undefined https://iptv-org.github.io/iptv/countries/undefined.m3u - -#### Regions - - -- Africa https://iptv-org.github.io/iptv/regions/afr.m3u -- Americas https://iptv-org.github.io/iptv/regions/amer.m3u -- Arab world https://iptv-org.github.io/iptv/regions/arab.m3u -- Asia https://iptv-org.github.io/iptv/regions/asia.m3u -- Asia-Pacific https://iptv-org.github.io/iptv/regions/apac.m3u -- Association of Southeast Asian Nations https://iptv-org.github.io/iptv/regions/asean.m3u -- Caribbean https://iptv-org.github.io/iptv/regions/carib.m3u -- Central America https://iptv-org.github.io/iptv/regions/cenamer.m3u -- Central Asia https://iptv-org.github.io/iptv/regions/cas.m3u -- Commonwealth of Independent States https://iptv-org.github.io/iptv/regions/cis.m3u -- Europe https://iptv-org.github.io/iptv/regions/eur.m3u -- Europe, the Middle East and Africa https://iptv-org.github.io/iptv/regions/emea.m3u -- Hispanic America https://iptv-org.github.io/iptv/regions/hispam.m3u -- Latin America https://iptv-org.github.io/iptv/regions/latam.m3u -- Latin America and the Caribbean https://iptv-org.github.io/iptv/regions/lac.m3u -- Maghreb https://iptv-org.github.io/iptv/regions/maghreb.m3u -- Middle East https://iptv-org.github.io/iptv/regions/mideast.m3u -- Middle East and North Africa https://iptv-org.github.io/iptv/regions/mena.m3u -- Nordics https://iptv-org.github.io/iptv/regions/nord.m3u -- North America https://iptv-org.github.io/iptv/regions/noram.m3u -- Northern America https://iptv-org.github.io/iptv/regions/nam.m3u -- Oceania https://iptv-org.github.io/iptv/regions/oce.m3u -- South America https://iptv-org.github.io/iptv/regions/southam.m3u -- South Asia https://iptv-org.github.io/iptv/regions/sas.m3u -- Sub-Saharan Africa https://iptv-org.github.io/iptv/regions/ssa.m3u -- West Africa https://iptv-org.github.io/iptv/regions/wafr.m3u - -
- -### Grouped by sources - -Playlists in which channels are grouped by broadcast source. - -
-Expand -
- -To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. - -``` -https://iptv-org.github.io/iptv/sources/.m3u -``` - -
- -Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: - -``` -https://iptv-org.github.io/iptv/raw/.m3u -``` +## Playlists + +There are several versions of playlists that differ in the way they are grouped. As of January 30th, 2024, we have stopped distributing NSFW channels. For more information, please look at [this issue](https://github.com/iptv-org/iptv/issues/15723). + +### Grouped by category + +Playlists in which channels are grouped by category. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.category.m3u +``` + +Same thing, but split up into separate files: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryChannelsPlaylist
Animation0https://iptv-org.github.io/iptv/categories/animation.m3u
Auto0https://iptv-org.github.io/iptv/categories/auto.m3u
Business0https://iptv-org.github.io/iptv/categories/business.m3u
Classic0https://iptv-org.github.io/iptv/categories/classic.m3u
Comedy0https://iptv-org.github.io/iptv/categories/comedy.m3u
Cooking0https://iptv-org.github.io/iptv/categories/cooking.m3u
Culture0https://iptv-org.github.io/iptv/categories/culture.m3u
Documentary0https://iptv-org.github.io/iptv/categories/documentary.m3u
Education0https://iptv-org.github.io/iptv/categories/education.m3u
Entertainment0https://iptv-org.github.io/iptv/categories/entertainment.m3u
Family0https://iptv-org.github.io/iptv/categories/family.m3u
General2https://iptv-org.github.io/iptv/categories/general.m3u
Kids0https://iptv-org.github.io/iptv/categories/kids.m3u
Legislative0https://iptv-org.github.io/iptv/categories/legislative.m3u
Lifestyle0https://iptv-org.github.io/iptv/categories/lifestyle.m3u
Movies0https://iptv-org.github.io/iptv/categories/movies.m3u
Music0https://iptv-org.github.io/iptv/categories/music.m3u
News1https://iptv-org.github.io/iptv/categories/news.m3u
Outdoor0https://iptv-org.github.io/iptv/categories/outdoor.m3u
Relax0https://iptv-org.github.io/iptv/categories/relax.m3u
Religious0https://iptv-org.github.io/iptv/categories/religious.m3u
Science0https://iptv-org.github.io/iptv/categories/science.m3u
Series0https://iptv-org.github.io/iptv/categories/series.m3u
Shop0https://iptv-org.github.io/iptv/categories/shop.m3u
Sports0https://iptv-org.github.io/iptv/categories/sports.m3u
Travel0https://iptv-org.github.io/iptv/categories/travel.m3u
Weather1https://iptv-org.github.io/iptv/categories/weather.m3u
XXX1https://iptv-org.github.io/iptv/categories/xxx.m3u
Undefined3https://iptv-org.github.io/iptv/categories/undefined.m3u
+ +
+ +### Grouped by language + +Playlists in which channels are grouped by the language in which they are broadcast. + +
+Expand +
+ +``` +https://iptv-org.github.io/iptv/index.language.m3u +``` + +Same thing, but split up into separate files: + + + + + + + + + + + + + +
LanguageChannelsPlaylist
Catalan1https://iptv-org.github.io/iptv/languages/cat.m3u
English1https://iptv-org.github.io/iptv/languages/eng.m3u
French1https://iptv-org.github.io/iptv/languages/fra.m3u
Russian1https://iptv-org.github.io/iptv/languages/rus.m3u
Undefined2https://iptv-org.github.io/iptv/languages/undefined.m3u
+ +
+ +### Grouped by broadcast area + +Playlists in which channels are grouped by broadcast area. + +
+Expand + +#### Countries + +``` +https://iptv-org.github.io/iptv/index.country.m3u +``` + +Same thing, but split up into separate files: + + +- 🇦🇩 Andorra https://iptv-org.github.io/iptv/countries/ad.m3u + - Canillo https://iptv-org.github.io/iptv/subdivisions/ad-02.m3u + - Canillo https://iptv-org.github.io/iptv/cities/adcan.m3u +- 🇨🇲 Cameroon https://iptv-org.github.io/iptv/countries/cm.m3u +- 🇨🇦 Canada https://iptv-org.github.io/iptv/countries/ca.m3u + - Ontario https://iptv-org.github.io/iptv/subdivisions/ca-on.m3u +- 🇨🇻 Cape Verde https://iptv-org.github.io/iptv/countries/cv.m3u +- 🇭🇰 Hong Kong https://iptv-org.github.io/iptv/countries/hk.m3u + - Sai Kung https://iptv-org.github.io/iptv/cities/hk9sk.m3u +- 🇨🇬 Republic of the Congo https://iptv-org.github.io/iptv/countries/cg.m3u +- 🇷🇪 Réunion https://iptv-org.github.io/iptv/countries/re.m3u +- 🇷🇴 Romania https://iptv-org.github.io/iptv/countries/ro.m3u +- 🇷🇺 Russia https://iptv-org.github.io/iptv/countries/ru.m3u +- 🇷🇼 Rwanda https://iptv-org.github.io/iptv/countries/rw.m3u +- 🇧🇱 Saint Barthélemy https://iptv-org.github.io/iptv/countries/bl.m3u +- 🇸🇭 Saint Helena https://iptv-org.github.io/iptv/countries/sh.m3u +- 🇰🇳 Saint Kitts and Nevis https://iptv-org.github.io/iptv/countries/kn.m3u +- 🌐 International https://iptv-org.github.io/iptv/countries/int.m3u +- Undefined https://iptv-org.github.io/iptv/countries/undefined.m3u + +#### Regions + + +- Africa https://iptv-org.github.io/iptv/regions/afr.m3u +- Americas https://iptv-org.github.io/iptv/regions/amer.m3u +- Arab world https://iptv-org.github.io/iptv/regions/arab.m3u +- Asia https://iptv-org.github.io/iptv/regions/asia.m3u +- Asia-Pacific https://iptv-org.github.io/iptv/regions/apac.m3u +- Association of Southeast Asian Nations https://iptv-org.github.io/iptv/regions/asean.m3u +- Caribbean https://iptv-org.github.io/iptv/regions/carib.m3u +- Central America https://iptv-org.github.io/iptv/regions/cenamer.m3u +- Central Asia https://iptv-org.github.io/iptv/regions/cas.m3u +- Commonwealth of Independent States https://iptv-org.github.io/iptv/regions/cis.m3u +- Europe https://iptv-org.github.io/iptv/regions/eur.m3u +- Europe, the Middle East and Africa https://iptv-org.github.io/iptv/regions/emea.m3u +- Hispanic America https://iptv-org.github.io/iptv/regions/hispam.m3u +- Latin America https://iptv-org.github.io/iptv/regions/latam.m3u +- Latin America and the Caribbean https://iptv-org.github.io/iptv/regions/lac.m3u +- Maghreb https://iptv-org.github.io/iptv/regions/maghreb.m3u +- Middle East https://iptv-org.github.io/iptv/regions/mideast.m3u +- Middle East and North Africa https://iptv-org.github.io/iptv/regions/mena.m3u +- Nordics https://iptv-org.github.io/iptv/regions/nord.m3u +- North America https://iptv-org.github.io/iptv/regions/noram.m3u +- Northern America https://iptv-org.github.io/iptv/regions/nam.m3u +- Oceania https://iptv-org.github.io/iptv/regions/oce.m3u +- South America https://iptv-org.github.io/iptv/regions/southam.m3u +- South Asia https://iptv-org.github.io/iptv/regions/sas.m3u +- Sub-Saharan Africa https://iptv-org.github.io/iptv/regions/ssa.m3u +- West Africa https://iptv-org.github.io/iptv/regions/wafr.m3u + +
+ +### Grouped by sources + +Playlists in which channels are grouped by broadcast source. + +
+Expand +
+ +To use the playlist, simply replace `` in the link below with the name of one of the files in the [streams](streams) folder. + +``` +https://iptv-org.github.io/iptv/sources/.m3u +``` + +
+ +Also, any of our internal playlists are available in raw form (without any filtering or sorting) at this link: + +``` +https://iptv-org.github.io/iptv/raw/.m3u +``` diff --git a/tests/__data__/input/issues.js b/tests/__data__/input/issues.js index e628a7e89d..cbb6a79091 100644 --- a/tests/__data__/input/issues.js +++ b/tests/__data__/input/issues.js @@ -1,2397 +1,2397 @@ -module.exports = [ - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14140', - id: 1881649602, - node_id: 'I_kwDOCWUK8M5wJ7HC', - number: 14140, - title: 'Broken: RIK HD Cyprus', - user: { - login: 'ROBGagn', - id: 124619576, - node_id: 'U_kgDOB22LOA', - avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/ROBGagn', - html_url: 'https://github.com/ROBGagn', - followers_url: 'https://api.github.com/users/ROBGagn/followers', - following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', - gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', - starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', - organizations_url: 'https://api.github.com/users/ROBGagn/orgs', - repos_url: 'https://api.github.com/users/ROBGagn/repos', - events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', - received_events_url: 'https://api.github.com/users/ROBGagn/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1707513547, - node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', - name: 'broken stream', - color: 'FBCA04', - default: false, - description: 'Stream is not working properly' - }, - { - id: 3241837512, - node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', - name: 'CY', - color: '90FA7B', - default: false, - description: 'Cyprus' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-05T10:09:04Z', - updated_at: '2023-09-07T00:50:06Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Broken Links\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\r\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14159', - id: 1881649602, - node_id: 'I_kwDOCWUK8M5wJ7HC', - number: 14159, - title: 'Broken: RIK HD Cyprus', - user: { - login: 'ROBGagn', - id: 124619576, - node_id: 'U_kgDOB22LOA', - avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/ROBGagn', - html_url: 'https://github.com/ROBGagn', - followers_url: 'https://api.github.com/users/ROBGagn/followers', - following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', - gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', - starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', - organizations_url: 'https://api.github.com/users/ROBGagn/orgs', - repos_url: 'https://api.github.com/users/ROBGagn/repos', - events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', - received_events_url: 'https://api.github.com/users/ROBGagn/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1707513547, - node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', - name: 'broken stream', - color: 'FBCA04', - default: false, - description: 'Stream is not working properly' - }, - { - id: 3241837512, - node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', - name: 'CY', - color: '90FA7B', - default: false, - description: 'Cyprus' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-05T10:09:04Z', - updated_at: '2023-09-07T00:50:06Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Broken Links\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\r\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/events', - html_url: 'https://github.com/iptv-org/iptv/issues/19956', - id: 2880738344, - node_id: 'I_kwDOCWUK8M6rtJQo', - number: 19956, - title: 'Find: CNBCe.tr', - user: { - login: 'M3UDay', - id: 164743332, - node_id: 'U_kgDOCdHIpA', - avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/M3UDay', - html_url: 'https://github.com/M3UDay', - followers_url: 'https://api.github.com/users/M3UDay/followers', - following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', - gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', - starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', - organizations_url: 'https://api.github.com/users/M3UDay/orgs', - repos_url: 'https://api.github.com/users/M3UDay/repos', - events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', - received_events_url: 'https://api.github.com/users/M3UDay/received_events', - type: 'User', - user_view_type: 'public', - site_admin: false - }, - labels: [ - { - id: 8197871093, - node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', - name: 'channel search', - color: 'eaeaea', - default: false, - description: 'Request to find a link to a channel stream' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2025-02-26T08:43:49Z', - updated_at: '2025-02-26T08:43:49Z', - closed_at: null, - author_association: 'NONE', - sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, - active_lock_reason: null, - body: '### Channel ID (required)\n\nCNBCe.tr\n\n### Notes\n\n_No response_', - closed_by: null, - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14179', - id: 1884926953, - node_id: 'I_kwDOCWUK8M5wWbPp', - number: 14179, - title: 'Add: Manorama News', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694119113, - node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', - name: 'IN', - color: 'd8139a', - default: false, - description: 'India' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-07T00:38:55Z', - updated_at: '2023-09-07T00:48:32Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nManoramaNews.in\n\n### Stream URL\n\nhttps://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8\n\n### Label\n\nNot 24/7\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14007#issuecomment-1686942043\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14178', - id: 1884922249, - node_id: 'I_kwDOCWUK8M5wWaGJ', - number: 14178, - title: 'Add: TV3', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1912922147, - node_id: 'MDU6TGFiZWwxOTEyOTIyMTQ3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/MY', - name: 'MY', - color: 'ea59cf', - default: false, - description: 'Malaysia' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-07T00:30:51Z', - updated_at: '2023-09-07T00:48:23Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nTV3.my\n\n### Stream URL\n\nhttps://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m3u8\n\n### Label\n\nNone\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14063#issuecomment-1695783106\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14177', - id: 1884920274, - node_id: 'I_kwDOCWUK8M5wWZnS', - number: 14177, - title: 'Add: Temple University TV', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694118251, - node_id: 'MDU6TGFiZWwxNjk0MTE4MjUx', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/US', - name: 'US', - color: '463faa', - default: false, - description: 'United States' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-07T00:27:51Z', - updated_at: '2023-09-07T00:47:15Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nTUTV.us\n\n### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Label\n\nNone\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14096#issue-1874505679\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14175', - id: 1884859778, - node_id: 'I_kwDOCWUK8M5wWK2C', - number: 14175, - title: 'Add: TFX', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694117286, - node_id: 'MDU6TGFiZWwxNjk0MTE3Mjg2', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/FR', - name: 'FR', - color: 'f7ec1b', - default: false, - description: 'France' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-06T22:54:25Z', - updated_at: '2023-09-07T00:57:11Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nTFX.fr\n\n### Stream URL\n\nhttps://stitcher-ipv4.pluto.tv/v1/stitch/embed/hls/channel/64c109a4798def0008a6e03e/master.m3u8?advertisingId={PSID}&appVersion=unknown&deviceDNT={TARGETOPT}&deviceId={PSID}&deviceLat=0&deviceLon=0&deviceMake=samsung&deviceModel=samsung&deviceType=samsung-tvplus&deviceVersion=unknown&embedPartner=samsung-tvplus&profileFloor=&profileLimit=&samsung_app_domain={APP_DOMAIN}&samsung_app_name={APP_NAME}&us_privacy=1YNY\n\n### Label\n\nNone\n\n### HTTP User Agent\n\nMozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\n\n### HTTP Referrer\n\nhttps://pkpakiplay.xyz/\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv-org.github.io/issues/1381\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14179', - id: 1884926953, - node_id: 'I_kwDOCWUK8M5wWbPp', - number: 14179, - title: 'Add: Manorama News', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694119113, - node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', - name: 'IN', - color: 'd8139a', - default: false, - description: 'India' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-07T00:38:55Z', - updated_at: '2023-09-07T00:48:32Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nManoramaNews.in\n\n### Stream URL\n\n(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Videos/GetSourceUrl/694564/0/HLS)\n\n### Label\n\nNot 24/7\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14007#issuecomment-1686942043\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14135', - id: 1880165524, - node_id: 'I_kwDOCWUK8M5wEQyU', - number: 14135, - title: 'Add: BBC World News South Asia ', - user: { - login: 'kheohoanganh', - id: 128283995, - node_id: 'U_kgDOB6V1Ww', - avatar_url: 'https://avatars.githubusercontent.com/u/128283995?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/kheohoanganh', - html_url: 'https://github.com/kheohoanganh', - followers_url: 'https://api.github.com/users/kheohoanganh/followers', - following_url: 'https://api.github.com/users/kheohoanganh/following{/other_user}', - gists_url: 'https://api.github.com/users/kheohoanganh/gists{/gist_id}', - starred_url: 'https://api.github.com/users/kheohoanganh/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/kheohoanganh/subscriptions', - organizations_url: 'https://api.github.com/users/kheohoanganh/orgs', - repos_url: 'https://api.github.com/users/kheohoanganh/repos', - events_url: 'https://api.github.com/users/kheohoanganh/events{/privacy}', - received_events_url: 'https://api.github.com/users/kheohoanganh/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694116077, - node_id: 'MDU6TGFiZWwxNjk0MTE2MDc3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/UK', - name: 'UK', - color: '99e5e5', - default: false, - description: 'United Kingdom' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-04T12:22:50Z', - updated_at: '2023-09-07T00:50:28Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\n\nBBCWorldNews.uk@SouthAsia\n\n### Stream URL (optional)\n\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8\n\n### Notes (optional)\n\n2 links for BBCWorldNewsSouthAsia.uk\r\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8\r\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2802%29/index.m3u8\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14105', - id: 1876637538, - node_id: 'I_kwDOCWUK8M5v2zdi', - number: 14105, - title: 'Add: Amarin TV (720p)', - user: { - login: 'Soponwit19997', - id: 142583084, - node_id: 'U_kgDOCH-lLA', - avatar_url: 'https://avatars.githubusercontent.com/u/142583084?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/Soponwit19997', - html_url: 'https://github.com/Soponwit19997', - followers_url: 'https://api.github.com/users/Soponwit19997/followers', - following_url: 'https://api.github.com/users/Soponwit19997/following{/other_user}', - gists_url: 'https://api.github.com/users/Soponwit19997/gists{/gist_id}', - starred_url: 'https://api.github.com/users/Soponwit19997/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/Soponwit19997/subscriptions', - organizations_url: 'https://api.github.com/users/Soponwit19997/orgs', - repos_url: 'https://api.github.com/users/Soponwit19997/repos', - events_url: 'https://api.github.com/users/Soponwit19997/events{/privacy}', - received_events_url: 'https://api.github.com/users/Soponwit19997/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 2990740232, - node_id: 'MDU6TGFiZWwyOTkwNzQwMjMy', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/TH', - name: 'TH', - color: 'B798EA', - default: false, - description: 'Thailand' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-01T03:08:05Z', - updated_at: '2023-09-06T14:19:50Z', - closed_at: null, - author_association: 'CONTRIBUTOR', - active_lock_reason: null, - body: '### Stream ID\n\nAmarinTV.th\n\n### Stream URL (optional)\n\nhttps://cdn6.goprimetime.info/feed/202306140918/chamarin/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14104', - id: 1876636019, - node_id: 'I_kwDOCWUK8M5v2zFz', - number: 14104, - title: 'Add: MCOT HD (720p)', - user: { - login: 'Soponwit19997', - id: 142583084, - node_id: 'U_kgDOCH-lLA', - avatar_url: 'https://avatars.githubusercontent.com/u/142583084?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/Soponwit19997', - html_url: 'https://github.com/Soponwit19997', - followers_url: 'https://api.github.com/users/Soponwit19997/followers', - following_url: 'https://api.github.com/users/Soponwit19997/following{/other_user}', - gists_url: 'https://api.github.com/users/Soponwit19997/gists{/gist_id}', - starred_url: 'https://api.github.com/users/Soponwit19997/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/Soponwit19997/subscriptions', - organizations_url: 'https://api.github.com/users/Soponwit19997/orgs', - repos_url: 'https://api.github.com/users/Soponwit19997/repos', - events_url: 'https://api.github.com/users/Soponwit19997/events{/privacy}', - received_events_url: 'https://api.github.com/users/Soponwit19997/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 2990740232, - node_id: 'MDU6TGFiZWwyOTkwNzQwMjMy', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/TH', - name: 'TH', - color: 'B798EA', - default: false, - description: 'Thailand' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-01T03:05:56Z', - updated_at: '2023-09-06T14:21:02Z', - closed_at: null, - author_association: 'CONTRIBUTOR', - active_lock_reason: null, - body: '### Stream ID\n\nMCOTHD.th\n\n### Stream URL (optional)\n\nhttps://cdn6.goprimetime.info/feed/202306140918/chmcothd/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14057', - id: 1868766252, - node_id: 'I_kwDOCWUK8M5vYxws', - number: 14057, - title: 'Add: MotorTrend Fast TV', - user: { - login: 'AudioNutz', - id: 28129911, - node_id: 'MDQ6VXNlcjI4MTI5OTEx', - avatar_url: 'https://avatars.githubusercontent.com/u/28129911?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/AudioNutz', - html_url: 'https://github.com/AudioNutz', - followers_url: 'https://api.github.com/users/AudioNutz/followers', - following_url: 'https://api.github.com/users/AudioNutz/following{/other_user}', - gists_url: 'https://api.github.com/users/AudioNutz/gists{/gist_id}', - starred_url: 'https://api.github.com/users/AudioNutz/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/AudioNutz/subscriptions', - organizations_url: 'https://api.github.com/users/AudioNutz/orgs', - repos_url: 'https://api.github.com/users/AudioNutz/repos', - events_url: 'https://api.github.com/users/AudioNutz/events{/privacy}', - received_events_url: 'https://api.github.com/users/AudioNutz/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694118251, - node_id: 'MDU6TGFiZWwxNjk0MTE4MjUx', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/US', - name: 'US', - color: '463faa', - default: false, - description: 'United States' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-08-28T01:23:43Z', - updated_at: '2023-09-06T13:44:17Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\r\n\r\nFastTV.us\r\n\r\n### Stream URL (optional)\r\n\r\nhttps://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8\r\n\r\n### Notes (optional)\r\n\r\nA free stream from MotorTrend TV\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14034', - id: 1863678726, - node_id: 'I_kwDOCWUK8M5vFXsG', - number: 14034, - title: 'Add: match 4(hu)', - user: { - login: 'erich1997', - id: 85035390, - node_id: 'MDQ6VXNlcjg1MDM1Mzkw', - avatar_url: 'https://avatars.githubusercontent.com/u/85035390?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/erich1997', - html_url: 'https://github.com/erich1997', - followers_url: 'https://api.github.com/users/erich1997/followers', - following_url: 'https://api.github.com/users/erich1997/following{/other_user}', - gists_url: 'https://api.github.com/users/erich1997/gists{/gist_id}', - starred_url: 'https://api.github.com/users/erich1997/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/erich1997/subscriptions', - organizations_url: 'https://api.github.com/users/erich1997/orgs', - repos_url: 'https://api.github.com/users/erich1997/repos', - events_url: 'https://api.github.com/users/erich1997/events{/privacy}', - received_events_url: 'https://api.github.com/users/erich1997/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1696015170, - node_id: 'MDU6TGFiZWwxNjk2MDE1MTcw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/HU', - name: 'HU', - color: 'e89bbf', - default: false, - description: 'Hungary' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-08-23T16:42:47Z', - updated_at: '2023-09-06T13:07:20Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\n\nMatch4.hu\n\n### Stream URL (optional)\n\nhttp://194.76.186.33:8000/play/a04d/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13964', - id: 1857666538, - node_id: 'I_kwDOCWUK8M5uub3q', - number: 13964, - title: 'Add: Meth TV [LK] ', - user: { - login: 'Carlinhos027', - id: 111005658, - node_id: 'U_kgDOBp3P2g', - avatar_url: 'https://avatars.githubusercontent.com/u/111005658?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/Carlinhos027', - html_url: 'https://github.com/Carlinhos027', - followers_url: 'https://api.github.com/users/Carlinhos027/followers', - following_url: 'https://api.github.com/users/Carlinhos027/following{/other_user}', - gists_url: 'https://api.github.com/users/Carlinhos027/gists{/gist_id}', - starred_url: 'https://api.github.com/users/Carlinhos027/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/Carlinhos027/subscriptions', - organizations_url: 'https://api.github.com/users/Carlinhos027/orgs', - repos_url: 'https://api.github.com/users/Carlinhos027/repos', - events_url: 'https://api.github.com/users/Carlinhos027/events{/privacy}', - received_events_url: 'https://api.github.com/users/Carlinhos027/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 5432228583, - node_id: 'LA_kwDOCWUK8M8AAAABQ8k65w', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/not%2024/7', - name: 'not 24/7', - color: '40715B', - default: false, - description: '' - }, - { - id: 5641193949, - node_id: 'LA_kwDOCWUK8M8AAAABUD3J3Q', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/LK', - name: 'LK', - color: '0A59ED', - default: false, - description: 'Sri Lanka' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-08-19T10:31:37Z', - updated_at: '2023-09-07T11:25:16Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream ID\n\nMethTV.lk\n\n### Stream URL (optional)\n\nhttps://ythls.onrender.com/channel/UC7kBHRaynsJMB6JcooGLTmA.m3u8\n\n### Notes (optional)\n\n720p / Not 24/7\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13893', - id: 1850537350, - node_id: 'I_kwDOCWUK8M5uTPWG', - number: 13893, - title: 'Add: Weathernews (JPN) via YouTube', - user: { - login: 'arecki2', - id: 18574440, - node_id: 'MDQ6VXNlcjE4NTc0NDQw', - avatar_url: 'https://avatars.githubusercontent.com/u/18574440?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/arecki2', - html_url: 'https://github.com/arecki2', - followers_url: 'https://api.github.com/users/arecki2/followers', - following_url: 'https://api.github.com/users/arecki2/following{/other_user}', - gists_url: 'https://api.github.com/users/arecki2/gists{/gist_id}', - starred_url: 'https://api.github.com/users/arecki2/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/arecki2/subscriptions', - organizations_url: 'https://api.github.com/users/arecki2/orgs', - repos_url: 'https://api.github.com/users/arecki2/repos', - events_url: 'https://api.github.com/users/arecki2/events{/privacy}', - received_events_url: 'https://api.github.com/users/arecki2/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694117140, - node_id: 'MDU6TGFiZWwxNjk0MTE3MTQw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/JP', - name: 'JP', - color: '350bdd', - default: false, - description: 'Japan' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 2, - created_at: '2023-08-14T21:04:00Z', - updated_at: '2023-09-06T14:30:57Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: "### Stream ID\n\nWeathernews.jp\n\n### Stream URL (optional)\n\nhttps://ythls.onrender.com/channel/UCNsidkYpIAQ4QaufptQBPHQ.m3u8\n\n### Notes (optional)\n\nLet's try them 😼\r\n\r\nI've just learned that they change streams for their TV broadcasts on YouTube every 3 hours, so even with additional streams they occasionally activate (such as now during Typhoon Lan), the YT API should manage to pick the correct feed in most cases 😜\r\n\r\nOtherwise, an advantage over the two streams that already are in the database is that the YT broadcasts are in 1080p (vs 720p).\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)", - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13881', - id: 1848780631, - node_id: 'I_kwDOCWUK8M5uMidX', - number: 13881, - title: 'Add: Aaj Tak', - user: { - login: 'R4IN2007', - id: 83226646, - node_id: 'MDQ6VXNlcjgzMjI2NjQ2', - avatar_url: 'https://avatars.githubusercontent.com/u/83226646?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/R4IN2007', - html_url: 'https://github.com/R4IN2007', - followers_url: 'https://api.github.com/users/R4IN2007/followers', - following_url: 'https://api.github.com/users/R4IN2007/following{/other_user}', - gists_url: 'https://api.github.com/users/R4IN2007/gists{/gist_id}', - starred_url: 'https://api.github.com/users/R4IN2007/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/R4IN2007/subscriptions', - organizations_url: 'https://api.github.com/users/R4IN2007/orgs', - repos_url: 'https://api.github.com/users/R4IN2007/repos', - events_url: 'https://api.github.com/users/R4IN2007/events{/privacy}', - received_events_url: 'https://api.github.com/users/R4IN2007/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694119113, - node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', - name: 'IN', - color: 'd8139a', - default: false, - description: 'India' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-08-13T23:23:28Z', - updated_at: '2023-09-06T14:32:15Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\n\nAajTak.in\n\n### Stream URL (optional)\n\nhttps://feeds.intoday.in/aajtak/api/aajtakhd/master.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13793', - id: 1846716551, - node_id: 'I_kwDOCWUK8M5uEqiH', - number: 13793, - title: 'Add: AT-X (JPN)', - user: { - login: 'ZXArkin', - id: 21299971, - node_id: 'MDQ6VXNlcjIxMjk5OTcx', - avatar_url: 'https://avatars.githubusercontent.com/u/21299971?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/ZXArkin', - html_url: 'https://github.com/ZXArkin', - followers_url: 'https://api.github.com/users/ZXArkin/followers', - following_url: 'https://api.github.com/users/ZXArkin/following{/other_user}', - gists_url: 'https://api.github.com/users/ZXArkin/gists{/gist_id}', - starred_url: 'https://api.github.com/users/ZXArkin/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/ZXArkin/subscriptions', - organizations_url: 'https://api.github.com/users/ZXArkin/orgs', - repos_url: 'https://api.github.com/users/ZXArkin/repos', - events_url: 'https://api.github.com/users/ZXArkin/events{/privacy}', - received_events_url: 'https://api.github.com/users/ZXArkin/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694117140, - node_id: 'MDU6TGFiZWwxNjk0MTE3MTQw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/JP', - name: 'JP', - color: '350bdd', - default: false, - description: 'Japan' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 4, - created_at: '2023-08-11T12:11:28Z', - updated_at: '2023-09-06T14:17:56Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\r\n\r\nATX.jp\r\n\r\n### Stream URL (optional)\r\n\r\nhttp://194.233.72.249:8080/AT-X/index.m3u8\r\n\r\n### Notes (optional)\r\n\r\n![AT-X_20230705_202525 551](https://github.com/iptv-org/iptv/assets/21299971/794c1cd4-fbe4-4b35-8a16-45127953ff65)\r\nThis is test AT-X channel JP without subs\r\n720 Quality\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13751', - id: 1838199158, - node_id: 'I_kwDOCWUK8M5tkLF2', - number: 13751, - title: 'Add: Beano TV', - user: { - login: 'Ghani201', - id: 132144620, - node_id: 'U_kgDOB-Bd7A', - avatar_url: 'https://avatars.githubusercontent.com/u/132144620?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/Ghani201', - html_url: 'https://github.com/Ghani201', - followers_url: 'https://api.github.com/users/Ghani201/followers', - following_url: 'https://api.github.com/users/Ghani201/following{/other_user}', - gists_url: 'https://api.github.com/users/Ghani201/gists{/gist_id}', - starred_url: 'https://api.github.com/users/Ghani201/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/Ghani201/subscriptions', - organizations_url: 'https://api.github.com/users/Ghani201/orgs', - repos_url: 'https://api.github.com/users/Ghani201/repos', - events_url: 'https://api.github.com/users/Ghani201/events{/privacy}', - received_events_url: 'https://api.github.com/users/Ghani201/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1694116077, - node_id: 'MDU6TGFiZWwxNjk0MTE2MDc3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/UK', - name: 'UK', - color: '99e5e5', - default: false, - description: 'United Kingdom' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 2, - created_at: '2023-08-06T12:54:59Z', - updated_at: '2023-09-06T14:40:01Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\r\n\r\nBeanoTV.uk\r\n\r\n### Stream URL (optional)\r\n\r\nhttps://a5b4bacecd47433dad06d3189fc7422e.mediatailor.us-east-1.amazonaws.com/v1/manifest/04fd913bb278d8775298c26fdca9d9841f37601f/RakutenTV-eu_BeanoTV/b1f233d5-847c-437d-aa4f-f73e67a85323/2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\r\n\r\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\r\n\r\n### Notes (optional)\r\n\r\n_No response_\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/events', - html_url: 'https://github.com/iptv-org/iptv/issues/13715', - id: 1835942409, - node_id: 'I_kwDOCWUK8M5tbkIJ', - number: 13715, - title: 'Add: ATV+ HD (Perú) [Linear Version of ATV+]', - user: { - login: 'R4IN2007', - id: 83226646, - node_id: 'MDQ6VXNlcjgzMjI2NjQ2', - avatar_url: 'https://avatars.githubusercontent.com/u/83226646?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/R4IN2007', - html_url: 'https://github.com/R4IN2007', - followers_url: 'https://api.github.com/users/R4IN2007/followers', - following_url: 'https://api.github.com/users/R4IN2007/following{/other_user}', - gists_url: 'https://api.github.com/users/R4IN2007/gists{/gist_id}', - starred_url: 'https://api.github.com/users/R4IN2007/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/R4IN2007/subscriptions', - organizations_url: 'https://api.github.com/users/R4IN2007/orgs', - repos_url: 'https://api.github.com/users/R4IN2007/repos', - events_url: 'https://api.github.com/users/R4IN2007/events{/privacy}', - received_events_url: 'https://api.github.com/users/R4IN2007/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 3046075919, - node_id: 'MDU6TGFiZWwzMDQ2MDc1OTE5', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/PE', - name: 'PE', - color: 'E78203', - default: false, - description: 'Peru' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 2, - created_at: '2023-08-04T01:48:24Z', - updated_at: '2023-09-06T14:41:57Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream ID\n\nATVPlus.pe\n\n### Stream URL (optional)\n\nhttps://linear-258.frequency.stream/dist/vix/258/hls/master/playlist.m3u8\n\n### Notes (optional)\n\n(Linear Version & Streaming on VIX.com a spanish televisa-univision site) Might be geo-blocked or geo-locked because by removing /dist/vix/ the m3u8 link stops working #13703 \n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14120', - id: 1884922249, - node_id: 'I_kwDOCWUK8M5wWaGJ', - number: 14120, - title: 'Edit: Tele2000', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', - name: 'streams:edit', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-07T00:30:51Z', - updated_at: '2023-09-07T00:48:23Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Stream ID\n\nboo.us\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14110', - id: 1884922249, - node_id: 'I_kwDOCWUK8M5wWaGJ', - number: 14110, - title: 'Edit: Tele2000', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', - name: 'streams:edit', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-07T00:30:51Z', - updated_at: '2023-09-07T00:48:23Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream URL (required)\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### New Stream URL\n\nhttps://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\n\n### Stream ID\n\nBBCAmerica.us@East\n\n### Quality\n\n720p\n\n### Label\n\n~\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n~\n\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14120', - id: 1884922249, - node_id: 'I_kwDOCWUK8M5wWaGJ', - number: 14120, - title: 'Edit: Tele2000', - user: { - login: 'freearhey', - id: 7253922, - node_id: 'MDQ6VXNlcjcyNTM5MjI=', - avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/freearhey', - html_url: 'https://github.com/freearhey', - followers_url: 'https://api.github.com/users/freearhey/followers', - following_url: 'https://api.github.com/users/freearhey/following{/other_user}', - gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', - starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', - organizations_url: 'https://api.github.com/users/freearhey/orgs', - repos_url: 'https://api.github.com/users/freearhey/repos', - events_url: 'https://api.github.com/users/freearhey/events{/privacy}', - received_events_url: 'https://api.github.com/users/freearhey/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', - name: 'streams:edit', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 1, - created_at: '2023-09-07T00:30:51Z', - updated_at: '2023-09-07T00:48:23Z', - closed_at: null, - author_association: 'COLLABORATOR', - active_lock_reason: null, - body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### Stream ID\n\n_No response_\n\n### Quality\n\nNone\n\n### Label\n\nNone\n\n### HTTP User-Agent\n\n_No response_\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14151', - id: 1884653836, - node_id: 'I_kwDOCWUK8M5wVYkM', - number: 14151, - title: 'Remove: VTV', - user: { - login: 'kaikyoofers', - id: 67206080, - node_id: 'MDQ6VXNlcjY3MjA2MDgw', - avatar_url: 'https://avatars.githubusercontent.com/u/67206080?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/kaikyoofers', - html_url: 'https://github.com/kaikyoofers', - followers_url: 'https://api.github.com/users/kaikyoofers/followers', - following_url: 'https://api.github.com/users/kaikyoofers/following{/other_user}', - gists_url: 'https://api.github.com/users/kaikyoofers/gists{/gist_id}', - starred_url: 'https://api.github.com/users/kaikyoofers/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/kaikyoofers/subscriptions', - organizations_url: 'https://api.github.com/users/kaikyoofers/orgs', - repos_url: 'https://api.github.com/users/kaikyoofers/repos', - events_url: 'https://api.github.com/users/kaikyoofers/events{/privacy}', - received_events_url: 'https://api.github.com/users/kaikyoofers/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 2043160604, - node_id: 'MDU6TGFiZWwyMDQzMTYwNjA0', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/BR', - name: 'BR', - color: 'ccdcff', - default: false, - description: 'Brazil' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5932506810, - node_id: 'LA_kwDOCWUK8M8AAAABYZreug', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', - name: 'streams:remove', - color: '5373a2', - default: false, - description: '' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-06T19:51:43Z', - updated_at: '2023-09-07T00:48:57Z', - closed_at: null, - author_association: 'CONTRIBUTOR', - active_lock_reason: null, - body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Notes (optional)\n\nOne link (VTV.br) is misspelled.\n\n### Contributing Guide\n\n- [x] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/events', - html_url: 'https://github.com/iptv-org/iptv/issues/14140', - id: 1881649613, - node_id: 'I_kwDOCWUK8M5wJ7HC', - number: 14150, - title: 'Broken: Cyprus Channels', - user: { - login: 'ROBGagn', - id: 124619576, - node_id: 'U_kgDOB22LOA', - avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/ROBGagn', - html_url: 'https://github.com/ROBGagn', - followers_url: 'https://api.github.com/users/ROBGagn/followers', - following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', - gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', - starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', - organizations_url: 'https://api.github.com/users/ROBGagn/orgs', - repos_url: 'https://api.github.com/users/ROBGagn/repos', - events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', - received_events_url: 'https://api.github.com/users/ROBGagn/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1707513547, - node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', - name: 'broken stream', - color: 'FBCA04', - default: false, - description: 'Stream is not working properly' - }, - { - id: 3241837512, - node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', - name: 'CY', - color: '90FA7B', - default: false, - description: 'Cyprus' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5932506810, - node_id: 'LA_kwDOCWUK8M8AAAABYZreug', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', - name: 'streams:remove', - color: '5373a2', - default: false, - description: '' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-05T10:09:04Z', - updated_at: '2023-09-07T00:50:06Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream URL\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\r\n\r\nhttp://l6.cloudskep.com/rikcy/rik2/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/events', - html_url: 'https://github.com/iptv-org/iptv/issues/16120', - id: 1878180439, - node_id: 'I_kwDOCWUK8M5v8sJX', - number: 16120, - title: 'Broken: Canal 5 (MX)', - user: { - login: 'chris202020202020', - id: 141375812, - node_id: 'U_kgDOCG05RA', - avatar_url: 'https://avatars.githubusercontent.com/u/141375812?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/chris202020202020', - html_url: 'https://github.com/chris202020202020', - followers_url: 'https://api.github.com/users/chris202020202020/followers', - following_url: 'https://api.github.com/users/chris202020202020/following{/other_user}', - gists_url: 'https://api.github.com/users/chris202020202020/gists{/gist_id}', - starred_url: 'https://api.github.com/users/chris202020202020/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/chris202020202020/subscriptions', - organizations_url: 'https://api.github.com/users/chris202020202020/orgs', - repos_url: 'https://api.github.com/users/chris202020202020/repos', - events_url: 'https://api.github.com/users/chris202020202020/events{/privacy}', - received_events_url: 'https://api.github.com/users/chris202020202020/received_events', - type: 'User', - site_admin: false - }, - labels: [ - { - id: 1707513547, - node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', - name: 'broken stream', - color: 'FBCA04', - default: false, - description: 'Stream is not working properly' - }, - { - id: 2980444955, - node_id: 'MDU6TGFiZWwyOTgwNDQ0OTU1', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/MX', - name: 'MX', - color: '02A7D1', - default: false, - description: 'Mexico' - }, - { - id: 5923498886, - node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', - name: 'approved', - color: '85ddde', - default: false, - description: '' - }, - { - id: 5932506810, - node_id: 'LA_kwDOCWUK8M8AAAABYZreug', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', - name: 'streams:remove', - color: '5373a2', - default: false, - description: '' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2023-09-01T23:49:28Z', - updated_at: '2023-09-07T00:24:05Z', - closed_at: null, - author_association: 'NONE', - active_lock_reason: null, - body: '### Stream URL\n\nhttp://190.61.102.67:2000/play/a038/index.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\n_No response_\n\n### Notes (optional)\n\nReplacement For A Broken Stream To A New Stream For Canal 5 (MX) Please\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#report-a-broken-stream)', - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/events', - html_url: 'https://github.com/iptv-org/iptv/issues/19957', - id: 2880738344, - node_id: 'I_kwDOCWUK8M6rtJQo', - number: 19957, - title: 'Find: CNBCe.tr', - user: { - login: 'M3UDay', - id: 164743332, - node_id: 'U_kgDOCdHIpA', - avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/M3UDay', - html_url: 'https://github.com/M3UDay', - followers_url: 'https://api.github.com/users/M3UDay/followers', - following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', - gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', - starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', - organizations_url: 'https://api.github.com/users/M3UDay/orgs', - repos_url: 'https://api.github.com/users/M3UDay/repos', - events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', - received_events_url: 'https://api.github.com/users/M3UDay/received_events', - type: 'User', - user_view_type: 'public', - site_admin: false - }, - labels: [ - { - id: 8197871093, - node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', - name: 'channel search', - color: 'eaeaea', - default: false, - description: 'Request to find a link to a channel stream' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2025-02-26T08:43:49Z', - updated_at: '2025-02-26T08:43:49Z', - closed_at: null, - author_association: 'NONE', - sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, - active_lock_reason: null, - body: '### Stream ID (required)\n\n13thStreet.au\n\n### Notes\n\n_No response_', - closed_by: null, - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/events', - html_url: 'https://github.com/iptv-org/iptv/issues/20956', - id: 2880738444, - node_id: 'I_kwDOCWUK8M6rtJQo', - number: 20956, - title: 'Find: IONTV.us', - user: { - login: 'M3UDay', - id: 164743332, - node_id: 'U_kgDOCdHIpA', - avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/M3UDay', - html_url: 'https://github.com/M3UDay', - followers_url: 'https://api.github.com/users/M3UDay/followers', - following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', - gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', - starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', - organizations_url: 'https://api.github.com/users/M3UDay/orgs', - repos_url: 'https://api.github.com/users/M3UDay/repos', - events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', - received_events_url: 'https://api.github.com/users/M3UDay/received_events', - type: 'User', - user_view_type: 'public', - site_admin: false - }, - labels: [ - { - id: 8197871093, - node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', - name: 'channel search', - color: 'eaeaea', - default: false, - description: 'Request to find a link to a channel stream' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2025-02-26T08:43:49Z', - updated_at: '2025-02-26T08:43:49Z', - closed_at: null, - author_association: 'NONE', - sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, - active_lock_reason: null, - body: '### Stream ID (required)\n\nIONTV.us\n\n### Notes\n\n_No response_', - closed_by: null, - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/timeline', - performed_via_github_app: null, - state_reason: null - }, - { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157', - repository_url: 'https://api.github.com/repos/iptv-org/iptv', - labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/labels{/name}', - comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/comments', - events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/events', - html_url: 'https://github.com/iptv-org/iptv/issues/25157', - id: 3245640024, - node_id: 'I_kwDOCWUK8M7BdIlY', - number: 25157, - title: 'Add: OnTime Sports SD', - user: { - login: 'zezopm300', - id: 215159878, - node_id: 'U_kgDODNMURg', - avatar_url: 'https://avatars.githubusercontent.com/u/215159878?v=4', - gravatar_id: '', - url: 'https://api.github.com/users/zezopm300', - html_url: 'https://github.com/zezopm300', - followers_url: 'https://api.github.com/users/zezopm300/followers', - following_url: 'https://api.github.com/users/zezopm300/following{/other_user}', - gists_url: 'https://api.github.com/users/zezopm300/gists{/gist_id}', - starred_url: 'https://api.github.com/users/zezopm300/starred{/owner}{/repo}', - subscriptions_url: 'https://api.github.com/users/zezopm300/subscriptions', - organizations_url: 'https://api.github.com/users/zezopm300/orgs', - repos_url: 'https://api.github.com/users/zezopm300/repos', - events_url: 'https://api.github.com/users/zezopm300/events{/privacy}', - received_events_url: 'https://api.github.com/users/zezopm300/received_events', - type: 'User', - user_view_type: 'public', - site_admin: false - }, - labels: [ - { - id: 5923508587, - node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', - url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', - name: 'streams:add', - color: '017ff9', - default: false, - description: 'Request to add a new link to a playlist' - } - ], - state: 'open', - locked: false, - assignee: null, - assignees: [], - milestone: null, - comments: 0, - created_at: '2025-07-19T20:44:05Z', - updated_at: '2025-07-19T20:44:05Z', - closed_at: null, - author_association: 'NONE', - type: null, - active_lock_reason: null, - sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, - body: - '### Stream ID (required)\n' + - '\n' + - 'OnTimeSports.eg@SD\n' + - '\n' + - '### Stream URL (required)\n' + - '\n' + - ' OnTime Sports SD.mu38\n' + - '\n' + - '### Quality\n' + - '\n' + - 'None\n' + - '\n' + - '### Label\n' + - '\n' + - 'None\n' + - '\n' + - '### HTTP User Agent\n' + - '\n' + - '_No response_\n' + - '\n' + - '### HTTP Referrer\n' + - '\n' + - '_No response_\n' + - '\n' + - '### Directives\n' + - '\n' + - '_No response_\n' + - '\n' + - '### Notes\n' + - '\n' + - '_No response_\n' + - '\n' + - '### Contributing Guide\n' + - '\n' + - '- [x] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', - closed_by: null, - reactions: { - url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/reactions', - total_count: 0, - '+1': 0, - '-1': 0, - laugh: 0, - hooray: 0, - confused: 0, - heart: 0, - rocket: 0, - eyes: 0 - }, - timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/timeline', - performed_via_github_app: null, - state_reason: null - } -] +module.exports = [ + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14140', + id: 1881649602, + node_id: 'I_kwDOCWUK8M5wJ7HC', + number: 14140, + title: 'Broken: RIK HD Cyprus', + user: { + login: 'ROBGagn', + id: 124619576, + node_id: 'U_kgDOB22LOA', + avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/ROBGagn', + html_url: 'https://github.com/ROBGagn', + followers_url: 'https://api.github.com/users/ROBGagn/followers', + following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', + gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', + starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', + organizations_url: 'https://api.github.com/users/ROBGagn/orgs', + repos_url: 'https://api.github.com/users/ROBGagn/repos', + events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', + received_events_url: 'https://api.github.com/users/ROBGagn/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1707513547, + node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', + name: 'broken stream', + color: 'FBCA04', + default: false, + description: 'Stream is not working properly' + }, + { + id: 3241837512, + node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', + name: 'CY', + color: '90FA7B', + default: false, + description: 'Cyprus' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-05T10:09:04Z', + updated_at: '2023-09-07T00:50:06Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Broken Links\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\r\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14159', + id: 1881649602, + node_id: 'I_kwDOCWUK8M5wJ7HC', + number: 14159, + title: 'Broken: RIK HD Cyprus', + user: { + login: 'ROBGagn', + id: 124619576, + node_id: 'U_kgDOB22LOA', + avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/ROBGagn', + html_url: 'https://github.com/ROBGagn', + followers_url: 'https://api.github.com/users/ROBGagn/followers', + following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', + gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', + starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', + organizations_url: 'https://api.github.com/users/ROBGagn/orgs', + repos_url: 'https://api.github.com/users/ROBGagn/repos', + events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', + received_events_url: 'https://api.github.com/users/ROBGagn/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1707513547, + node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', + name: 'broken stream', + color: 'FBCA04', + default: false, + description: 'Stream is not working properly' + }, + { + id: 3241837512, + node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', + name: 'CY', + color: '90FA7B', + default: false, + description: 'Cyprus' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-05T10:09:04Z', + updated_at: '2023-09-07T00:50:06Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Broken Links\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\r\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14159/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/events', + html_url: 'https://github.com/iptv-org/iptv/issues/19956', + id: 2880738344, + node_id: 'I_kwDOCWUK8M6rtJQo', + number: 19956, + title: 'Find: CNBCe.tr', + user: { + login: 'M3UDay', + id: 164743332, + node_id: 'U_kgDOCdHIpA', + avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/M3UDay', + html_url: 'https://github.com/M3UDay', + followers_url: 'https://api.github.com/users/M3UDay/followers', + following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', + gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', + starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', + organizations_url: 'https://api.github.com/users/M3UDay/orgs', + repos_url: 'https://api.github.com/users/M3UDay/repos', + events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', + received_events_url: 'https://api.github.com/users/M3UDay/received_events', + type: 'User', + user_view_type: 'public', + site_admin: false + }, + labels: [ + { + id: 8197871093, + node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', + name: 'channel search', + color: 'eaeaea', + default: false, + description: 'Request to find a link to a channel stream' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2025-02-26T08:43:49Z', + updated_at: '2025-02-26T08:43:49Z', + closed_at: null, + author_association: 'NONE', + sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, + active_lock_reason: null, + body: '### Channel ID (required)\n\nCNBCe.tr\n\n### Notes\n\n_No response_', + closed_by: null, + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19956/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14179', + id: 1884926953, + node_id: 'I_kwDOCWUK8M5wWbPp', + number: 14179, + title: 'Add: Manorama News', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694119113, + node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', + name: 'IN', + color: 'd8139a', + default: false, + description: 'India' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-07T00:38:55Z', + updated_at: '2023-09-07T00:48:32Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nManoramaNews.in\n\n### Stream URL\n\nhttps://ythls.onrender.com/channel/UCP0uG-mcMImgKnJz-VjJZmQ.m3u8\n\n### Label\n\nNot 24/7\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14007#issuecomment-1686942043\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14178', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14178, + title: 'Add: TV3', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1912922147, + node_id: 'MDU6TGFiZWwxOTEyOTIyMTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/MY', + name: 'MY', + color: 'ea59cf', + default: false, + description: 'Malaysia' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nTV3.my\n\n### Stream URL\n\nhttps://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m3u8\n\n### Label\n\nNone\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14063#issuecomment-1695783106\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14178/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14177', + id: 1884920274, + node_id: 'I_kwDOCWUK8M5wWZnS', + number: 14177, + title: 'Add: Temple University TV', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694118251, + node_id: 'MDU6TGFiZWwxNjk0MTE4MjUx', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/US', + name: 'US', + color: '463faa', + default: false, + description: 'United States' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:27:51Z', + updated_at: '2023-09-07T00:47:15Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nTUTV.us\n\n### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Label\n\nNone\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14096#issue-1874505679\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14177/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14175', + id: 1884859778, + node_id: 'I_kwDOCWUK8M5wWK2C', + number: 14175, + title: 'Add: TFX', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694117286, + node_id: 'MDU6TGFiZWwxNjk0MTE3Mjg2', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/FR', + name: 'FR', + color: 'f7ec1b', + default: false, + description: 'France' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-06T22:54:25Z', + updated_at: '2023-09-07T00:57:11Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nTFX.fr\n\n### Stream URL\n\nhttps://stitcher-ipv4.pluto.tv/v1/stitch/embed/hls/channel/64c109a4798def0008a6e03e/master.m3u8?advertisingId={PSID}&appVersion=unknown&deviceDNT={TARGETOPT}&deviceId={PSID}&deviceLat=0&deviceLon=0&deviceMake=samsung&deviceModel=samsung&deviceType=samsung-tvplus&deviceVersion=unknown&embedPartner=samsung-tvplus&profileFloor=&profileLimit=&samsung_app_domain={APP_DOMAIN}&samsung_app_name={APP_NAME}&us_privacy=1YNY\n\n### Label\n\nNone\n\n### HTTP User Agent\n\nMozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1\n\n### HTTP Referrer\n\nhttps://pkpakiplay.xyz/\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv-org.github.io/issues/1381\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14175/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14179', + id: 1884926953, + node_id: 'I_kwDOCWUK8M5wWbPp', + number: 14179, + title: 'Add: Manorama News', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694119113, + node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', + name: 'IN', + color: 'd8139a', + default: false, + description: 'India' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-07T00:38:55Z', + updated_at: '2023-09-07T00:48:32Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nManoramaNews.in\n\n### Stream URL\n\n(https://mitelefe.com/Api/Videos/GetSourceUrl/694564/0/HLS / https://ssl.cloud.telefe.com/Api/Videos/GetSourceUrl/694564/0/HLS)\n\n### Label\n\nNot 24/7\n\n### Notes (optional)\n\nSource: https://github.com/iptv-org/iptv/issues/14007#issuecomment-1686942043\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14135', + id: 1880165524, + node_id: 'I_kwDOCWUK8M5wEQyU', + number: 14135, + title: 'Add: BBC World News South Asia ', + user: { + login: 'kheohoanganh', + id: 128283995, + node_id: 'U_kgDOB6V1Ww', + avatar_url: 'https://avatars.githubusercontent.com/u/128283995?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/kheohoanganh', + html_url: 'https://github.com/kheohoanganh', + followers_url: 'https://api.github.com/users/kheohoanganh/followers', + following_url: 'https://api.github.com/users/kheohoanganh/following{/other_user}', + gists_url: 'https://api.github.com/users/kheohoanganh/gists{/gist_id}', + starred_url: 'https://api.github.com/users/kheohoanganh/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/kheohoanganh/subscriptions', + organizations_url: 'https://api.github.com/users/kheohoanganh/orgs', + repos_url: 'https://api.github.com/users/kheohoanganh/repos', + events_url: 'https://api.github.com/users/kheohoanganh/events{/privacy}', + received_events_url: 'https://api.github.com/users/kheohoanganh/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694116077, + node_id: 'MDU6TGFiZWwxNjk0MTE2MDc3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/UK', + name: 'UK', + color: '99e5e5', + default: false, + description: 'United Kingdom' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-04T12:22:50Z', + updated_at: '2023-09-07T00:50:28Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\n\nBBCWorldNews.uk@SouthAsia\n\n### Stream URL (optional)\n\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8\n\n### Notes (optional)\n\n2 links for BBCWorldNewsSouthAsia.uk\r\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2801%29/index.m3u8\r\nhttp://103.199.161.254/Content/bbcworld/Live/Channel%28BBCworld%29/Stream%2802%29/index.m3u8\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14135/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14105', + id: 1876637538, + node_id: 'I_kwDOCWUK8M5v2zdi', + number: 14105, + title: 'Add: Amarin TV (720p)', + user: { + login: 'Soponwit19997', + id: 142583084, + node_id: 'U_kgDOCH-lLA', + avatar_url: 'https://avatars.githubusercontent.com/u/142583084?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/Soponwit19997', + html_url: 'https://github.com/Soponwit19997', + followers_url: 'https://api.github.com/users/Soponwit19997/followers', + following_url: 'https://api.github.com/users/Soponwit19997/following{/other_user}', + gists_url: 'https://api.github.com/users/Soponwit19997/gists{/gist_id}', + starred_url: 'https://api.github.com/users/Soponwit19997/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/Soponwit19997/subscriptions', + organizations_url: 'https://api.github.com/users/Soponwit19997/orgs', + repos_url: 'https://api.github.com/users/Soponwit19997/repos', + events_url: 'https://api.github.com/users/Soponwit19997/events{/privacy}', + received_events_url: 'https://api.github.com/users/Soponwit19997/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 2990740232, + node_id: 'MDU6TGFiZWwyOTkwNzQwMjMy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/TH', + name: 'TH', + color: 'B798EA', + default: false, + description: 'Thailand' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-01T03:08:05Z', + updated_at: '2023-09-06T14:19:50Z', + closed_at: null, + author_association: 'CONTRIBUTOR', + active_lock_reason: null, + body: '### Stream ID\n\nAmarinTV.th\n\n### Stream URL (optional)\n\nhttps://cdn6.goprimetime.info/feed/202306140918/chamarin/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14105/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14104', + id: 1876636019, + node_id: 'I_kwDOCWUK8M5v2zFz', + number: 14104, + title: 'Add: MCOT HD (720p)', + user: { + login: 'Soponwit19997', + id: 142583084, + node_id: 'U_kgDOCH-lLA', + avatar_url: 'https://avatars.githubusercontent.com/u/142583084?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/Soponwit19997', + html_url: 'https://github.com/Soponwit19997', + followers_url: 'https://api.github.com/users/Soponwit19997/followers', + following_url: 'https://api.github.com/users/Soponwit19997/following{/other_user}', + gists_url: 'https://api.github.com/users/Soponwit19997/gists{/gist_id}', + starred_url: 'https://api.github.com/users/Soponwit19997/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/Soponwit19997/subscriptions', + organizations_url: 'https://api.github.com/users/Soponwit19997/orgs', + repos_url: 'https://api.github.com/users/Soponwit19997/repos', + events_url: 'https://api.github.com/users/Soponwit19997/events{/privacy}', + received_events_url: 'https://api.github.com/users/Soponwit19997/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 2990740232, + node_id: 'MDU6TGFiZWwyOTkwNzQwMjMy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/TH', + name: 'TH', + color: 'B798EA', + default: false, + description: 'Thailand' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-01T03:05:56Z', + updated_at: '2023-09-06T14:21:02Z', + closed_at: null, + author_association: 'CONTRIBUTOR', + active_lock_reason: null, + body: '### Stream ID\n\nMCOTHD.th\n\n### Stream URL (optional)\n\nhttps://cdn6.goprimetime.info/feed/202306140918/chmcothd/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14104/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14057', + id: 1868766252, + node_id: 'I_kwDOCWUK8M5vYxws', + number: 14057, + title: 'Add: MotorTrend Fast TV', + user: { + login: 'AudioNutz', + id: 28129911, + node_id: 'MDQ6VXNlcjI4MTI5OTEx', + avatar_url: 'https://avatars.githubusercontent.com/u/28129911?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/AudioNutz', + html_url: 'https://github.com/AudioNutz', + followers_url: 'https://api.github.com/users/AudioNutz/followers', + following_url: 'https://api.github.com/users/AudioNutz/following{/other_user}', + gists_url: 'https://api.github.com/users/AudioNutz/gists{/gist_id}', + starred_url: 'https://api.github.com/users/AudioNutz/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/AudioNutz/subscriptions', + organizations_url: 'https://api.github.com/users/AudioNutz/orgs', + repos_url: 'https://api.github.com/users/AudioNutz/repos', + events_url: 'https://api.github.com/users/AudioNutz/events{/privacy}', + received_events_url: 'https://api.github.com/users/AudioNutz/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694118251, + node_id: 'MDU6TGFiZWwxNjk0MTE4MjUx', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/US', + name: 'US', + color: '463faa', + default: false, + description: 'United States' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-08-28T01:23:43Z', + updated_at: '2023-09-06T13:44:17Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\r\n\r\nFastTV.us\r\n\r\n### Stream URL (optional)\r\n\r\nhttps://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8\r\n\r\n### Notes (optional)\r\n\r\nA free stream from MotorTrend TV\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14057/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14034', + id: 1863678726, + node_id: 'I_kwDOCWUK8M5vFXsG', + number: 14034, + title: 'Add: match 4(hu)', + user: { + login: 'erich1997', + id: 85035390, + node_id: 'MDQ6VXNlcjg1MDM1Mzkw', + avatar_url: 'https://avatars.githubusercontent.com/u/85035390?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/erich1997', + html_url: 'https://github.com/erich1997', + followers_url: 'https://api.github.com/users/erich1997/followers', + following_url: 'https://api.github.com/users/erich1997/following{/other_user}', + gists_url: 'https://api.github.com/users/erich1997/gists{/gist_id}', + starred_url: 'https://api.github.com/users/erich1997/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/erich1997/subscriptions', + organizations_url: 'https://api.github.com/users/erich1997/orgs', + repos_url: 'https://api.github.com/users/erich1997/repos', + events_url: 'https://api.github.com/users/erich1997/events{/privacy}', + received_events_url: 'https://api.github.com/users/erich1997/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1696015170, + node_id: 'MDU6TGFiZWwxNjk2MDE1MTcw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/HU', + name: 'HU', + color: 'e89bbf', + default: false, + description: 'Hungary' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-08-23T16:42:47Z', + updated_at: '2023-09-06T13:07:20Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\n\nMatch4.hu\n\n### Stream URL (optional)\n\nhttp://194.76.186.33:8000/play/a04d/index.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14034/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13964', + id: 1857666538, + node_id: 'I_kwDOCWUK8M5uub3q', + number: 13964, + title: 'Add: Meth TV [LK] ', + user: { + login: 'Carlinhos027', + id: 111005658, + node_id: 'U_kgDOBp3P2g', + avatar_url: 'https://avatars.githubusercontent.com/u/111005658?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/Carlinhos027', + html_url: 'https://github.com/Carlinhos027', + followers_url: 'https://api.github.com/users/Carlinhos027/followers', + following_url: 'https://api.github.com/users/Carlinhos027/following{/other_user}', + gists_url: 'https://api.github.com/users/Carlinhos027/gists{/gist_id}', + starred_url: 'https://api.github.com/users/Carlinhos027/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/Carlinhos027/subscriptions', + organizations_url: 'https://api.github.com/users/Carlinhos027/orgs', + repos_url: 'https://api.github.com/users/Carlinhos027/repos', + events_url: 'https://api.github.com/users/Carlinhos027/events{/privacy}', + received_events_url: 'https://api.github.com/users/Carlinhos027/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5432228583, + node_id: 'LA_kwDOCWUK8M8AAAABQ8k65w', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/not%2024/7', + name: 'not 24/7', + color: '40715B', + default: false, + description: '' + }, + { + id: 5641193949, + node_id: 'LA_kwDOCWUK8M8AAAABUD3J3Q', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/LK', + name: 'LK', + color: '0A59ED', + default: false, + description: 'Sri Lanka' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-08-19T10:31:37Z', + updated_at: '2023-09-07T11:25:16Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream ID\n\nMethTV.lk\n\n### Stream URL (optional)\n\nhttps://ythls.onrender.com/channel/UC7kBHRaynsJMB6JcooGLTmA.m3u8\n\n### Notes (optional)\n\n720p / Not 24/7\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13964/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13893', + id: 1850537350, + node_id: 'I_kwDOCWUK8M5uTPWG', + number: 13893, + title: 'Add: Weathernews (JPN) via YouTube', + user: { + login: 'arecki2', + id: 18574440, + node_id: 'MDQ6VXNlcjE4NTc0NDQw', + avatar_url: 'https://avatars.githubusercontent.com/u/18574440?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/arecki2', + html_url: 'https://github.com/arecki2', + followers_url: 'https://api.github.com/users/arecki2/followers', + following_url: 'https://api.github.com/users/arecki2/following{/other_user}', + gists_url: 'https://api.github.com/users/arecki2/gists{/gist_id}', + starred_url: 'https://api.github.com/users/arecki2/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/arecki2/subscriptions', + organizations_url: 'https://api.github.com/users/arecki2/orgs', + repos_url: 'https://api.github.com/users/arecki2/repos', + events_url: 'https://api.github.com/users/arecki2/events{/privacy}', + received_events_url: 'https://api.github.com/users/arecki2/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694117140, + node_id: 'MDU6TGFiZWwxNjk0MTE3MTQw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/JP', + name: 'JP', + color: '350bdd', + default: false, + description: 'Japan' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 2, + created_at: '2023-08-14T21:04:00Z', + updated_at: '2023-09-06T14:30:57Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: "### Stream ID\n\nWeathernews.jp\n\n### Stream URL (optional)\n\nhttps://ythls.onrender.com/channel/UCNsidkYpIAQ4QaufptQBPHQ.m3u8\n\n### Notes (optional)\n\nLet's try them 😼\r\n\r\nI've just learned that they change streams for their TV broadcasts on YouTube every 3 hours, so even with additional streams they occasionally activate (such as now during Typhoon Lan), the YT API should manage to pick the correct feed in most cases 😜\r\n\r\nOtherwise, an advantage over the two streams that already are in the database is that the YT broadcasts are in 1080p (vs 720p).\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)", + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13893/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13881', + id: 1848780631, + node_id: 'I_kwDOCWUK8M5uMidX', + number: 13881, + title: 'Add: Aaj Tak', + user: { + login: 'R4IN2007', + id: 83226646, + node_id: 'MDQ6VXNlcjgzMjI2NjQ2', + avatar_url: 'https://avatars.githubusercontent.com/u/83226646?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/R4IN2007', + html_url: 'https://github.com/R4IN2007', + followers_url: 'https://api.github.com/users/R4IN2007/followers', + following_url: 'https://api.github.com/users/R4IN2007/following{/other_user}', + gists_url: 'https://api.github.com/users/R4IN2007/gists{/gist_id}', + starred_url: 'https://api.github.com/users/R4IN2007/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/R4IN2007/subscriptions', + organizations_url: 'https://api.github.com/users/R4IN2007/orgs', + repos_url: 'https://api.github.com/users/R4IN2007/repos', + events_url: 'https://api.github.com/users/R4IN2007/events{/privacy}', + received_events_url: 'https://api.github.com/users/R4IN2007/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694119113, + node_id: 'MDU6TGFiZWwxNjk0MTE5MTEz', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/IN', + name: 'IN', + color: 'd8139a', + default: false, + description: 'India' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-08-13T23:23:28Z', + updated_at: '2023-09-06T14:32:15Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\n\nAajTak.in\n\n### Stream URL (optional)\n\nhttps://feeds.intoday.in/aajtak/api/aajtakhd/master.m3u8\n\n### Notes (optional)\n\n_No response_\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13881/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13793', + id: 1846716551, + node_id: 'I_kwDOCWUK8M5uEqiH', + number: 13793, + title: 'Add: AT-X (JPN)', + user: { + login: 'ZXArkin', + id: 21299971, + node_id: 'MDQ6VXNlcjIxMjk5OTcx', + avatar_url: 'https://avatars.githubusercontent.com/u/21299971?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/ZXArkin', + html_url: 'https://github.com/ZXArkin', + followers_url: 'https://api.github.com/users/ZXArkin/followers', + following_url: 'https://api.github.com/users/ZXArkin/following{/other_user}', + gists_url: 'https://api.github.com/users/ZXArkin/gists{/gist_id}', + starred_url: 'https://api.github.com/users/ZXArkin/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/ZXArkin/subscriptions', + organizations_url: 'https://api.github.com/users/ZXArkin/orgs', + repos_url: 'https://api.github.com/users/ZXArkin/repos', + events_url: 'https://api.github.com/users/ZXArkin/events{/privacy}', + received_events_url: 'https://api.github.com/users/ZXArkin/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694117140, + node_id: 'MDU6TGFiZWwxNjk0MTE3MTQw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/JP', + name: 'JP', + color: '350bdd', + default: false, + description: 'Japan' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 4, + created_at: '2023-08-11T12:11:28Z', + updated_at: '2023-09-06T14:17:56Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\r\n\r\nATX.jp\r\n\r\n### Stream URL (optional)\r\n\r\nhttp://194.233.72.249:8080/AT-X/index.m3u8\r\n\r\n### Notes (optional)\r\n\r\n![AT-X_20230705_202525 551](https://github.com/iptv-org/iptv/assets/21299971/794c1cd4-fbe4-4b35-8a16-45127953ff65)\r\nThis is test AT-X channel JP without subs\r\n720 Quality\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13793/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13751', + id: 1838199158, + node_id: 'I_kwDOCWUK8M5tkLF2', + number: 13751, + title: 'Add: Beano TV', + user: { + login: 'Ghani201', + id: 132144620, + node_id: 'U_kgDOB-Bd7A', + avatar_url: 'https://avatars.githubusercontent.com/u/132144620?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/Ghani201', + html_url: 'https://github.com/Ghani201', + followers_url: 'https://api.github.com/users/Ghani201/followers', + following_url: 'https://api.github.com/users/Ghani201/following{/other_user}', + gists_url: 'https://api.github.com/users/Ghani201/gists{/gist_id}', + starred_url: 'https://api.github.com/users/Ghani201/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/Ghani201/subscriptions', + organizations_url: 'https://api.github.com/users/Ghani201/orgs', + repos_url: 'https://api.github.com/users/Ghani201/repos', + events_url: 'https://api.github.com/users/Ghani201/events{/privacy}', + received_events_url: 'https://api.github.com/users/Ghani201/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1694116077, + node_id: 'MDU6TGFiZWwxNjk0MTE2MDc3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/UK', + name: 'UK', + color: '99e5e5', + default: false, + description: 'United Kingdom' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 2, + created_at: '2023-08-06T12:54:59Z', + updated_at: '2023-09-06T14:40:01Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\r\n\r\nBeanoTV.uk\r\n\r\n### Stream URL (optional)\r\n\r\nhttps://a5b4bacecd47433dad06d3189fc7422e.mediatailor.us-east-1.amazonaws.com/v1/manifest/04fd913bb278d8775298c26fdca9d9841f37601f/RakutenTV-eu_BeanoTV/b1f233d5-847c-437d-aa4f-f73e67a85323/2.m3u8|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\r\n\r\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\r\n\r\n### Notes (optional)\r\n\r\n_No response_\r\n\r\n### Please confirm the following\r\n\r\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13751/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/events', + html_url: 'https://github.com/iptv-org/iptv/issues/13715', + id: 1835942409, + node_id: 'I_kwDOCWUK8M5tbkIJ', + number: 13715, + title: 'Add: ATV+ HD (Perú) [Linear Version of ATV+]', + user: { + login: 'R4IN2007', + id: 83226646, + node_id: 'MDQ6VXNlcjgzMjI2NjQ2', + avatar_url: 'https://avatars.githubusercontent.com/u/83226646?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/R4IN2007', + html_url: 'https://github.com/R4IN2007', + followers_url: 'https://api.github.com/users/R4IN2007/followers', + following_url: 'https://api.github.com/users/R4IN2007/following{/other_user}', + gists_url: 'https://api.github.com/users/R4IN2007/gists{/gist_id}', + starred_url: 'https://api.github.com/users/R4IN2007/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/R4IN2007/subscriptions', + organizations_url: 'https://api.github.com/users/R4IN2007/orgs', + repos_url: 'https://api.github.com/users/R4IN2007/repos', + events_url: 'https://api.github.com/users/R4IN2007/events{/privacy}', + received_events_url: 'https://api.github.com/users/R4IN2007/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 3046075919, + node_id: 'MDU6TGFiZWwzMDQ2MDc1OTE5', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/PE', + name: 'PE', + color: 'E78203', + default: false, + description: 'Peru' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 2, + created_at: '2023-08-04T01:48:24Z', + updated_at: '2023-09-06T14:41:57Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream ID\n\nATVPlus.pe\n\n### Stream URL (optional)\n\nhttps://linear-258.frequency.stream/dist/vix/258/hls/master/playlist.m3u8\n\n### Notes (optional)\n\n(Linear Version & Streaming on VIX.com a spanish televisa-univision site) Might be geo-blocked or geo-locked because by removing /dist/vix/ the m3u8 link stops working #13703 \n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#request-a-channel)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/13715/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14120', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14120, + title: 'Edit: Tele2000', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', + name: 'streams:edit', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Stream ID\n\nboo.us\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14110', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14110, + title: 'Edit: Tele2000', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', + name: 'streams:edit', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream URL (required)\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### New Stream URL\n\nhttps://xui-backend.energeek.cl/live/9/playlist.m3u8?username=ZZDemoIPTVGH&password=mdo96EuqMkTR|Referer="https://referer.xyz/"|User-Agent="Mozilla/5.0 (iPhone; CPU iPhone OS 17_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"|Origin="https://origin.xyz"\n\n### Stream ID\n\nBBCAmerica.us@East\n\n### Quality\n\n720p\n\n### Label\n\n~\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n~\n\n### Directives (optional)\r\n\r\n#EXTVLCOPT:http-referrer=http://imn.iq\r\n\r\n#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\r\n\r\n#KODIPROP:inputstream=inputstream.adaptive\r\n\r\n#KODIPROP:inputstream.adaptive.manifest_type=mpd\r\n\r\n#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha\r\n\r\n#KODIPROP:inputstream.adaptive.license_key=https://drm.ors.at/acquire-license/widevine?BrandGuid=13f2e056-53fe-4469-ba6d-999970dbe549&userToken=v9ZVSksv4S7rT55o10dmYNRa4asye3z05eWCFxD%2FFYIlTJEpuf6tF8asPcyQOFq0h5opS%2B6WoMxnshWkihpHq5qrdrBEZ69piE94J9Feh385snGOqK3PYO7tLLjxmsCAe%2B9%2BNnurSSO5RCAIRsL125nSj1eOR%2F1GSKOgGH80HK2FDLiePxPkeaAxuWzacNBB%2FqnIGGxfe3GlmN65cU9F8WEpKFDlaxW%2Fv3ZSLAp3%2BZEq1aZXJ6Oz%2Fi0diD0EybH7|Content-Type=application/octet-stream|R{SSM}|\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14120', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14120, + title: 'Edit: Tele2000', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:edit', + name: 'streams:edit', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### Stream ID\n\n_No response_\n\n### Quality\n\nNone\n\n### Label\n\nNone\n\n### HTTP User-Agent\n\n_No response_\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14151', + id: 1884653836, + node_id: 'I_kwDOCWUK8M5wVYkM', + number: 14151, + title: 'Remove: VTV', + user: { + login: 'kaikyoofers', + id: 67206080, + node_id: 'MDQ6VXNlcjY3MjA2MDgw', + avatar_url: 'https://avatars.githubusercontent.com/u/67206080?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/kaikyoofers', + html_url: 'https://github.com/kaikyoofers', + followers_url: 'https://api.github.com/users/kaikyoofers/followers', + following_url: 'https://api.github.com/users/kaikyoofers/following{/other_user}', + gists_url: 'https://api.github.com/users/kaikyoofers/gists{/gist_id}', + starred_url: 'https://api.github.com/users/kaikyoofers/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/kaikyoofers/subscriptions', + organizations_url: 'https://api.github.com/users/kaikyoofers/orgs', + repos_url: 'https://api.github.com/users/kaikyoofers/repos', + events_url: 'https://api.github.com/users/kaikyoofers/events{/privacy}', + received_events_url: 'https://api.github.com/users/kaikyoofers/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 2043160604, + node_id: 'MDU6TGFiZWwyMDQzMTYwNjA0', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/BR', + name: 'BR', + color: 'ccdcff', + default: false, + description: 'Brazil' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5932506810, + node_id: 'LA_kwDOCWUK8M8AAAABYZreug', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', + name: 'streams:remove', + color: '5373a2', + default: false, + description: '' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-06T19:51:43Z', + updated_at: '2023-09-07T00:48:57Z', + closed_at: null, + author_association: 'CONTRIBUTOR', + active_lock_reason: null, + body: '### Stream URL\n\nhttps://ythls.onrender.com/channel/UC40TUSUx490U5uR1lZt3Ajg.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Notes (optional)\n\nOne link (VTV.br) is misspelled.\n\n### Contributing Guide\n\n- [x] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14140', + id: 1881649613, + node_id: 'I_kwDOCWUK8M5wJ7HC', + number: 14150, + title: 'Broken: Cyprus Channels', + user: { + login: 'ROBGagn', + id: 124619576, + node_id: 'U_kgDOB22LOA', + avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/ROBGagn', + html_url: 'https://github.com/ROBGagn', + followers_url: 'https://api.github.com/users/ROBGagn/followers', + following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', + gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', + starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', + organizations_url: 'https://api.github.com/users/ROBGagn/orgs', + repos_url: 'https://api.github.com/users/ROBGagn/repos', + events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', + received_events_url: 'https://api.github.com/users/ROBGagn/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1707513547, + node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', + name: 'broken stream', + color: 'FBCA04', + default: false, + description: 'Stream is not working properly' + }, + { + id: 3241837512, + node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', + name: 'CY', + color: '90FA7B', + default: false, + description: 'Cyprus' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5932506810, + node_id: 'LA_kwDOCWUK8M8AAAABYZreug', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', + name: 'streams:remove', + color: '5373a2', + default: false, + description: '' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-05T10:09:04Z', + updated_at: '2023-09-07T00:50:06Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream URL\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\r\n\r\nhttp://l6.cloudskep.com/rikcy/rik2/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14150/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/events', + html_url: 'https://github.com/iptv-org/iptv/issues/16120', + id: 1878180439, + node_id: 'I_kwDOCWUK8M5v8sJX', + number: 16120, + title: 'Broken: Canal 5 (MX)', + user: { + login: 'chris202020202020', + id: 141375812, + node_id: 'U_kgDOCG05RA', + avatar_url: 'https://avatars.githubusercontent.com/u/141375812?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/chris202020202020', + html_url: 'https://github.com/chris202020202020', + followers_url: 'https://api.github.com/users/chris202020202020/followers', + following_url: 'https://api.github.com/users/chris202020202020/following{/other_user}', + gists_url: 'https://api.github.com/users/chris202020202020/gists{/gist_id}', + starred_url: 'https://api.github.com/users/chris202020202020/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/chris202020202020/subscriptions', + organizations_url: 'https://api.github.com/users/chris202020202020/orgs', + repos_url: 'https://api.github.com/users/chris202020202020/repos', + events_url: 'https://api.github.com/users/chris202020202020/events{/privacy}', + received_events_url: 'https://api.github.com/users/chris202020202020/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1707513547, + node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', + name: 'broken stream', + color: 'FBCA04', + default: false, + description: 'Stream is not working properly' + }, + { + id: 2980444955, + node_id: 'MDU6TGFiZWwyOTgwNDQ0OTU1', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/MX', + name: 'MX', + color: '02A7D1', + default: false, + description: 'Mexico' + }, + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5932506810, + node_id: 'LA_kwDOCWUK8M8AAAABYZreug', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:remove', + name: 'streams:remove', + color: '5373a2', + default: false, + description: '' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-01T23:49:28Z', + updated_at: '2023-09-07T00:24:05Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Stream URL\n\nhttp://190.61.102.67:2000/play/a038/index.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\n_No response_\n\n### Notes (optional)\n\nReplacement For A Broken Stream To A New Stream For Canal 5 (MX) Please\n\n### Please confirm the following\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md#report-a-broken-stream)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/16120/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/events', + html_url: 'https://github.com/iptv-org/iptv/issues/19957', + id: 2880738344, + node_id: 'I_kwDOCWUK8M6rtJQo', + number: 19957, + title: 'Find: CNBCe.tr', + user: { + login: 'M3UDay', + id: 164743332, + node_id: 'U_kgDOCdHIpA', + avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/M3UDay', + html_url: 'https://github.com/M3UDay', + followers_url: 'https://api.github.com/users/M3UDay/followers', + following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', + gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', + starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', + organizations_url: 'https://api.github.com/users/M3UDay/orgs', + repos_url: 'https://api.github.com/users/M3UDay/repos', + events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', + received_events_url: 'https://api.github.com/users/M3UDay/received_events', + type: 'User', + user_view_type: 'public', + site_admin: false + }, + labels: [ + { + id: 8197871093, + node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', + name: 'channel search', + color: 'eaeaea', + default: false, + description: 'Request to find a link to a channel stream' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2025-02-26T08:43:49Z', + updated_at: '2025-02-26T08:43:49Z', + closed_at: null, + author_association: 'NONE', + sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, + active_lock_reason: null, + body: '### Stream ID (required)\n\n13thStreet.au\n\n### Notes\n\n_No response_', + closed_by: null, + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/19957/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/events', + html_url: 'https://github.com/iptv-org/iptv/issues/20956', + id: 2880738444, + node_id: 'I_kwDOCWUK8M6rtJQo', + number: 20956, + title: 'Find: IONTV.us', + user: { + login: 'M3UDay', + id: 164743332, + node_id: 'U_kgDOCdHIpA', + avatar_url: 'https://avatars.githubusercontent.com/u/164743332?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/M3UDay', + html_url: 'https://github.com/M3UDay', + followers_url: 'https://api.github.com/users/M3UDay/followers', + following_url: 'https://api.github.com/users/M3UDay/following{/other_user}', + gists_url: 'https://api.github.com/users/M3UDay/gists{/gist_id}', + starred_url: 'https://api.github.com/users/M3UDay/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/M3UDay/subscriptions', + organizations_url: 'https://api.github.com/users/M3UDay/orgs', + repos_url: 'https://api.github.com/users/M3UDay/repos', + events_url: 'https://api.github.com/users/M3UDay/events{/privacy}', + received_events_url: 'https://api.github.com/users/M3UDay/received_events', + type: 'User', + user_view_type: 'public', + site_admin: false + }, + labels: [ + { + id: 8197871093, + node_id: 'LA_kwDOCWUK8M8AAAAB6KGV9Q', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/channel%20search', + name: 'channel search', + color: 'eaeaea', + default: false, + description: 'Request to find a link to a channel stream' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2025-02-26T08:43:49Z', + updated_at: '2025-02-26T08:43:49Z', + closed_at: null, + author_association: 'NONE', + sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, + active_lock_reason: null, + body: '### Stream ID (required)\n\nIONTV.us\n\n### Notes\n\n_No response_', + closed_by: null, + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/20956/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/events', + html_url: 'https://github.com/iptv-org/iptv/issues/25157', + id: 3245640024, + node_id: 'I_kwDOCWUK8M7BdIlY', + number: 25157, + title: 'Add: OnTime Sports SD', + user: { + login: 'zezopm300', + id: 215159878, + node_id: 'U_kgDODNMURg', + avatar_url: 'https://avatars.githubusercontent.com/u/215159878?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/zezopm300', + html_url: 'https://github.com/zezopm300', + followers_url: 'https://api.github.com/users/zezopm300/followers', + following_url: 'https://api.github.com/users/zezopm300/following{/other_user}', + gists_url: 'https://api.github.com/users/zezopm300/gists{/gist_id}', + starred_url: 'https://api.github.com/users/zezopm300/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/zezopm300/subscriptions', + organizations_url: 'https://api.github.com/users/zezopm300/orgs', + repos_url: 'https://api.github.com/users/zezopm300/repos', + events_url: 'https://api.github.com/users/zezopm300/events{/privacy}', + received_events_url: 'https://api.github.com/users/zezopm300/received_events', + type: 'User', + user_view_type: 'public', + site_admin: false + }, + labels: [ + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:add', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2025-07-19T20:44:05Z', + updated_at: '2025-07-19T20:44:05Z', + closed_at: null, + author_association: 'NONE', + type: null, + active_lock_reason: null, + sub_issues_summary: { total: 0, completed: 0, percent_completed: 0 }, + body: + '### Stream ID (required)\n' + + '\n' + + 'OnTimeSports.eg@SD\n' + + '\n' + + '### Stream URL (required)\n' + + '\n' + + ' OnTime Sports SD.mu38\n' + + '\n' + + '### Quality\n' + + '\n' + + 'None\n' + + '\n' + + '### Label\n' + + '\n' + + 'None\n' + + '\n' + + '### HTTP User Agent\n' + + '\n' + + '_No response_\n' + + '\n' + + '### HTTP Referrer\n' + + '\n' + + '_No response_\n' + + '\n' + + '### Directives\n' + + '\n' + + '_No response_\n' + + '\n' + + '### Notes\n' + + '\n' + + '_No response_\n' + + '\n' + + '### Contributing Guide\n' + + '\n' + + '- [x] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + closed_by: null, + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/25157/timeline', + performed_via_github_app: null, + state_reason: null + } +] diff --git a/tests/__data__/input/playlist_test/results.js b/tests/__data__/input/playlist_test/results.js index 84c66492a1..1899543830 100644 --- a/tests/__data__/input/playlist_test/results.js +++ b/tests/__data__/input/playlist_test/results.js @@ -1,14 +1,14 @@ -module.exports = { - 'https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/absliveantigua3': - { - url: 'https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/absliveantigua3', - http: { referrer: '', 'user-agent': '' }, - status: { ok: false, code: 'HTTP_NOT_FOUND', message: 'HTTP 404 Not Found' } - }, - 'https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145': - { - url: 'https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145', - http: { referrer: '', 'user-agent': '' }, - status: { ok: false, code: 'HTTP_FORBIDDEN', message: 'HTTP 403 Forbidden' } - } -} +module.exports = { + 'https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/absliveantigua3': + { + url: 'https://query-streamlink.herokuapp.com/iptv-query?streaming-ip=https://www.twitch.tv/absliveantigua3', + http: { referrer: '', 'user-agent': '' }, + status: { ok: false, code: 'HTTP_NOT_FOUND', message: 'HTTP 404 Not Found' } + }, + 'https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145': + { + url: 'https://tego-cdn2a.sibercdn.com/Live_TV-ABSTV-10/tracks-v3a1/rewind-7200.m3u8?token=e5f61e7be8363eb781b4bdfe591bf917dd529c1a-SjY3NzRTbDZQNnFQVkZaNkZja2RxV3JKc1VBa05zQkdMNStJakRGV0VTTzNrOEVGVUlIQmxta1NLV0o3bzdVdQ-1736094545-1736008145', + http: { referrer: '', 'user-agent': '' }, + status: { ok: false, code: 'HTTP_FORBIDDEN', message: 'HTTP 403 Forbidden' } + } +} diff --git a/tests/commands/api/generate.test.ts b/tests/commands/api/generate.test.ts index 4959afd913..d32a2cfc27 100644 --- a/tests/commands/api/generate.test.ts +++ b/tests/commands/api/generate.test.ts @@ -1,26 +1,26 @@ -import { pathToFileURL } from 'node:url' -import { execSync } from 'child_process' -import fs from 'fs-extra' - -const ENV_VAR = - 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/api_generate API_DIR=tests/__data__/output/.api' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') -}) - -describe('api:generate', () => { - it('can create streams.json', () => { - const cmd = `${ENV_VAR} npm run api:generate` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - expect(content('tests/__data__/output/.api/streams.json')).toMatchObject( - content('tests/__data__/expected/api_generate/.api/streams.json') - ) - }) -}) - -function content(filepath: string) { - return JSON.parse(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })) -} +import { pathToFileURL } from 'node:url' +import { execSync } from 'child_process' +import fs from 'fs-extra' + +const ENV_VAR = + 'cross-env DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/input/api_generate API_DIR=tests/__data__/output/.api' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') +}) + +describe('api:generate', () => { + it('can create streams.json', () => { + const cmd = `${ENV_VAR} npm run api:generate` + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + expect(content('tests/__data__/output/.api/streams.json')).toMatchObject( + content('tests/__data__/expected/api_generate/.api/streams.json') + ) + }) +}) + +function content(filepath: string) { + return JSON.parse(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })) +} diff --git a/tests/commands/playlist/edit.test.ts b/tests/commands/playlist/edit.test.ts index 0a770a09ce..aee61364b4 100644 --- a/tests/commands/playlist/edit.test.ts +++ b/tests/commands/playlist/edit.test.ts @@ -1,38 +1,38 @@ -import { execSync } from 'child_process' -import fs from 'fs-extra' - -type ExecError = { - status: number - stdout: string -} - -const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') - fs.copySync( - 'tests/__data__/input/playlist_edit/playlist.m3u', - 'tests/__data__/output/playlist.m3u' - ) -}) - -describe('playlist:edit', () => { - it('shows list of options for a streams', () => { - const cmd = `${ENV_VAR} npm run playlist:edit --- tests/__data__/output/playlist.m3u` - try { - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - checkStdout(stdout) - } catch (error) { - // NOTE: for Windows only - if (process.env.DEBUG === 'true') console.log(cmd, error) - checkStdout((error as ExecError).stdout) - } - }) -}) - -function checkStdout(stdout: string) { - expect(stdout).toContain('TF1.fr (TF1, Télévision française 1)') - expect(stdout).toContain('Type...') - expect(stdout).toContain('Skip') -} +import { execSync } from 'child_process' +import fs from 'fs-extra' + +type ExecError = { + status: number + stdout: string +} + +const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') + fs.copySync( + 'tests/__data__/input/playlist_edit/playlist.m3u', + 'tests/__data__/output/playlist.m3u' + ) +}) + +describe('playlist:edit', () => { + it('shows list of options for a streams', () => { + const cmd = `${ENV_VAR} npm run playlist:edit --- tests/__data__/output/playlist.m3u` + try { + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + checkStdout(stdout) + } catch (error) { + // NOTE: for Windows only + if (process.env.DEBUG === 'true') console.log(cmd, error) + checkStdout((error as ExecError).stdout) + } + }) +}) + +function checkStdout(stdout: string) { + expect(stdout).toContain('TF1.fr (TF1, Télévision française 1)') + expect(stdout).toContain('Type...') + expect(stdout).toContain('Skip') +} diff --git a/tests/commands/playlist/format.test.ts b/tests/commands/playlist/format.test.ts index 49345f61f4..f169322d84 100644 --- a/tests/commands/playlist/format.test.ts +++ b/tests/commands/playlist/format.test.ts @@ -1,36 +1,37 @@ -import { pathToFileURL } from 'node:url' -import { execSync } from 'child_process' -import * as fs from 'fs-extra' -import { glob } from 'glob' - -const ENV_VAR = 'cross-env STREAMS_DIR=tests/__data__/output/streams DATA_DIR=tests/__data__/input/data' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') - fs.copySync('tests/__data__/input/playlist_format', 'tests/__data__/output/streams') -}) - -describe('playlist:format', () => { - it('can format playlists', () => { - const cmd = `${ENV_VAR} npm run playlist:format` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - const files = glob.sync('tests/__data__/expected/playlist_format/*.m3u').map(filepath => { - const fileUrl = pathToFileURL(filepath).toString() - const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_format/').toString() - - return fileUrl.replace(pathToRemove, '') - }) - - files.forEach(filepath => { - expect(content(`tests/__data__/output/streams/${filepath}`)).toBe( - content(`tests/__data__/expected/playlist_format/${filepath}`) - ) - }) - }) -}) - -function content(filepath: string) { - return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) -} +import { pathToFileURL } from 'node:url' +import { execSync } from 'child_process' +import * as fs from 'fs-extra' +import { glob } from 'glob' + +const ENV_VAR = + 'cross-env STREAMS_DIR=tests/__data__/output/streams DATA_DIR=tests/__data__/input/data' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') + fs.copySync('tests/__data__/input/playlist_format', 'tests/__data__/output/streams') +}) + +describe('playlist:format', () => { + it('can format playlists', () => { + const cmd = `${ENV_VAR} npm run playlist:format` + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + const files = glob.sync('tests/__data__/expected/playlist_format/*.m3u').map(filepath => { + const fileUrl = pathToFileURL(filepath).toString() + const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_format/').toString() + + return fileUrl.replace(pathToRemove, '') + }) + + files.forEach(filepath => { + expect(content(`tests/__data__/output/streams/${filepath}`)).toBe( + content(`tests/__data__/expected/playlist_format/${filepath}`) + ) + }) + }) +}) + +function content(filepath: string) { + return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) +} diff --git a/tests/commands/playlist/generate.test.ts b/tests/commands/playlist/generate.test.ts index 39f38a8f36..37efbf67f1 100644 --- a/tests/commands/playlist/generate.test.ts +++ b/tests/commands/playlist/generate.test.ts @@ -1,43 +1,43 @@ -import { pathToFileURL } from 'node:url' -import { execSync } from 'child_process' -import { EOL } from 'node:os' -import * as fs from 'fs-extra' -import * as glob from 'glob' - -const ENV_VAR = - 'cross-env STREAMS_DIR=tests/__data__/input/playlist_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') -}) - -describe('playlist:generate', () => { - it('can generate playlists and logs', () => { - const cmd = `${ENV_VAR} npm run playlist:generate` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - const playlists = glob - .sync('tests/__data__/expected/playlist_generate/.gh-pages/**/*.m3u') - .map(filepath => { - const fileUrl = pathToFileURL(filepath).toString() - const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_generate/').toString() - - return fileUrl.replace(pathToRemove, '') - }) - - playlists.forEach((filepath: string) => { - expect(content(`tests/__data__/output/${filepath}`), filepath).toBe( - content(`tests/__data__/expected/playlist_generate/${filepath}`) - ) - }) - - expect(content('tests/__data__/output/logs/generators.log').split(EOL).sort()).toStrictEqual( - content('tests/__data__/expected/playlist_generate/logs/generators.log').split(EOL).sort() - ) - }) -}) - -function content(filepath: string) { - return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) -} +import { pathToFileURL } from 'node:url' +import { execSync } from 'child_process' +import { EOL } from 'node:os' +import * as fs from 'fs-extra' +import * as glob from 'glob' + +const ENV_VAR = + 'cross-env STREAMS_DIR=tests/__data__/input/playlist_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') +}) + +describe('playlist:generate', () => { + it('can generate playlists and logs', () => { + const cmd = `${ENV_VAR} npm run playlist:generate` + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + const playlists = glob + .sync('tests/__data__/expected/playlist_generate/.gh-pages/**/*.m3u') + .map(filepath => { + const fileUrl = pathToFileURL(filepath).toString() + const pathToRemove = pathToFileURL('tests/__data__/expected/playlist_generate/').toString() + + return fileUrl.replace(pathToRemove, '') + }) + + playlists.forEach((filepath: string) => { + expect(content(`tests/__data__/output/${filepath}`), filepath).toBe( + content(`tests/__data__/expected/playlist_generate/${filepath}`) + ) + }) + + expect(content('tests/__data__/output/logs/generators.log').split(EOL).sort()).toStrictEqual( + content('tests/__data__/expected/playlist_generate/logs/generators.log').split(EOL).sort() + ) + }) +}) + +function content(filepath: string) { + return fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' }) +} diff --git a/tests/commands/playlist/test.test.ts b/tests/commands/playlist/test.test.ts index ec14499089..1bf978b016 100644 --- a/tests/commands/playlist/test.test.ts +++ b/tests/commands/playlist/test.test.ts @@ -1,21 +1,21 @@ -import { execSync } from 'child_process' - -type ExecError = { - status: number - stdout: string -} - -const ENV_VAR = 'cross-env ROOT_DIR=tests/__data__/input DATA_DIR=tests/__data__/input/data' - -describe('playlist:test', () => { - it('shows an error if the playlist contains a broken link', () => { - const cmd = `${ENV_VAR} npm run playlist:test playlist_test/ag.m3u` - try { - execSync(cmd, { encoding: 'utf8' }) - } catch (error) { - if (process.env.DEBUG === 'true') console.log(cmd, error) - expect((error as ExecError).stdout).toContain('playlist_test/ag.m3u') - expect((error as ExecError).stdout).toContain('2 problems (1 errors, 1 warnings)') - } - }) -}) +import { execSync } from 'child_process' + +type ExecError = { + status: number + stdout: string +} + +const ENV_VAR = 'cross-env ROOT_DIR=tests/__data__/input DATA_DIR=tests/__data__/input/data' + +describe('playlist:test', () => { + it('shows an error if the playlist contains a broken link', () => { + const cmd = `${ENV_VAR} npm run playlist:test playlist_test/ag.m3u` + try { + execSync(cmd, { encoding: 'utf8' }) + } catch (error) { + if (process.env.DEBUG === 'true') console.log(cmd, error) + expect((error as ExecError).stdout).toContain('playlist_test/ag.m3u') + expect((error as ExecError).stdout).toContain('2 problems (1 errors, 1 warnings)') + } + }) +}) diff --git a/tests/commands/playlist/validate.test.ts b/tests/commands/playlist/validate.test.ts index a2532933fd..597916c49a 100644 --- a/tests/commands/playlist/validate.test.ts +++ b/tests/commands/playlist/validate.test.ts @@ -1,44 +1,45 @@ -import { execSync } from 'child_process' - -type ExecError = { - status: number - stdout: string -} - -const ENV_VAR = 'cross-env DATA_DIR=tests/__data__/input/data ROOT_DIR=tests/__data__/input/playlist_validate' - -describe('playlist:validate', () => { - it('show an error if channel id in the blocklist', () => { - const cmd = `${ENV_VAR} npm run playlist:validate -- us_blocked.m3u` - try { - execSync(cmd, { encoding: 'utf8' }) - } catch (error) { - if (process.env.DEBUG === 'true') console.log(cmd, error) - expect((error as ExecError).stdout).toContain('us_blocked.m3u') - expect((error as ExecError).stdout).toContain( - '2 error "FoxSports2.us" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0002)' - ) - expect((error as ExecError).stdout).toContain( - '4 error "TVN.pl" is on the blocklist due to NSFW content (https://github.com/iptv-org/iptv/issues/0003)' - ) - expect((error as ExecError).stdout).toContain('2 problems (2 errors, 0 warnings)') - } - }) - - it('show a warning if channel has wrong id', () => { - const cmd = `${ENV_VAR} npm run playlist:validate -- wrong_id.m3u` - try { - execSync(cmd, { encoding: 'utf8' }) - } catch (error) { - if (process.env.DEBUG === 'true') console.log(cmd, error) - expect((error as ExecError).stdout).toContain( - 'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n' - ) - } - }) - - it('skip the file if it does not exist', () => { - const cmd = `${ENV_VAR} npm run playlist:validate -- missing.m3u` - execSync(cmd, { encoding: 'utf8' }) - }) -}) +import { execSync } from 'child_process' + +type ExecError = { + status: number + stdout: string +} + +const ENV_VAR = + 'cross-env DATA_DIR=tests/__data__/input/data ROOT_DIR=tests/__data__/input/playlist_validate' + +describe('playlist:validate', () => { + it('show an error if channel id in the blocklist', () => { + const cmd = `${ENV_VAR} npm run playlist:validate -- us_blocked.m3u` + try { + execSync(cmd, { encoding: 'utf8' }) + } catch (error) { + if (process.env.DEBUG === 'true') console.log(cmd, error) + expect((error as ExecError).stdout).toContain('us_blocked.m3u') + expect((error as ExecError).stdout).toContain( + '2 error "FoxSports2.us" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0002)' + ) + expect((error as ExecError).stdout).toContain( + '4 error "TVN.pl" is on the blocklist due to NSFW content (https://github.com/iptv-org/iptv/issues/0003)' + ) + expect((error as ExecError).stdout).toContain('2 problems (2 errors, 0 warnings)') + } + }) + + it('show a warning if channel has wrong id', () => { + const cmd = `${ENV_VAR} npm run playlist:validate -- wrong_id.m3u` + try { + execSync(cmd, { encoding: 'utf8' }) + } catch (error) { + if (process.env.DEBUG === 'true') console.log(cmd, error) + expect((error as ExecError).stdout).toContain( + 'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n' + ) + } + }) + + it('skip the file if it does not exist', () => { + const cmd = `${ENV_VAR} npm run playlist:validate -- missing.m3u` + execSync(cmd, { encoding: 'utf8' }) + }) +}) diff --git a/tests/commands/readme/update.test.ts b/tests/commands/readme/update.test.ts index 12bfece329..422a52d54f 100644 --- a/tests/commands/readme/update.test.ts +++ b/tests/commands/readme/update.test.ts @@ -1,26 +1,26 @@ -import { pathToFileURL } from 'node:url' -import { execSync } from 'child_process' -import fs from 'fs-extra' - -const ENV_VAR = - 'cross-env DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/readme_update ROOT_DIR=tests/__data__/output' - -beforeEach(() => { - fs.emptyDirSync('tests/__data__/output') -}) - -describe('readme:update', () => { - it('can update readme.md', () => { - const cmd = `${ENV_VAR} npm run readme:update` - const stdout = execSync(cmd, { encoding: 'utf8' }) - if (process.env.DEBUG === 'true') console.log(cmd, stdout) - - expect(content('tests/__data__/output/PLAYLISTS.md')).toEqual( - content('tests/__data__/expected/readme_update/playlists.md') - ) - }) -}) - -function content(filepath: string) { - return JSON.stringify(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })) -} +import { pathToFileURL } from 'node:url' +import { execSync } from 'child_process' +import fs from 'fs-extra' + +const ENV_VAR = + 'cross-env DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/readme_update ROOT_DIR=tests/__data__/output' + +beforeEach(() => { + fs.emptyDirSync('tests/__data__/output') +}) + +describe('readme:update', () => { + it('can update readme.md', () => { + const cmd = `${ENV_VAR} npm run readme:update` + const stdout = execSync(cmd, { encoding: 'utf8' }) + if (process.env.DEBUG === 'true') console.log(cmd, stdout) + + expect(content('tests/__data__/output/PLAYLISTS.md')).toEqual( + content('tests/__data__/expected/readme_update/playlists.md') + ) + }) +}) + +function content(filepath: string) { + return JSON.stringify(fs.readFileSync(pathToFileURL(filepath), { encoding: 'utf8' })) +} diff --git a/tsconfig.json b/tsconfig.json index f1ad2f4b13..657998950d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,20 @@ -{ - "compilerOptions": { - "strict": true, - "target": "es2022", - "module": "nodeNext", - "moduleResolution": "nodeNext", - "typeRoots": [ - "./scripts/types", - "./node_modules/@types" - ], - "esModuleInterop": true - }, - "ts-node": { - "esm": true, - "transpileOnly": true - }, - "files": [ - "node_modules/jest-expect-message/types/index.d.ts" - ] +{ + "compilerOptions": { + "strict": true, + "target": "es2022", + "module": "nodeNext", + "moduleResolution": "nodeNext", + "typeRoots": [ + "./scripts/types", + "./node_modules/@types" + ], + "esModuleInterop": true + }, + "ts-node": { + "esm": true, + "transpileOnly": true + }, + "files": [ + "node_modules/jest-expect-message/types/index.d.ts" + ] } \ No newline at end of file From 4c5821ec44725be31ebe20378377012cffa855cd Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 00:13:22 +0000 Subject: [PATCH 48/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18392480252) workflow. closes #27956, closes #27885, closes #27967, closes #27966, closes #27965, closes #27964, closes #27963, closes #27962, closes #27961, closes #27960, closes #27959, closes #27958, closes #27957, closes #27936, closes #27934, closes #27933, closes #27932, closes #27931, closes #27930, closes #27929, closes #27928, closes #27927, closes #27926, closes #27924, closes #27923, closes #27922, closes #27921, closes #27920, closes #27919, closes #27918, closes #27917, closes #27915, closes #27914, closes #27913, closes #27912, closes #27909, closes #27908, closes #27907, closes #27876, closes #27875, closes #27874, closes #27872, closes #27871, closes #27869, closes #27867, closes #27866, closes #27865, closes #27864, closes #27863, closes #27861, closes #27860, closes #27859, closes #27857, closes #27856, closes #27855, closes #27854, closes #27849, closes #27848, closes #27847, closes #27846, closes #27845, closes #27844, closes #27843, closes #27842, closes #27841, closes #27840, closes #27837, closes #27836, closes #27835, closes #27834, closes #27833, closes #27832, closes #27831, closes #27829, closes #27827, closes #27826, closes #27825, closes #27800 --- streams/ae.m3u | 4 ++++ streams/cd.m3u | 8 +++++++ streams/de.m3u | 2 ++ streams/eg.m3u | 14 ++++++++++++ streams/fr.m3u | 2 ++ streams/id.m3u | 8 +++++-- streams/in.m3u | 8 +++++++ streams/it.m3u | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ streams/jo.m3u | 2 ++ streams/pe.m3u | 4 ++-- streams/pl.m3u | 2 ++ streams/ru.m3u | 2 ++ streams/sa.m3u | 2 ++ streams/ua.m3u | 34 +++++++++++++++++++++++++++++ streams/uk.m3u | 2 ++ streams/us.m3u | 8 ++++++- streams/za.m3u | 2 ++ 17 files changed, 157 insertions(+), 5 deletions(-) diff --git a/streams/ae.m3u b/streams/ae.m3u index 249f53504e..8eff7c5138 100644 --- a/streams/ae.m3u +++ b/streams/ae.m3u @@ -149,3 +149,7 @@ http://213.57.91.138:8000/play/a05t http://213.57.91.138:8000/play/a05u #EXTINF:-1 tvg-id="DubaiOne.ae@SD",Dubai One https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/dubaione/playlist.m3u8 +#EXTINF:-1 tvg-id="SkyNewsArabia.ae@SD",Sky News Arabia +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119687/skynewsarabic/playlist.m3u8 +#EXTINF:-1 tvg-id="Alarabiya.ae@SD",Alarabiya +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alarabia/playlist.m3u8 diff --git a/streams/cd.m3u b/streams/cd.m3u index 9079e544aa..7643b2af88 100644 --- a/streams/cd.m3u +++ b/streams/cd.m3u @@ -57,3 +57,11 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/kin24/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/rtga/playlist.m3u8 #EXTINF:-1 tvg-id="CanalCVVInternational.cd@SD",Canal CVV International https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119033/cvvtv/playlist.m3u8 +#EXTINF:-1 tvg-id="RTVS1.cd@SD",RTVS1 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/tvs1/playlist.m3u8 +#EXTINF:-1 tvg-id="RTNC3.cd@SD",RTNC 3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/rtnc3/playlist.m3u8 +#EXTINF:-1 tvg-id="DigitalCongoTV.cd@SD",Digital Congo TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/dcc/playlist.m3u8 +#EXTINF:-1 tvg-id="RTNC.cd@SD",RTNC +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119692/rtnc1/playlist.m3u8 diff --git a/streams/de.m3u b/streams/de.m3u index 8215dd76a1..763d092f56 100644 --- a/streams/de.m3u +++ b/streams/de.m3u @@ -511,3 +511,5 @@ https://viamotionhsi.netplus.ch/live/eds/zdfneohd/browser-dash/zdfneohd.mpd https://viamotionhsi.netplus.ch/live/eds/zdfneohd/browser-HLS8/zdfneohd.m3u8 #EXTINF:-1 tvg-id="ZweiMusicTelevision.de",ZWEI2 Music (1080p) https://cdne.folxplay.tv/folx-trz/streams/ch-2/master.m3u8 +#EXTINF:-1 tvg-id="DW.de@Arabic",DW Arabic +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/dwarabic/playlist.m3u8 diff --git a/streams/eg.m3u b/streams/eg.m3u index cfcb0a8de4..e4b463ed1a 100644 --- a/streams/eg.m3u +++ b/streams/eg.m3u @@ -92,3 +92,17 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/egyptiantvhd/playli https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120686/aghapytv/playlist.m3u8 #EXTINF:-1 tvg-id="MixHollywood.eg@SD",Mix Hollywood https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119198/mix/playlist.m3u8 +#EXTINF:-1 tvg-id="AlGhadTV.eg@SD",Al Ghad TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alghad/playlist.m3u8 +#EXTINF:-1 tvg-id="ExtraNews.eg@SD",Extra News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/cbcextranews/playlist.m3u8 +#EXTINF:-1 tvg-id="CBCSofra.eg@SD",CBC Sofra +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/cbcsofra/playlist.m3u8 +#EXTINF:-1 tvg-id="NileNews.eg@SD",Nile News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119198/alnilenews/playlist.m3u8 +#EXTINF:-1 tvg-id="AlMasriyah.eg@SD",Al Masriyah +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/almasriya/playlist.m3u8 +#EXTINF:-1 tvg-id="AlQaheraNews.eg@SD",Al Qahera News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alqaheranews/playlist.m3u8 +#EXTINF:-1 tvg-id="AlWathaeqya.eg@SD",Al Wathaeqya +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alwathaeqyia/playlist.m3u8 diff --git a/streams/fr.m3u b/streams/fr.m3u index 91793d3aae..755095ce15 100644 --- a/streams/fr.m3u +++ b/streams/fr.m3u @@ -369,3 +369,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/telesud/playlist.m3 https://raw.githubusercontent.com/Sibprod/streams/main/ressources/dm/py/hls/bsmart.m3u8 #EXTINF:-1 tvg-id="NOVO19.fr@HD",NOVO19 (720p) https://viamotionhsi.netplus.ch/live/eds/novo19/browser-HLS8/novo19.m3u8 +#EXTINF:-1 tvg-id="France24.fr@Arabic",France 24 Arabic +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119198/france24arabic/playlist.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index 5fe83330d5..3b6776a9eb 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -125,8 +125,8 @@ https://5bf7b725107e5.streamlock.net/onlinetvnusantara/onlinetvnusantara/playlis http://122.248.43.242:1935/PADANGTV/_definst_/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="PalembangTV.id",Pal TV (720p) [Not 24/7] https://v3.siar.us/paltv/live/playlist.m3u8 -#EXTINF:-1 tvg-id="PONTV.id@SD",PONTV -https://63b2dc7196c38.streamlock.net/PONTV/_definst_/myStream/playlist.m3u8 +#EXTINF:-1 tvg-id="PONTV.id@SD",PONTV (720p) +http://122.248.43.242:1935/PONTV/_definst_/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="PSJTV.id",PSJ TV (1080p) https://play.accolamedia.id/accola/psj.stream/playlist.m3u8 #EXTINF:-1 tvg-id="PujaTVAceh.id",Puja TV Aceh (1080p) [Not 24/7] @@ -295,3 +295,7 @@ https://hgmtv.com:19360/asthatv/asthatv.m3u8 http://122.248.43.242:1935/BATAMTV/_definst_/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="MadaniTV.id@SD",Madani TV (720p) https://stream.asianastream.com/madani/madanitv.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="JTV.id@Kediri",JTV Kediri +http://122.248.43.242:1935/JTVKEDIRI/_definst_/myStream/playlist.m3u8 +#EXTINF:-1 tvg-id="JTV.id@SD",JTV (480p) +http://122.248.43.242:1935/JTVSURABAYA/_definst_/myStream/playlist.m3u8 diff --git a/streams/in.m3u b/streams/in.m3u index 80b7b5c3ec..9497cb62d6 100644 --- a/streams/in.m3u +++ b/streams/in.m3u @@ -1330,3 +1330,11 @@ http://93.119.105.61:80/play/live.php?mac=00:1A:79:00:28:53&stream=443062&extens https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120683/angeltv/playlist.m3u8 #EXTINF:-1 tvg-id="Tunes6.in@SD",Tunes 6 (576p) https://live.dinesh29.com.np/stream/jiotvplus/tunes6/master.m3u8 +#EXTINF:-1 tvg-id="PunjabiHits.in@SD",Punjabi Hits +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/punjabihits/playlist.m3u8 +#EXTINF:-1 tvg-id="LivingIndiaNews.in@SD",Living India News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/livingindia/playlist.m3u8 +#EXTINF:-1 tvg-id="AsianetNewsKannada.in@SD",Asianet News Kannada +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/asianet2/playlist.m3u8 +#EXTINF:-1 tvg-id="AsianetNews.in@SD",Asianet News +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119195/asianet1/playlist.m3u8 diff --git a/streams/it.m3u b/streams/it.m3u index 6910431309..33ddebca33 100644 --- a/streams/it.m3u +++ b/streams/it.m3u @@ -755,3 +755,61 @@ https://stream.cp.ets-sistemi.it:1936/profservtv/profservtv/playlist.m3u8 https://5f22d76e220e1.streamlock.net/canale5/canale5/playlist.m3u8 #EXTINF:-1 tvg-id="ZerounoTVNews.it",Zerouno TV News (720p) https://5db313b643fd8.streamlock.net/ZerounoTVEventi/ZerounoTVEventi/playlist.m3u8 +#EXTINF:-1 tvg-id="RTL1025Best.it@SD",RTL 102.5 Best +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/rtl102.5/playlist.m3u8 +#EXTINF:-1 tvg-id="LA7d.it@HD",LA7d HD +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/la7d/playlist.m3u8 +#EXTINF:-1 tvg-id="LA7.it@SD",LA7 +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/la7hd/playlist.m3u8 +#EXTINF:-1 tvg-id="TCI.it@SD",TCI +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/tci/playlist.m3u8 +#EXTINF:-1 tvg-id="PadrePioTV.it@SD",Padre Pio TV +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/padrepiotv/playlist.m3u8 +#EXTINF:-1 tvg-id="ByoBlu.it@SD",ByoBlu +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/byoblu/playlist.m3u8 +#EXTINF:-1 tvg-id="EQUtv.it@SD",EQUtv +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/equtv/playlist.m3u8 +#EXTINF:-1 tvg-id="ArteInvestimenti.it@SD",Arte Investimenti +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/arteinvestimenti/playlist.m3u8 +#EXTINF:-1 tvg-id="Deluxe139.it@SD",Deluxe 139 +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/deluxe139/playlist.m3u8 +#EXTINF:-1 tvg-id="LineaGem.it@SD",Linea Gem +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/lineagem/playlist.m3u8 +#EXTINF:-1 tvg-id="OrlerTV.it@SD",Orler TV +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/orlertv/playlist.m3u8 +#EXTINF:-1 tvg-id="Genius240.it@SD",Genius 240 +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/genius240/playlist.m3u8 +#EXTINF:-1 tvg-id="TeleShopping.it@SD",Tele Shopping +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/teleshopping/playlist.m3u8 +#EXTINF:-1 tvg-id="MariaVisionItalia.it@SD",Maria Vision Italia +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/mariavision/playlist.m3u8 +#EXTINF:-1 tvg-id="TesoryChannel.it@SD",Tesory Channel +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/tesorychannel/playlist.m3u8 +#EXTINF:-1 tvg-id="PrimaFree.it@SD",Prima Free +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/primafree/playlist.m3u8 +#EXTINF:-1 tvg-id="BomChannel.it@SD",Bom Channel +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/bomchannel/playlist.m3u8 +#EXTINF:-1 tvg-id="Cine34.it@SD",Cine34 +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/cine34/playlist.m3u8 +#EXTINF:-1 tvg-id="RDSSocialTV.it@SD",RDS Social TV +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/rdssocialtv/playlist.m3u8 +#EXTINF:-1 tvg-id="ItaliaChannel.it@SD",Italia Channel +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/italiachannel/playlist.m3u8 +#EXTINF:-1 tvg-id="Telemolise.it@SD",Telemolise +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/telemolise/playlist.m3u8 +#EXTINF:-1 tvg-id="Rete8.it@SD",Rete 8 +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/rete8/playlist.m3u8 +#EXTINF:-1 tvg-id="TLTMolise.it@SD",TLT Molise +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/tltcanale77/playlist.m3u8 +#EXTINF:-1 tvg-id="QVC.it@SD",QVC +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/qvchd/playlist.m3u8 +#EXTINF:-1 tvg-id="Rete8Sport.it@SD",Rete 8 Sport +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/rete8sport/playlist.m3u8 +#EXTINF:-1 tvg-id="Teleregione.it@SD",Teleregione +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/teleregione/playlist.m3u8 +#EXTINF:-1 tvg-id="SuperJTVTeramo.it@SD",Super J TV Teramo +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/superj/playlist.m3u8 +#EXTINF:-1 tvg-id="InfoMediaNews.it@SD",Info Media News +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/infomedianews/playlist.m3u8 +#EXTINF:-1 tvg-id="TVSei.it@SD",TV Sei +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/tvsei/playlist.m3u8 diff --git a/streams/jo.m3u b/streams/jo.m3u index 66560b5ee8..8db9dd1acc 100644 --- a/streams/jo.m3u +++ b/streams/jo.m3u @@ -53,3 +53,5 @@ https://playlist.fasttvcdn.com/pl/ptllxjd03j6g9oxxjdfapg/roya-kids-originals/pla https://playlist.fasttvcdn.com/pl/toa2uuhhygheuly7xtuqrg/roya-kitchen/playlist.m3u8 #EXTINF:-1 tvg-id="RoyaTV.jo",Roya TV (1080p) [Not 24/7] https://royatv-live.daioncdn.net/royatv/royatv.m3u8 +#EXTINF:-1 tvg-id="JordanTV.jo@SD",Jordan TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119198/jordan/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index 3cfe93caae..e20d0b94e6 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -23,8 +23,8 @@ https://live-evg1.tv360.bitel.com.pe/bitel/cajamarcatv/playlist.m3u8 https://live.obslivestream.com/canal8/index.m3u8 #EXTINF:-1 tvg-id="CanalIPe.pe",Canal IPe (1080p) https://cdnhd.iblups.com/hls/3f2cb1658d114f2693eff18d83199e67.m3u8 -#EXTINF:-1 tvg-id="Conecta2TV.pe",Conecta2TV (720p) [Not 24/7] -https://servilive.com:3114/live/liveulive.m3u8 +#EXTINF:-1 tvg-id="Conecta2TV.pe@SD" http-referrer="https://conecta2.pe/",Conecta2TV (720p) [Not 24/7] +https://live.obslivestream.com/conecta2/index.m3u8 #EXTINF:-1 tvg-id="CongresoTV.pe@SD",Congreso TV https://ccstreaming.packet.mx/WebRTCAppEE/streams/45.1_kd5oiNTTWO0gEOFc431277834.m3u8 #EXTINF:-1 tvg-id="ControversiaTV.pe",Controversia TV (720p) [Not 24/7] diff --git a/streams/pl.m3u b/streams/pl.m3u index 733ddf670c..4f07a34dd9 100644 --- a/streams/pl.m3u +++ b/streams/pl.m3u @@ -118,3 +118,5 @@ https://cdn-s-lb2.pluscdn.pl/lv/1517830/349/hls/f03a76f3/masterlist.m3u8 https://stream.4fun.tv:8889/hls/4fk_high/index.m3u8 #EXTINF:-1 tvg-id="DisneyXD.pl",Disney XD (576p) http://185.236.229.62:9981/play/a07c +#EXTINF:-1 tvg-id="Nickelodeon.pl",Nickelodeon (576p) +http://185.236.229.62:9981/play/a067 diff --git a/streams/ru.m3u b/streams/ru.m3u index 4e22585bc9..a11e57baa0 100644 --- a/streams/ru.m3u +++ b/streams/ru.m3u @@ -279,3 +279,5 @@ https://live-uvelirochka.cdnvideo.ru/uvelirochka/uvelirochka_720p3/playlist.m3u8 http://31.148.48.15/Russkiy_Detektiv/index.m3u8 #EXTINF:-1 tvg-id="Nickelodeon.ru",Nickelodeon (576p) http://46.8.46.14/Nickelodeon/index.m3u8 +#EXTINF:-1 tvg-id="RTArabic.ru@SD",RT Arabic +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119687/rttodayarabic/playlist.m3u8 diff --git a/streams/sa.m3u b/streams/sa.m3u index 98b0b7d7d4..3d2f38caaa 100644 --- a/streams/sa.m3u +++ b/streams/sa.m3u @@ -148,3 +148,5 @@ https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/rotanadrama/playlist.m https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/rotanazaman/playlist.m3u8 #EXTINF:-1 tvg-id="AlSunnahAlNabawiyahTV.sa@SD",Al Sunnah Al Nabawiyah TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/alsunnah/playlist.m3u8 +#EXTINF:-1 tvg-id="AlHadath.sa@SD",Al Hadath +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119196/alhadathegypt/playlist.m3u8 diff --git a/streams/ua.m3u b/streams/ua.m3u index 0aea2ee1f7..4d3c139d20 100644 --- a/streams/ua.m3u +++ b/streams/ua.m3u @@ -155,3 +155,37 @@ https://tuso.cdn-01.cosmonova.net.ua/hls/tuso_ua.m3u8 http://46.175.163.130/ks_plus/index.m3u8 #EXTINF:-1 tvg-id="ChPinfo.ua",ЧП Инфо (576p) http://edge3.iptv.macc.com.ua/life/magnolia_3/index.m3u8 +#EXTINF:-1 tvg-id="Channel5.ua@SD",Channel 5 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120685/5channel/playlist.m3u8 +#EXTINF:-1 tvg-id="ArmyTV.ua@SD",Army TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120685/armiyatv/playlist.m3u8 +#EXTINF:-1 tvg-id="FREEDOM.ua@SD",FREEDOM +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119693/freedomchannels/playlist.m3u8 +#EXTINF:-1 tvg-id="DIM.ua@SD",DIM +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119693/dimtv/playlist.m3u8 +#EXTINF:-1 tvg-id="Dacha.ua@SD",Dacha +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119693/dacha/playlist.m3u8 +#EXTINF:-1 tvg-id="DynamoKyivTV.ua@SD",Dynamo Kyiv TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120685/dynamokyivhd/playlist.m3u8 +#EXTINF:-1 tvg-id="XSportPlus.ua@SD",XSport+ +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119693/xsportsplus/playlist.m3u8 +#EXTINF:-1 tvg-id="FashionTV.ua@SD",Fashion TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120685/fashiontvua/playlist.m3u8 +#EXTINF:-1 tvg-id="KvartalTV.ua@SD",Kvartal TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119693/kvartaltvinternational/playlist.m3u8 +#EXTINF:-1 tvg-id="StarCinema.ua@SD",Star Cinema +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/starcinema/playlist.m3u8 +#EXTINF:-1 tvg-id="InterPlus.ua@SD",Inter+ +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/interplus/playlist.m3u8 +#EXTINF:-1 tvg-id="Kyiv.ua@SD",Kyiv +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/kyivtv/playlist.m3u8 +#EXTINF:-1 tvg-id="ApostropheTV.ua@SD",Apostrophe TV +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/apostroftv/playlist.m3u8 +#EXTINF:-1 tvg-id="24Kanal.ua@SD",24 Kanal +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/24channel/playlist.m3u8 +#EXTINF:-1 tvg-id="Priamyi.ua@SD",Priamyi +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/pryamyitv/playlist.m3u8 +#EXTINF:-1 tvg-id="1Plus1Marafon.ua@SD",1+1 Marafon +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/11maraphon/playlist.m3u8 +#EXTINF:-1 tvg-id="1Plus1International.ua@SD",1+1 International +https://uvotv-aniview.global.ssl.fastly.net/10010/dvr/hls/11international/playlist.m3u8 diff --git a/streams/uk.m3u b/streams/uk.m3u index a666504d88..8033472682 100644 --- a/streams/uk.m3u +++ b/streams/uk.m3u @@ -342,3 +342,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120430/voxafrica/playlist. https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120757/horncabletv/playlist.m3u8 #EXTINF:-1 tvg-id="ITV1.uk",ITV1 (1080p) https://dttstream.zappr.stream/itv1.m3u8 +#EXTINF:-1 tvg-id="CarsStarsTV.uk@SD",Cars & Stars TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120685/carsstarstv/playlist.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index 3581257a8e..eaf11f144a 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -1082,5 +1082,11 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120977/ebstv/playlist.m3u8 https://stream.mux.com/DyxPGQOWJuWUxJ7uY2lhrnI0102Z3lo3qUxlaW01zQ2Ozs.m3u8 #EXTINF:-1 tvg-id="DirecTVSports.us",DirecTV Sports (1080p) http://38.183.182.166:8000/play/a125/index.m3u8 -#EXTINF:-1 tvg-id="HistoryLatinAmerica.us" http-referrer="http://www.history.com/",History Latin America (480p) +#EXTINF:-1 tvg-id="HistoryLatinAmerica.us",History Latin America (480p) http://181.188.216.5:18000/play/a0cf/index.m3u8 +#EXTINF:-1 tvg-id="WTTWDT3.us@SD",WTTW-DT3 +http://68.251.105.81:5004/auto/v11.3 +#EXTINF:-1 tvg-id="WTTWDT2.us@SD",WTTW-DT2 +http://68.251.105.81:5004/auto/v11.2 +#EXTINF:-1 tvg-id="WTTWDT1.us@SD",WTTW-DT1 +http://68.251.105.81:5004/auto/v11.1 diff --git a/streams/za.m3u b/streams/za.m3u index e6d4b1ed25..94a2ecdbef 100644 --- a/streams/za.m3u +++ b/streams/za.m3u @@ -63,3 +63,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/enca/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/sabcnews/playlist.m3u8 #EXTINF:-1 tvg-id="LN24SA.za@SD",LN24SA https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119176/l24international/playlist.m3u8 +#EXTINF:-1 tvg-id="ZeeOneAfrica.za@SD",Zee One Africa +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119051/zeeoneuk/playlist.m3u8 From ed19b03828011c3db8d01c9640536d1058b4e01f Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Fri, 10 Oct 2025 00:13:22 +0000 Subject: [PATCH 49/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18392480252) workflow. --- PLAYLISTS.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index fe03557344..0d9a27b235 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -23,36 +23,36 @@ Same thing, but split up into separate files: Animation60https://iptv-org.github.io/iptv/categories/animation.m3u - Auto18https://iptv-org.github.io/iptv/categories/auto.m3u + Auto19https://iptv-org.github.io/iptv/categories/auto.m3u Business67https://iptv-org.github.io/iptv/categories/business.m3u Classic45https://iptv-org.github.io/iptv/categories/classic.m3u Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u Culture169https://iptv-org.github.io/iptv/categories/culture.m3u - Documentary125https://iptv-org.github.io/iptv/categories/documentary.m3u + Documentary127https://iptv-org.github.io/iptv/categories/documentary.m3u Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment641https://iptv-org.github.io/iptv/categories/entertainment.m3u + Entertainment643https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General2437https://iptv-org.github.io/iptv/categories/general.m3u + General2444https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u - Kids271https://iptv-org.github.io/iptv/categories/kids.m3u + Kids272https://iptv-org.github.io/iptv/categories/kids.m3u Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle108https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies377https://iptv-org.github.io/iptv/categories/movies.m3u + Lifestyle109https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Movies378https://iptv-org.github.io/iptv/categories/movies.m3u Music633https://iptv-org.github.io/iptv/categories/music.m3u - News834https://iptv-org.github.io/iptv/categories/news.m3u + News843https://iptv-org.github.io/iptv/categories/news.m3u Outdoor43https://iptv-org.github.io/iptv/categories/outdoor.m3u Public29https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u Religious723https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u Series265https://iptv-org.github.io/iptv/categories/series.m3u - Shop85https://iptv-org.github.io/iptv/categories/shop.m3u - Sports301https://iptv-org.github.io/iptv/categories/sports.m3u + Shop89https://iptv-org.github.io/iptv/categories/shop.m3u + Sports305https://iptv-org.github.io/iptv/categories/sports.m3u Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3696https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3703https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -86,7 +86,7 @@ Same thing, but split up into separate files: Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic8https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic442https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic445https://iptv-org.github.io/iptv/languages/ara.m3u Armenian7https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -125,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2406https://iptv-org.github.io/iptv/languages/eng.m3u + English2412https://iptv-org.github.io/iptv/languages/eng.m3u Estonian9https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -154,11 +154,11 @@ Same thing, but split up into separate files: Hmong1https://iptv-org.github.io/iptv/languages/hmn.m3u Hungarian103https://iptv-org.github.io/iptv/languages/hun.m3u Icelandic5https://iptv-org.github.io/iptv/languages/isl.m3u - Indonesian139https://iptv-org.github.io/iptv/languages/ind.m3u + Indonesian141https://iptv-org.github.io/iptv/languages/ind.m3u Inuktitut1https://iptv-org.github.io/iptv/languages/iku.m3u Irish3https://iptv-org.github.io/iptv/languages/gle.m3u Isekiri1https://iptv-org.github.io/iptv/languages/its.m3u - Italian345https://iptv-org.github.io/iptv/languages/ita.m3u + Italian357https://iptv-org.github.io/iptv/languages/ita.m3u Japanese22https://iptv-org.github.io/iptv/languages/jpn.m3u Javanese3https://iptv-org.github.io/iptv/languages/jav.m3u Kabiyè1https://iptv-org.github.io/iptv/languages/kbp.m3u @@ -222,13 +222,13 @@ Same thing, but split up into separate files: Papiamento17https://iptv-org.github.io/iptv/languages/pap.m3u Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u Persian226https://iptv-org.github.io/iptv/languages/fas.m3u - Polish67https://iptv-org.github.io/iptv/languages/pol.m3u + Polish68https://iptv-org.github.io/iptv/languages/pol.m3u Portuguese255https://iptv-org.github.io/iptv/languages/por.m3u Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian98https://iptv-org.github.io/iptv/languages/ron.m3u Rundi2https://iptv-org.github.io/iptv/languages/run.m3u - Russian352https://iptv-org.github.io/iptv/languages/rus.m3u + Russian354https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French1https://iptv-org.github.io/iptv/languages/acf.m3u Samoan2https://iptv-org.github.io/iptv/languages/smo.m3u Sango1https://iptv-org.github.io/iptv/languages/sag.m3u @@ -270,7 +270,7 @@ Same thing, but split up into separate files: Turkish233https://iptv-org.github.io/iptv/languages/tur.m3u Turkmen8https://iptv-org.github.io/iptv/languages/tuk.m3u Uighur3https://iptv-org.github.io/iptv/languages/uig.m3u - Ukrainian58https://iptv-org.github.io/iptv/languages/ukr.m3u + Ukrainian72https://iptv-org.github.io/iptv/languages/ukr.m3u Urdu55https://iptv-org.github.io/iptv/languages/urd.m3u Uzbek24https://iptv-org.github.io/iptv/languages/uzb.m3u Venda1https://iptv-org.github.io/iptv/languages/ven.m3u From 38b7507b8c6a9e73fa0d6d624da41b9cc78c98d7 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 00:12:26 +0000 Subject: [PATCH 50/51] [Bot] Update /streams Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18421325457) workflow. closes #27887, closes #27373, closes #27998, closes #27993, closes #27976, closes #27974, closes #27971, closes #27970, closes #28018, closes #28017, closes #28011, closes #28009, closes #28008, closes #28007, closes #28006, closes #28004, closes #28003, closes #28002, closes #28001, closes #28000, closes #27999, closes #27997, closes #27996, closes #27994, closes #27992, closes #27991, closes #27990, closes #27989, closes #27986, closes #27985, closes #27977, closes #27975, closes #27973, closes #27943, closes #27916, closes #27899, closes #27894, closes #27839, closes #27702, closes #27653 --- streams/ar.m3u | 2 -- streams/co.m3u | 4 ++++ streams/do.m3u | 4 ++++ streams/es.m3u | 4 ++++ streams/id.m3u | 2 -- streams/it.m3u | 2 ++ streams/mr.m3u | 20 ++++++++++++++++++-- streams/ne.m3u | 2 ++ streams/pe.m3u | 2 +- streams/pl.m3u | 4 ++++ streams/sd.m3u | 2 ++ streams/sl.m3u | 4 +++- streams/sn.m3u | 16 ++++++++++++++++ streams/us.m3u | 6 ++++-- streams/ve.m3u | 10 +++++++--- streams/vn.m3u | 2 ++ 16 files changed, 73 insertions(+), 13 deletions(-) diff --git a/streams/ar.m3u b/streams/ar.m3u index 2c0ac9e289..d42eab4535 100644 --- a/streams/ar.m3u +++ b/streams/ar.m3u @@ -101,8 +101,6 @@ https://tv.mediacp.eu:19360/cosmos/cosmos.m3u8 https://stream.arcast.live/cpe/ngrp:cpe_all/playlist.m3u8 #EXTINF:-1 tvg-id="ElTrece.ar",El Trece (1080p) https://live-01-02-eltrece.vodgc.net/eltrecetv/index.m3u8 -#EXTINF:-1 tvg-id="ElTrece.ar",El Trece -http://190.123.90.146:8000/play/a00n/index.m3u8 #EXTINF:-1 tvg-id="GarageTVLatinAmerica.ar",Garage TV Latin America https://stream1.sersat.com/hls/garagetv.m3u8 #EXTINF:-1 tvg-id="LapachoTVCanal11.ar",Lapacho TV Canal 11 (720p) diff --git a/streams/co.m3u b/streams/co.m3u index b7a65c6328..5dd8e9d77a 100644 --- a/streams/co.m3u +++ b/streams/co.m3u @@ -162,3 +162,7 @@ https://canalzoom.smoothcloud.co:3027/live/canalzoombr1live.m3u8 http://38.183.182.166:8000/play/a10i/index.m3u8 #EXTINF:-1 tvg-id="NTN24.co@SD",NTN24 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/rcnnoticias/playlist.m3u8 +#EXTINF:-1 tvg-id="RCNMas.co@SD",RCN Mas +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/rcnmas/playlist.m3u8 +#EXTINF:-1 tvg-id="Cosmovision.co@SD",Cosmovision +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119960/cosmovision/playlist.m3u8 diff --git a/streams/do.m3u b/streams/do.m3u index cc98a3db36..059cc3ed67 100644 --- a/streams/do.m3u +++ b/streams/do.m3u @@ -552,3 +552,7 @@ https://ss3.domint.net:3108/zol_str/vzol/playlist.m3u8 https://ds.tvabierta.net/memfs/b295f254-7af9-45e4-bfc6-7e0bba41929d.m3u8 #EXTINF:-1 tvg-id="ZTV.do",ZTV (720p) [Not 24/7] https://lb00zdigital.streamprolive.com/mnt/hls/live.m3u8 +#EXTINF:-1 tvg-id="TelemedioDigitalTV.do",Telemedio Digital TV [Not 24/7] +https://mlb.essastream.com:8081/telemediodigital/tracks-v1a1/mono.m3u8 +#EXTINF:-1 tvg-id="TelenewsTV.do",Telenews TV +https://hilandofinotv.essastream.com:3480/live/telenewscanallive.m3u8 diff --git a/streams/es.m3u b/streams/es.m3u index 3a518f9ee8..9d33eb0876 100644 --- a/streams/es.m3u +++ b/streams/es.m3u @@ -574,3 +574,7 @@ http://176.65.146.237:8401/play/a0a9/index.m3u8 http://176.65.146.237:8401/play/a09r/index.m3u8 #EXTINF:-1 tvg-id="Veo7.es",Veo7 (1080p) http://176.65.146.237:8401/play/a09k/index.m3u8 +#EXTINF:-1 tvg-id="TVG2.es@SD",TVG2 (720p) [Geo-blocked] +https://crtvg-tvg2.flumotion.cloud/playlist.m3u8 +#EXTINF:-1 tvg-id="GaliciaTVEuropa.es@SD",Galicia TV Europa (720p) [Geo-blocked] +https://crtvg-europa.flumotion.cloud/playlist.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index 3b6776a9eb..036db4144c 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -137,8 +137,6 @@ https://v2.siar.us/radartasikmalaya/live/playlist.m3u8 http://122.248.43.138:1935/ch17/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="RajawaliTV.id@SD",Rajawali TV https://rtvstream.rtv.co.id:4555/hls/rtv.m3u8 -#EXTINF:-1 tvg-id="RCTV.id",RCTV (720p) [Not 24/7] -http://122.248.43.138:1935/ch9/myStream/playlist.m3u8 #EXTINF:-1 tvg-id="RCTV.id",RCTV (576p) [Not 24/7] https://v10.siar.us/rctv/live/playlist.m3u8 #EXTINF:-1 tvg-id="RiauTV.id",Riau TV (1080p) [Not 24/7] diff --git a/streams/it.m3u b/streams/it.m3u index 33ddebca33..e98a6c1b80 100644 --- a/streams/it.m3u +++ b/streams/it.m3u @@ -813,3 +813,5 @@ https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/superj/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/infomedianews/playlist.m3u8 #EXTINF:-1 tvg-id="TVSei.it@SD",TV Sei https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/tvsei/playlist.m3u8 +#EXTINF:-1 tvg-id="CanaleItalia.it@SD",Canale Italia +https://uvotv-aniview.global.ssl.fastly.net/10010/live/hls/canaleitaliaextra/playlist.m3u8 diff --git a/streams/mr.m3u b/streams/mr.m3u index 1c7093bd9a..77a407a911 100644 --- a/streams/mr.m3u +++ b/streams/mr.m3u @@ -1,7 +1,23 @@ #EXTM3U #EXTINF:-1 tvg-id="ChinguitTV.mr@SD",Chinguit TV -https://dvrfl06.bozztv.com/astv-chinguit/index.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/chinguittv/playlist.m3u8 #EXTINF:-1 tvg-id="ElMedina.mr@SD",El Medina -https://dvrfl06.bozztv.com/astv-elmedina/index.m3u8 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elmedinatv/playlist.m3u8 #EXTINF:-1 tvg-id="ElOussraTV.mr@SD",El Oussra TV https://dvrfl06.bozztv.com/astv-elousra/index.m3u8 +#EXTINF:-1 tvg-id="Athagavia.mr@SD",Athagavia +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/athagavia/playlist.m3u8 +#EXTINF:-1 tvg-id="DavaTV.mr@SD",Dava TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/davatv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElMahadra.mr@SD",El Mahadra +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elmahadratv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElwataniyaTV.mr@SD",Elwataniya TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elwataniyatv/playlist.m3u8 +#EXTINF:-1 tvg-id="ElmourabitonTV.mr@SD",Elmourabiton TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/elmourabitontv/playlist.m3u8 +#EXTINF:-1 tvg-id="GhimemTV.mr@SD",Ghimem TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/ghimemtv/playlist.m3u8 +#EXTINF:-1 tvg-id="Sahara24.mr@HD",Sahara 24 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/sahara24/playlist.m3u8 +#EXTINF:-1 tvg-id="SahelTV.mr@SD",Sahel TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120682/saheltv/playlist.m3u8 diff --git a/streams/ne.m3u b/streams/ne.m3u index ba06b201db..0ca24a0668 100644 --- a/streams/ne.m3u +++ b/streams/ne.m3u @@ -31,3 +31,5 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/saraounia/playlist. https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/anfani/playlist.m3u8 #EXTINF:-1 tvg-id="TambaraTV.ne",Tambara TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119695/tambara/playlist.m3u8 +#EXTINF:-1 tvg-id="LabariTV.ne@SD",Labari TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119696/labari/playlist.m3u8 diff --git a/streams/pe.m3u b/streams/pe.m3u index e20d0b94e6..1fc3467302 100644 --- a/streams/pe.m3u +++ b/streams/pe.m3u @@ -23,7 +23,7 @@ https://live-evg1.tv360.bitel.com.pe/bitel/cajamarcatv/playlist.m3u8 https://live.obslivestream.com/canal8/index.m3u8 #EXTINF:-1 tvg-id="CanalIPe.pe",Canal IPe (1080p) https://cdnhd.iblups.com/hls/3f2cb1658d114f2693eff18d83199e67.m3u8 -#EXTINF:-1 tvg-id="Conecta2TV.pe@SD" http-referrer="https://conecta2.pe/",Conecta2TV (720p) [Not 24/7] +#EXTINF:-1 tvg-id="Conecta2TV.pe@SD",Conecta2TV (720p) [Not 24/7] https://live.obslivestream.com/conecta2/index.m3u8 #EXTINF:-1 tvg-id="CongresoTV.pe@SD",Congreso TV https://ccstreaming.packet.mx/WebRTCAppEE/streams/45.1_kd5oiNTTWO0gEOFc431277834.m3u8 diff --git a/streams/pl.m3u b/streams/pl.m3u index 4f07a34dd9..cb5b705fba 100644 --- a/streams/pl.m3u +++ b/streams/pl.m3u @@ -120,3 +120,7 @@ https://stream.4fun.tv:8889/hls/4fk_high/index.m3u8 http://185.236.229.62:9981/play/a07c #EXTINF:-1 tvg-id="Nickelodeon.pl",Nickelodeon (576p) http://185.236.229.62:9981/play/a067 +#EXTINF:-1 tvg-id="13Ulica.pl@SD",13 Ulica (1080p) +http://185.236.229.62:9981/play/a03o +#EXTINF:-1 tvg-id="4FunDance.pl@SD",4 Fun Dance (576i) [Not 24/7] +http://185.236.229.62:9981/play/a020 diff --git a/streams/sd.m3u b/streams/sd.m3u index 9905dc74f2..0e1faf789d 100644 --- a/streams/sd.m3u +++ b/streams/sd.m3u @@ -9,3 +9,5 @@ https://hls.dabangasudan.org/hls/stream.m3u8 https://cdn-globecast.akamaized.net/live/eds/sudan_tv/hls_roku/index.m3u8 #EXTINF:-1 tvg-id="SudanEduTV.sd@SD",Sudan Edu TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120913/sudanbasicedu/playlist.m3u8 +#EXTINF:-1 tvg-id="SudanTV.sd@SD",Sudan TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119051/sudantv/playlist.m3u8 diff --git a/streams/sl.m3u b/streams/sl.m3u index fcd718794a..d351aeacbe 100644 --- a/streams/sl.m3u +++ b/streams/sl.m3u @@ -1 +1,3 @@ -#EXTM3U +#EXTM3U +#EXTINF:-1 tvg-id="SLBCTV.sl",SLBC TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120684/slbc/playlist.m3u8 diff --git a/streams/sn.m3u b/streams/sn.m3u index 7054b0669e..27bddcd38c 100644 --- a/streams/sn.m3u +++ b/streams/sn.m3u @@ -71,3 +71,19 @@ https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/rts2/playlist.m3u8 https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/rts1/playlist.m3u8 #EXTINF:-1 tvg-id="SenTV.sn@SD",Sen TV https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120428/sentv/playlist.m3u8 +#EXTINF:-1 tvg-id="RDVTV.sn@SD",RDV TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/rdv/playlist.m3u8 +#EXTINF:-1 tvg-id="2STV.sn@SD",2STV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120429/2stv/playlist.m3u8 +#EXTINF:-1 tvg-id="7TVSenegal.sn@SD",7TV Senegal +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/7tv/playlist.m3u8 +#EXTINF:-1 tvg-id="LeralTV.sn@SD",Leral TV +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/leraltv/playlist.m3u8 +#EXTINF:-1 tvg-id="RadioTeleFulbe.sn@SD",Radio Tele Fulbe +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/telefulbe/playlist.m3u8 +#EXTINF:-1 tvg-id="RTS5.sn@SD",RTS 5 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/rts5/playlist.m3u8 +#EXTINF:-1 tvg-id="RTS3.sn@SD",RTS 3 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/rts3/playlist.m3u8 +#EXTINF:-1 tvg-id="RTS4.sn@SD",RTS 4 +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2120431/rts4/playlist.m3u8 diff --git a/streams/us.m3u b/streams/us.m3u index eaf11f144a..a6b57adc84 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -204,9 +204,9 @@ https://catholictvhd-lh.akamaized.net/hls/live/2043390/CTVLiveHD/master.m3u8 #EXTINF:-1 tvg-id="CBNEspanol.us@SD",CBN Espanol (1080p) https://fastly.live.brightcove.com/6380375173112/us-east-1/734546207001/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiczFpM3ZpLmVncmVzcy50N2M3emwiLCJhY2NvdW50X2lkIjoiNzM0NTQ2MjA3MDAxIiwiZWhuIjoiZmFzdGx5LmxpdmUuYnJpZ2h0Y292ZS5jb20iLCJpc3MiOiJibGl2ZS1wbGF5YmFjay1zb3VyY2UtYXBpIiwic3ViIjoicGF0aG1hcHRva2VuIiwiYXVkIjpbIjczNDU0NjIwNzAwMSJdLCJqdGkiOiI2MzgwMzc1MTczMTEyIn0.6G0g6pn30iXNuqgU65sl3NImj3ORhxGNdhHGja671ck/playlist-hls.m3u8 #EXTINF:-1 tvg-id="CBNFamily.us",CBN Family (1080p) -https://bcovlive-a.akamaihd.net/r602a47f47fee47bb83239eb1b1e1ac83/us-east-1/734546207001/playlist.m3u8 +https://fastly.live.brightcove.com/6380399588112/us-east-1/734546207001/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiczFpM3ZpLmVncmVzcy50N2M3emwiLCJhY2NvdW50X2lkIjoiNzM0NTQ2MjA3MDAxIiwiZWhuIjoiZmFzdGx5LmxpdmUuYnJpZ2h0Y292ZS5jb20iLCJpc3MiOiJibGl2ZS1wbGF5YmFjay1zb3VyY2UtYXBpIiwic3ViIjoicGF0aG1hcHRva2VuIiwiYXVkIjpbIjczNDU0NjIwNzAwMSJdLCJqdGkiOiI2MzgwMzk5NTg4MTEyIn0.LYfIeObmX4AEStY_xCnPZwMJHXgOAPFMTKfztq-9F8U/playlist-hls.m3u8 #EXTINF:-1 tvg-id="CBNNews.us",CBN News National (1080p) -https://bcovlive-a.akamaihd.net/re8d9f611ee4a490a9bb59e52db91414d/us-east-1/734546207001/playlist.m3u8 +https://fastly.live.brightcove.com/6380396819112/us-east-1/734546207001/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJob3N0IjoiczFpM3ZpLmVncmVzcy50N2M3emwiLCJhY2NvdW50X2lkIjoiNzM0NTQ2MjA3MDAxIiwiZWhuIjoiZmFzdGx5LmxpdmUuYnJpZ2h0Y292ZS5jb20iLCJpc3MiOiJibGl2ZS1wbGF5YmFjay1zb3VyY2UtYXBpIiwic3ViIjoicGF0aG1hcHRva2VuIiwiYXVkIjpbIjczNDU0NjIwNzAwMSJdLCJqdGkiOiI2MzgwMzk2ODE5MTEyIn0.GDYp4IWtzwPkupEWeeOavnioVknO-Ev3UGlHvM1rE6I/playlist-hls.m3u8 #EXTINF:-1 tvg-id="CBSSportsGolazoNetwork.us",CBS Sports Golazo Network https://dai.google.com/linear/hls/event/GxrCGmwST0ixsrc_QgB6qw/master.m3u8 #EXTINF:-1 tvg-id="CelebritySceneTV.us",Celebrity Scene TV (720p) @@ -1090,3 +1090,5 @@ http://68.251.105.81:5004/auto/v11.3 http://68.251.105.81:5004/auto/v11.2 #EXTINF:-1 tvg-id="WTTWDT1.us@SD",WTTW-DT1 http://68.251.105.81:5004/auto/v11.1 +#EXTINF:-1 tvg-id="ElMaqar.us@SD",El Maqar +https://uvotv-aniview.global.ssl.fastly.net/hls/live/2119197/elmaqar/playlist.m3u8 diff --git a/streams/ve.m3u b/streams/ve.m3u index a7c6f6b1eb..97468d76b8 100644 --- a/streams/ve.m3u +++ b/streams/ve.m3u @@ -100,10 +100,10 @@ https://streamtv.intervenhosting.net:3698/live/telecentrolive.m3u8 https://cloud.livescast.com:19360/telecolor/telecolor.m3u8 #EXTINF:-1 tvg-id="TelesolTV.ve",Telesol TV (720p) https://vcp15.myplaytv.com/telesoltv/telesoltv/playlist.m3u8 -#EXTINF:-1 tvg-id="Telesur.ve",TeleSUR (1080p) +#EXTINF:-1 tvg-id="Telesur.ve@HD",Telesur HD (1080p) https://mblesmain01.telesur.ultrabase.net/mbliveMain/hd/playlist.m3u8 -#EXTINF:-1 tvg-id="Telesur.ve@English",Telesur English (1080p) [Not 24/7] -https://github.com/BellezaEmporium/IPTV_Exception/raw/master/channels/ve/telesur_eng.m3u8 +#EXTINF:-1 tvg-id="Telesur.ve@EnglishHD",Telesur English HD (1080p) +https://mblenmain01.telesur.ultrabase.net/mblivev3/hd/playlist.m3u8 #EXTINF:-1 tvg-id="",Televen Asia (1080p) https://d39cdj6x0ssnqk.cloudfront.net/out/v1/95fe709c8bde490f92bea36203ec91d2/index.m3u8 #EXTINF:-1 tvg-id="",Televen Europa (1080p) @@ -145,3 +145,7 @@ https://cloud.fastchannel.es/manifiest/hls/prog9/vepacotv.m3u8 https://ott3.streann.com/loadbalancer/services/public/channels/5d23d5882cdce61dae029fd8/playlist.m3u8 #EXTINF:-1 tvg-id="TVMparati.ve",TVM para ti (1080p) https://streamtv.intervenhosting.net:3529/live/tvmparatilive.m3u8 +#EXTINF:-1 tvg-id="Telesur.ve@English",Telesur English (480p) +https://mblenmain01.telesur.ultrabase.net/mblivev3/480p/playlist.m3u8 +#EXTINF:-1 tvg-id="Telesur.ve@SD",Telesur (480p) +https://mblesmain01.telesur.ultrabase.net/mbliveMain/480p/playlist.m3u8 diff --git a/streams/vn.m3u b/streams/vn.m3u index a599328793..536a7bfe27 100644 --- a/streams/vn.m3u +++ b/streams/vn.m3u @@ -147,3 +147,5 @@ http://125hvt.ddns.net:21585/vtv9/tracks-v1a1/mono.m3u8 https://hls.mskycdn.online/tv/vtv9fhd/index.m3u8 #EXTINF:-1 tvg-id="VTVCanTho.vn@HD",VTV Cần Thơ HD (1080p) https://hls.mskycdn.online/tv/vtvctfhd/index.m3u8 +#EXTINF:-1 tvg-id="VTV7.vn@HD",VTV7 HD (1080i) [Not 24/7] +https://live.fptplay53.net/fnxhd1/vtv7hd_vhls.smil/chunklist.m3u8 From b762d0a233813ef193d67152ebe4695a07ad0bb3 Mon Sep 17 00:00:00 2001 From: "iptv-bot[bot]" <84861620+iptv-bot[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 00:12:26 +0000 Subject: [PATCH 51/51] [Bot] Update PLAYLISTS.md Committed by [iptv-bot](https://github.com/apps/iptv-bot) via [update](https://github.com/iptv-org/iptv/actions/runs/18421325457) workflow. --- PLAYLISTS.md | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/PLAYLISTS.md b/PLAYLISTS.md index 0d9a27b235..3654b96149 100644 --- a/PLAYLISTS.md +++ b/PLAYLISTS.md @@ -28,31 +28,31 @@ Same thing, but split up into separate files: Classic45https://iptv-org.github.io/iptv/categories/classic.m3u Comedy84https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking37https://iptv-org.github.io/iptv/categories/cooking.m3u - Culture169https://iptv-org.github.io/iptv/categories/culture.m3u + Culture170https://iptv-org.github.io/iptv/categories/culture.m3u Documentary127https://iptv-org.github.io/iptv/categories/documentary.m3u Education175https://iptv-org.github.io/iptv/categories/education.m3u - Entertainment643https://iptv-org.github.io/iptv/categories/entertainment.m3u + Entertainment644https://iptv-org.github.io/iptv/categories/entertainment.m3u Family54https://iptv-org.github.io/iptv/categories/family.m3u - General2444https://iptv-org.github.io/iptv/categories/general.m3u + General2461https://iptv-org.github.io/iptv/categories/general.m3u Interactive1https://iptv-org.github.io/iptv/categories/interactive.m3u Kids272https://iptv-org.github.io/iptv/categories/kids.m3u Legislative189https://iptv-org.github.io/iptv/categories/legislative.m3u Lifestyle109https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies378https://iptv-org.github.io/iptv/categories/movies.m3u - Music633https://iptv-org.github.io/iptv/categories/music.m3u - News843https://iptv-org.github.io/iptv/categories/news.m3u + Movies379https://iptv-org.github.io/iptv/categories/movies.m3u + Music639https://iptv-org.github.io/iptv/categories/music.m3u + News848https://iptv-org.github.io/iptv/categories/news.m3u Outdoor43https://iptv-org.github.io/iptv/categories/outdoor.m3u - Public29https://iptv-org.github.io/iptv/categories/public.m3u + Public30https://iptv-org.github.io/iptv/categories/public.m3u Relax3https://iptv-org.github.io/iptv/categories/relax.m3u - Religious723https://iptv-org.github.io/iptv/categories/religious.m3u + Religious725https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u - Series265https://iptv-org.github.io/iptv/categories/series.m3u + Series266https://iptv-org.github.io/iptv/categories/series.m3u Shop89https://iptv-org.github.io/iptv/categories/shop.m3u Sports305https://iptv-org.github.io/iptv/categories/sports.m3u Travel42https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX0https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined3703https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined3696https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -86,7 +86,7 @@ Same thing, but split up into separate files: Algerian Sign Language1https://iptv-org.github.io/iptv/languages/asp.m3u Alur1https://iptv-org.github.io/iptv/languages/alz.m3u Amharic8https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic445https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic454https://iptv-org.github.io/iptv/languages/ara.m3u Armenian7https://iptv-org.github.io/iptv/languages/hye.m3u Assamese9https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -125,7 +125,7 @@ Same thing, but split up into separate files: Dutch181https://iptv-org.github.io/iptv/languages/nld.m3u Dyula2https://iptv-org.github.io/iptv/languages/dyu.m3u Egyptian Arabic1https://iptv-org.github.io/iptv/languages/arz.m3u - English2412https://iptv-org.github.io/iptv/languages/eng.m3u + English2414https://iptv-org.github.io/iptv/languages/eng.m3u Estonian9https://iptv-org.github.io/iptv/languages/est.m3u Ewe2https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese3https://iptv-org.github.io/iptv/languages/fao.m3u @@ -133,9 +133,10 @@ Same thing, but split up into separate files: Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u Finnish16https://iptv-org.github.io/iptv/languages/fin.m3u Fon3https://iptv-org.github.io/iptv/languages/fon.m3u - French522https://iptv-org.github.io/iptv/languages/fra.m3u + French532https://iptv-org.github.io/iptv/languages/fra.m3u Fulah3https://iptv-org.github.io/iptv/languages/ful.m3u Gaelic2https://iptv-org.github.io/iptv/languages/gla.m3u + Galician2https://iptv-org.github.io/iptv/languages/glg.m3u Ganda12https://iptv-org.github.io/iptv/languages/lug.m3u Gen1https://iptv-org.github.io/iptv/languages/gej.m3u Georgian22https://iptv-org.github.io/iptv/languages/kat.m3u @@ -197,6 +198,7 @@ Same thing, but split up into separate files: Malayalam83https://iptv-org.github.io/iptv/languages/mal.m3u Maltese5https://iptv-org.github.io/iptv/languages/mlt.m3u Mandarin Chinese6https://iptv-org.github.io/iptv/languages/cmn.m3u + Manding2https://iptv-org.github.io/iptv/languages/man.m3u Mandinka3https://iptv-org.github.io/iptv/languages/mnk.m3u Maori2https://iptv-org.github.io/iptv/languages/mri.m3u Marathi21https://iptv-org.github.io/iptv/languages/mar.m3u @@ -221,10 +223,11 @@ Same thing, but split up into separate files: Panjabi30https://iptv-org.github.io/iptv/languages/pan.m3u Papiamento17https://iptv-org.github.io/iptv/languages/pap.m3u Pashto28https://iptv-org.github.io/iptv/languages/pus.m3u - Persian226https://iptv-org.github.io/iptv/languages/fas.m3u - Polish68https://iptv-org.github.io/iptv/languages/pol.m3u + Persian225https://iptv-org.github.io/iptv/languages/fas.m3u + Polish70https://iptv-org.github.io/iptv/languages/pol.m3u Portuguese255https://iptv-org.github.io/iptv/languages/por.m3u - Pulaar4https://iptv-org.github.io/iptv/languages/fuc.m3u + Pulaar6https://iptv-org.github.io/iptv/languages/fuc.m3u + Pular1https://iptv-org.github.io/iptv/languages/fuf.m3u Quechua1https://iptv-org.github.io/iptv/languages/que.m3u Romanian98https://iptv-org.github.io/iptv/languages/ron.m3u Rundi2https://iptv-org.github.io/iptv/languages/run.m3u @@ -240,10 +243,11 @@ Same thing, but split up into separate files: Slovak47https://iptv-org.github.io/iptv/languages/slk.m3u Slovenian13https://iptv-org.github.io/iptv/languages/slv.m3u Somali17https://iptv-org.github.io/iptv/languages/som.m3u + Soninke2https://iptv-org.github.io/iptv/languages/snk.m3u South African Sign Language1https://iptv-org.github.io/iptv/languages/sfs.m3u South Ndebele1https://iptv-org.github.io/iptv/languages/nbl.m3u Southern Samo1https://iptv-org.github.io/iptv/languages/sbd.m3u - Spanish1748https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1752https://iptv-org.github.io/iptv/languages/spa.m3u Standard Arabic1https://iptv-org.github.io/iptv/languages/arb.m3u Swahili38https://iptv-org.github.io/iptv/languages/swa.m3u Swati1https://iptv-org.github.io/iptv/languages/ssw.m3u @@ -278,7 +282,7 @@ Same thing, but split up into separate files: Welsh1https://iptv-org.github.io/iptv/languages/cym.m3u Western Frisian1https://iptv-org.github.io/iptv/languages/fry.m3u Western Niger Fulfulde4https://iptv-org.github.io/iptv/languages/fuh.m3u - Wolof11https://iptv-org.github.io/iptv/languages/wol.m3u + Wolof16https://iptv-org.github.io/iptv/languages/wol.m3u Xhosa1https://iptv-org.github.io/iptv/languages/xho.m3u Yakut1https://iptv-org.github.io/iptv/languages/sah.m3u Yoruba2https://iptv-org.github.io/iptv/languages/yor.m3u @@ -286,7 +290,7 @@ Same thing, but split up into separate files: Yue Chinese5https://iptv-org.github.io/iptv/languages/yue.m3u Zarma4https://iptv-org.github.io/iptv/languages/dje.m3u Zulu1https://iptv-org.github.io/iptv/languages/zul.m3u - Undefined2178https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined2176https://iptv-org.github.io/iptv/languages/undefined.m3u @@ -732,6 +736,7 @@ Same thing, but split up into separate files: - 🇲🇹 Malta https://iptv-org.github.io/iptv/countries/mt.m3u - 🇲🇶 Martinique https://iptv-org.github.io/iptv/countries/mq.m3u - 🇲🇷 Mauritania https://iptv-org.github.io/iptv/countries/mr.m3u + - West Nouakchott https://iptv-org.github.io/iptv/subdivisions/mr-13.m3u - 🇲🇺 Mauritius https://iptv-org.github.io/iptv/countries/mu.m3u - 🇲🇽 Mexico https://iptv-org.github.io/iptv/countries/mx.m3u - Baja California https://iptv-org.github.io/iptv/subdivisions/mx-bcn.m3u @@ -862,6 +867,7 @@ Same thing, but split up into separate files: - 🇸🇦 Saudi Arabia https://iptv-org.github.io/iptv/countries/sa.m3u - 🇸🇳 Senegal https://iptv-org.github.io/iptv/countries/sn.m3u - 🇷🇸 Serbia https://iptv-org.github.io/iptv/countries/rs.m3u +- 🇸🇱 Sierra Leone https://iptv-org.github.io/iptv/countries/sl.m3u - 🇸🇬 Singapore https://iptv-org.github.io/iptv/countries/sg.m3u - 🇸🇽 Sint Maarten https://iptv-org.github.io/iptv/countries/sx.m3u - 🇸🇰 Slovakia https://iptv-org.github.io/iptv/countries/sk.m3u @@ -895,6 +901,8 @@ Same thing, but split up into separate files: - Ulsan-gwangyeoksi https://iptv-org.github.io/iptv/subdivisions/kr-31.m3u - Ulsan https://iptv-org.github.io/iptv/cities/krusn.m3u - 🇪🇸 Spain https://iptv-org.github.io/iptv/countries/es.m3u + - A Coruña https://iptv-org.github.io/iptv/subdivisions/es-c.m3u + - Santiago de Compostela https://iptv-org.github.io/iptv/cities/esscq.m3u - Andalucía https://iptv-org.github.io/iptv/subdivisions/es-an.m3u - Aragón https://iptv-org.github.io/iptv/subdivisions/es-ar.m3u - Barcelona https://iptv-org.github.io/iptv/subdivisions/es-b.m3u