diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2528e57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +ENV/ +env/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Testing +.pytest_cache/ +.coverage +htmlcov/ + +# Data files (cache) +/data/ +*.log diff --git a/Stream-Mapparr/AU_channels.json b/Stream-Mapparr/AU_channels.json new file mode 100644 index 0000000..72b81ca --- /dev/null +++ b/Stream-Mapparr/AU_channels.json @@ -0,0 +1,257 @@ +{ + "country_code": "AU", + "country_name": "Australia", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "ABC TV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC TV Plus", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC Family", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ABC Kids", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC Entertains", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC Me", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "ABC News", + "category": "News", + "type": "National" + }, + { + "channel_name": "SBS", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS Viceland", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS World Movies", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "SBS Food", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "NITV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBS WorldWatch", + "category": "News", + "type": "National" + }, + { + "channel_name": "Seven", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7 Sydney", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "7 Melbourne", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "7two", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7mate", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7flix", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "7Bravo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nine", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9 Sydney", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "9 Melbourne", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "9Gem", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9Go!", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "9Life", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "9Rush", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Network 10", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Peach", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Bold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "10 Shake", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Fox Sports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Sports News", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Cricket", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox League", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Fox Footy", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "beIN Sports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky News Australia", + "category": "News", + "type": "National" + }, + { + "channel_name": "Racing.com", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Lifestyle", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Arena", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Discovery", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BBC Earth", + "category": "Documentary", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/BR_channels.json b/Stream-Mapparr/BR_channels.json new file mode 100644 index 0000000..93ca1d3 --- /dev/null +++ b/Stream-Mapparr/BR_channels.json @@ -0,0 +1,242 @@ +{ + "country_code": "BR", + "country_name": "Brazil", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Globo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TV Globo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Record", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RecordTV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "SBT", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Band", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Rede Bandeirantes", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RedeTV!", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TV Cultura", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TV Brasil", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "GloboNews", + "category": "News", + "type": "National" + }, + { + "channel_name": "CNN Brasil", + "category": "News", + "type": "National" + }, + { + "channel_name": "Record News", + "category": "News", + "type": "National" + }, + { + "channel_name": "BandNews TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "Jovem Pan News", + "category": "News", + "type": "National" + }, + { + "channel_name": "SporTV", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "SporTV 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "SporTV 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "ESPN 4", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "BandSports", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Premiere", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Combate", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Multishow", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "GNT", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Viva", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Canal Brasil", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Futura", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Telecine Premium", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Action", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Pipoca", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Fun", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Telecine Cult", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Gloob", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Gloobinho", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Cartoon Network", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Discovery Kids", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Nickelodeon", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Nick Jr.", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Disney Channel", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Discovery Channel", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "National Geographic", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Arte 1", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Terra Viva", + "category": "Lifestyle", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/DE_channels.json b/Stream-Mapparr/DE_channels.json new file mode 100644 index 0000000..747d0a7 --- /dev/null +++ b/Stream-Mapparr/DE_channels.json @@ -0,0 +1,252 @@ +{ + "country_code": "DE", + "country_name": "Germany", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Das Erste", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ARD", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDF", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Arte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "3sat", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "KiKA", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Phoenix", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Tagesschau24", + "category": "News", + "type": "National" + }, + { + "channel_name": "One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDFneo", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ZDFinfo", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "hr-fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "MDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "NDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Radio Bremen TV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "rbb Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "SR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "SWR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "WDR Fernsehen", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "RTL", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTL Zwei", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTLZWEI", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Vox", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Super RTL", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "n-tv", + "category": "News", + "type": "National" + }, + { + "channel_name": "Nitro", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RTLup", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "VOXup", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ProSieben", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sat.1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Kabel Eins", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sixx", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ProSieben Maxx", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sat.1 Gold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Kabel Eins Doku", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Welt", + "category": "News", + "type": "National" + }, + { + "channel_name": "N24", + "category": "News", + "type": "National" + }, + { + "channel_name": "Sport1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Bundesliga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sport DE", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Disney Channel", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Comedy Central", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "DMAX", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TLC", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Tele 5", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Servus TV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Deluxe Music", + "category": "Music", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/ES_channels.json b/Stream-Mapparr/ES_channels.json new file mode 100644 index 0000000..940efb4 --- /dev/null +++ b/Stream-Mapparr/ES_channels.json @@ -0,0 +1,187 @@ +{ + "country_code": "ES", + "country_name": "Spain", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "La 1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TVE La 1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "La 2", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TVE La 2", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "24h", + "category": "News", + "type": "National" + }, + { + "channel_name": "TVE 24h", + "category": "News", + "type": "National" + }, + { + "channel_name": "Teledeporte", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TDP", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Clan", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Antena 3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "laSexta", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Neox", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nova", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Mega", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Atreseries", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Telecinco", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Cuatro", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "FDF", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Boing", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "Divinity", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Energy", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Be Mad", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "DMAX", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Paramount Network", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "Trece", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Real Madrid TV", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TV3", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Canal Sur", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ETB 1", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ETB 2", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "TVG", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Telemadrid", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Movistar LaLiga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Movistar Liga de Campeones", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "DAZN LaLiga", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "DAZN 1", + "category": "Sports", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/FR_channels.json b/Stream-Mapparr/FR_channels.json new file mode 100644 index 0000000..3d38809 --- /dev/null +++ b/Stream-Mapparr/FR_channels.json @@ -0,0 +1,202 @@ +{ + "country_code": "FR", + "country_name": "France", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "TF1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 3 Paris", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "France 3 Lyon", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Canal+", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "France 5", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "M6", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Arte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "C8", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "W9", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TMC", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "TFX", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "NRJ 12", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "LCP", + "category": "News", + "type": "National" + }, + { + "channel_name": "France 4", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "BFMTV", + "category": "News", + "type": "National" + }, + { + "channel_name": "CNews", + "category": "News", + "type": "National" + }, + { + "channel_name": "CStar", + "category": "Music", + "type": "National" + }, + { + "channel_name": "Gulli", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "TF1 Séries Films", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "L'Équipe", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "6ter", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "RMC Story", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "RMC Découverte", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Chérie 25", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "LCI", + "category": "News", + "type": "National" + }, + { + "channel_name": "Franceinfo", + "category": "News", + "type": "National" + }, + { + "channel_name": "France 24", + "category": "News", + "type": "National" + }, + { + "channel_name": "Euronews", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal+ Sport", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Canal+ Cinéma", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "beIN Sports 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "beIN Sports 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "RMC Sport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "RMC Sport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TV5 Monde", + "category": "Entertainment", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/MX_channels.json b/Stream-Mapparr/MX_channels.json new file mode 100644 index 0000000..80ab5b8 --- /dev/null +++ b/Stream-Mapparr/MX_channels.json @@ -0,0 +1,132 @@ +{ + "country_code": "MX", + "country_name": "Mexico", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "Las Estrellas", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Canal 5", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nueve", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Nu9ve", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "N+ Foro", + "category": "News", + "type": "National" + }, + { + "channel_name": "Foro TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "TUDN", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Azteca Uno", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Azteca 7", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ADN 40", + "category": "News", + "type": "National" + }, + { + "channel_name": "adn Noticias", + "category": "News", + "type": "National" + }, + { + "channel_name": "a+", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "A Más", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Imagen Televisión", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Excélsior TV", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal Once", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal 22", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal Catorce", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "TV UNAM", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Canal del Congreso", + "category": "News", + "type": "National" + }, + { + "channel_name": "Canal 6", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Multimedios", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "Distrito Comedia", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Tlnovelas", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "De Película", + "category": "Movies", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/UK_channels.json b/Stream-Mapparr/UK_channels.json new file mode 100644 index 0000000..aed94e6 --- /dev/null +++ b/Stream-Mapparr/UK_channels.json @@ -0,0 +1,347 @@ +{ + "country_code": "UK", + "country_name": "United Kingdom", + "version": "2025-11-10", + "channels": [ + { + "channel_name": "BBC One", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC One London", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One Scotland", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One Wales", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC One NI", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "BBC Two", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC Three", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "BBC Four", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "BBC4", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "CBBC", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "CBeebies", + "category": "Kids", + "type": "National" + }, + { + "channel_name": "BBC News", + "category": "News", + "type": "National" + }, + { + "channel_name": "BBC Parliament", + "category": "News", + "type": "National" + }, + { + "channel_name": "BBC Alba", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "S4C", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV1", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV1 London", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV1 Granada", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV1 Wales", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "STV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "UTV", + "category": "Entertainment", + "type": "Regional" + }, + { + "channel_name": "ITV2", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV3", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITV4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "ITVBe", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Channel 4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "E4", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "More4", + "category": "Lifestyle", + "type": "National" + }, + { + "channel_name": "Film4", + "category": "Movies", + "type": "National" + }, + { + "channel_name": "4seven", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Channel 5", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5STAR", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5USA", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5Action", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "5Select", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Showcase", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Max", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Atlantic", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Witness", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Comedy", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky Documentaries", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky History", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky Nature", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Sky Arts", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Sky News", + "category": "News", + "type": "National" + }, + { + "channel_name": "Sky Sports Main Event", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Premier League", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Football", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Cricket", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports F1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Sky Sports Golf", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "TNT Sports 3", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 1", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Eurosport 2", + "category": "Sports", + "type": "National" + }, + { + "channel_name": "Dave", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Gold", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "W", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Alibi", + "category": "Entertainment", + "type": "National" + }, + { + "channel_name": "Yesterday", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "Eden", + "category": "Documentary", + "type": "National" + }, + { + "channel_name": "GB News", + "category": "News", + "type": "National" + }, + { + "channel_name": "Talk", + "category": "News", + "type": "National" + } + ] +} \ No newline at end of file diff --git a/Stream-Mapparr/__pycache__/plugin.cpython-311.pyc b/Stream-Mapparr/__pycache__/plugin.cpython-311.pyc deleted file mode 100644 index 0b8b908..0000000 Binary files a/Stream-Mapparr/__pycache__/plugin.cpython-311.pyc and /dev/null differ diff --git a/Stream-Mapparr/plugin.py b/Stream-Mapparr/plugin.py index 94d21e8..57a92e4 100644 --- a/Stream-Mapparr/plugin.py +++ b/Stream-Mapparr/plugin.py @@ -9,7 +9,9 @@ import csv import os import re import requests -from datetime import datetime +import urllib.request +import urllib.error +from datetime import datetime, timedelta from django.utils import timezone # Django model imports @@ -37,8 +39,20 @@ class Plugin: @property def fields(self): """Dynamically generate settings fields including channel database selection.""" + # Check for version updates (with caching) + version_info = {'message': f"Current version: {self.version}", 'status': 'unknown'} + try: + version_info = self._check_version_update() + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error checking version update: {e}") + # Static fields that are always present static_fields = [ + { + "id": "version_status", + "type": "info", + "label": version_info['message'], + }, { "id": "overwrite_streams", "label": "🔄 Overwrite Existing Streams", @@ -240,6 +254,7 @@ class Plugin: def __init__(self): self.processed_data_file = "/data/stream_mapparr_processed.json" + self.version_check_cache_file = "/data/stream_mapparr_version_check.json" self.loaded_channels = [] self.loaded_streams = [] self.channel_stream_matches = [] @@ -247,6 +262,158 @@ class Plugin: LOGGER.info(f"[Stream-Mapparr] {self.name} Plugin v{self.version} initialized") + def _get_latest_version(self, owner, repo): + """ + Fetches the latest release tag name from GitHub using only Python's standard library. + + Args: + owner (str): GitHub repository owner + repo (str): GitHub repository name + + Returns: + str: Latest version tag or error message + """ + url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" + + # Add a user-agent to avoid potential 403 Forbidden errors + headers = { + 'User-Agent': 'Dispatcharr-Plugin-Version-Checker' + } + + try: + # Create a request object with headers + req = urllib.request.Request(url, headers=headers) + + # Make the request and open the URL with a timeout + with urllib.request.urlopen(req, timeout=5) as response: + # Read the response and decode it as UTF-8 + data = response.read().decode('utf-8') + + # Parse the JSON string + json_data = json.loads(data) + + # Get the tag name + latest_version = json_data.get("tag_name") + + if latest_version: + return latest_version + else: + return None + + except urllib.error.HTTPError as http_err: + if http_err.code == 404: + LOGGER.debug(f"[Stream-Mapparr] GitHub repo not found or has no releases: {http_err}") + return None + else: + LOGGER.debug(f"[Stream-Mapparr] HTTP error checking version: {http_err.code}") + return None + except Exception as e: + # Catch other errors like timeouts + LOGGER.debug(f"[Stream-Mapparr] Error checking version: {str(e)}") + return None + + def _check_version_update(self): + """ + Check if a new version is available on GitHub. + Uses caching to limit checks to once per day or when the plugin version changes. + + Returns: + dict: Contains 'message' and 'status' keys for display + """ + current_version = self.version + github_owner = "PiratesIRC" + github_repo = "Stream-Mapparr" + + # Default response + result = { + 'message': f"Current version: {current_version}", + 'status': 'unknown' + } + + try: + # Load cache if it exists + cache_data = {} + should_check = True + + if os.path.exists(self.version_check_cache_file): + try: + with open(self.version_check_cache_file, 'r', encoding='utf-8') as f: + cache_data = json.load(f) + + # Check if we need to recheck: + # 1. Plugin version changed (upgrade/downgrade) + # 2. More than 24 hours since last check + cached_plugin_version = cache_data.get('plugin_version') + last_check_str = cache_data.get('last_check') + + if cached_plugin_version == current_version and last_check_str: + # Parse the last check time + last_check = datetime.fromisoformat(last_check_str) + time_diff = datetime.now() - last_check + + # If less than 24 hours, use cached data + if time_diff < timedelta(hours=24): + should_check = False + latest_version = cache_data.get('latest_version') + + # Compare versions + if latest_version and latest_version != current_version: + result = { + 'message': f"🎉 Update available! Current: {current_version} → Latest: {latest_version}", + 'status': 'update_available' + } + else: + result = { + 'message': f"✅ You are up to date (v{current_version})", + 'status': 'up_to_date' + } + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error reading version cache: {e}") + should_check = True + + # Perform the check if needed + if should_check: + latest_version = self._get_latest_version(github_owner, github_repo) + + # Update cache + cache_data = { + 'plugin_version': current_version, + 'latest_version': latest_version, + 'last_check': datetime.now().isoformat() + } + + try: + with open(self.version_check_cache_file, 'w', encoding='utf-8') as f: + json.dump(cache_data, f, indent=2) + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error writing version cache: {e}") + + # Compare versions + if latest_version and latest_version != current_version: + result = { + 'message': f"🎉 Update available! Current: {current_version} → Latest: {latest_version}", + 'status': 'update_available' + } + elif latest_version: + result = { + 'message': f"✅ You are up to date (v{current_version})", + 'status': 'up_to_date' + } + else: + result = { + 'message': f"Current version: {current_version} (unable to check for updates)", + 'status': 'error' + } + + except Exception as e: + LOGGER.debug(f"[Stream-Mapparr] Error in version check: {e}") + result = { + 'message': f"Current version: {current_version} (update check failed)", + 'status': 'error' + } + + return result + def _get_channel_databases(self): """ Scan for channel database files and return metadata for each.