From 41b9f2d8bd6b9772fa4a4deffd93f98e2fc1e5e4 Mon Sep 17 00:00:00 2001 From: IPTV Playlist Bot Date: Fri, 27 Jun 2025 21:44:32 +0000 Subject: [PATCH] Updated playlist: 0 0 channels --- playlist.m3u | 58 -- playlist_update.log | 165 +---- .../channel_processor.cpython-311.pyc | Bin 0 -> 25431 bytes .../config_manager.cpython-311.pyc | Bin 0 -> 14135 bytes .../__pycache__/file_manager.cpython-311.pyc | Bin 0 -> 9155 bytes .../health_checker.cpython-311.pyc | Bin 0 -> 6333 bytes .../playlist_builder.cpython-311.pyc | Bin 0 -> 6189 bytes .../report_generator.cpython-311.pyc | Bin 0 -> 10080 bytes scripts/config/group_overrides.json | 4 + scripts/config/patterns.json | 600 ++++++++++++++++++ scripts/config/settings.json | 16 + .../playlist_report_20250627_214430.md | 16 + 12 files changed, 644 insertions(+), 215 deletions(-) create mode 100644 scripts/__pycache__/channel_processor.cpython-311.pyc create mode 100644 scripts/__pycache__/config_manager.cpython-311.pyc create mode 100644 scripts/__pycache__/file_manager.cpython-311.pyc create mode 100644 scripts/__pycache__/health_checker.cpython-311.pyc create mode 100644 scripts/__pycache__/playlist_builder.cpython-311.pyc create mode 100644 scripts/__pycache__/report_generator.cpython-311.pyc create mode 100644 scripts/config/group_overrides.json create mode 100644 scripts/config/patterns.json create mode 100644 scripts/config/settings.json create mode 100644 scripts/reports/playlist_report_20250627_214430.md diff --git a/playlist.m3u b/playlist.m3u index d307ada..fcd7187 100644 --- a/playlist.m3u +++ b/playlist.m3u @@ -1,59 +1 @@ #EXTM3U -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="Movies" tvg-name="PL | HBO2 HD",PL | HBO2 HD -http://185.236.229.62:9981/play/a05x -#EXTINF:-1 tvg-id="SkySpMainEvHD.uk" tvg-logo="https://i.ibb.co/gwCk7Bc/sky-m-event-uhd.png" group-title="Sports" tvg-name="UK: Sky Sports Main Event UHD",UK: Sky Sports Main Event UHD -https://a1xs.vip/2000015 -#EXTINF:-1 tvg-id="BBC.One.Lon.HD.uk" tvg-logo="https://raw.githubusercontent.com/tv-logo/tv-logos/main/countries/united-kingdom/bbc-one-uk.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="BBC One",BBC One -http://31.121.110.30:4000/play/a002/index.m3u8 -#EXTINF:-1 tvg-id="BBC.Two.HD.uk" tvg-logo="https://raw.githubusercontent.com/tv-logo/tv-logos/main/countries/united-kingdom/bbc-two-uk.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="BBC Two",BBC Two -http://31.121.110.30:4000/play/a003/index.m3u8 -#EXTINF:-1 tvg-id="ITV1.HD.uk" tvg-logo="https://raw.githubusercontent.com/tv-logo/tv-logos/main/countries/united-kingdom/itv-1-uk.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="ITV 1",ITV 1 -http://31.121.110.30:4000/play/a004/index.m3u8 -#EXTINF:-1 tvg-id="SkySp.Mix.HD.uk" tvg-logo="https://i.ibb.co/7kYj5gc/sky-mix.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="Sky Sports Mix FHD",Sky Sports Mix FHD -https://a1xs.vip/2000008 -#EXTINF:-1 tvg-id="SkySp.F1.uk" tvg-logo="https://i.imgur.com/aetKPNi.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="UK: Sky Sports F1 UHD",UK: Sky Sports F1 UHD -https://a1xs.vip/2000016 -#EXTINF:-1 tvg-id="TNT.Sports.Ultimate.uk" tvg-logo="https://i.ibb.co/QqGdJnM/TNTSprts-U.png" group-title="๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" tvg-name="UK: TNT Sports Ultimate UHD [4K]",UK: TNT Sports Ultimate UHD [4K] -https://a1xs.vip/2000031 -#EXTINF:-1 tvg-id="Astro.Sports.UHD.my" tvg-logo="https://i.ibb.co/3hW45Pb/Astro-Sports-UHD.png group-title=" group-title="๐Ÿ‡ฒ๐Ÿ‡พ Malaysia" tvg-name="MY: Astro Sports UHD [4K]",MY: Astro Sports UHD [4K] -https://a1xs.vip/9000001#EXTINF:-1 group-title="Poland",PL | Golf Channel -#EXTINF:-1 tvg-id="Astro.Sports.UHD.my" tvg-logo="https://i.ibb.co/3hW45Pb/Astro-Sports-UHD.png group-title=" group-title="๐Ÿ‡ฒ๐Ÿ‡พ Malaysia" tvg-name="MY: Astro Sports UHD [4K]",MY: Astro Sports UHD [4K] -https://a1xs.vip/9000001 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡ต๐Ÿ‡ฑ Poland" tvg-name="PL | Golf Channel",PL | Golf Channel -http://185.236.229.62:9981/play/a03m -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡ต๐Ÿ‡ฑ Poland" tvg-name="PL | HBO HD",PL | HBO HD -http://185.236.229.62:9981/play/a06k -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡ต๐Ÿ‡ฑ Poland" tvg-name="PL | HBO2 HD",PL | HBO2 HD -http://185.236.229.62:9981/play/a05x#EXTINF:-1 group-title="Turkey",TR | TV 8.5 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡น๐Ÿ‡ท Turkey" tvg-name="TR | TV 8.5",TR | TV 8.5 -http://live-tv.uk:8080/live/Crach_Iptv/Hekxbjelsofjur628264772new/735.ts -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Continent-E",UA | Continent-E -http://95.67.12.82:9083/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Detinets",UA | Detinets -http://193.151.107.120:8991/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Dorama",UA | Dorama -http://95.67.12.82:9046/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | FreeDom",UA | FreeDom -http://95.67.12.84:10304/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | KinoKazka",UA | KinoKazka -http://95.67.12.82:9084/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | One Planet",UA | One Planet -http://95.67.12.82:9088/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | PlusPlus",UA | PlusPlus -http://proxpanel.pro/play/live.php?mac=00:1A:79:D1:04:17&stream=630128&extension=ts&play_token=0 -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Preshyi",UA | Preshyi -http://193.151.107.120:10001/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Rozpakuy TV",UA | Rozpakuy TV -http://109.108.92.149:63182/ -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Suspline Kultura",UA | Suspline Kultura -http://zadyma.online:8880/play/live.php?mac=00:1A:79:01:7F:7E&stream=436343&extension=ts -#EXTINF:-1 tvg-id="" tvg-logo="" group-title="๐Ÿ‡บ๐Ÿ‡ฆ Ukraine" tvg-name="UA | Yedyni novyny",UA | Yedyni novyny -http://95.67.12.89:9018/ -#EXTINF:-1 tvg-id="MSG.(Madison.Square.Gardens).us" tvg-logo="https://i.postimg.cc/W1jFdzt4/MSG-Network-logo.png" group-title="๐Ÿ‡บ๐Ÿ‡ธ United States" tvg-name="MSG FHD",MSG FHD -https://a1xs.vip/4000001 -#EXTINF:-1 tvg-id="MSG.Plus.us" tvg-logo="https://i.postimg.cc/W1jFdzt4/MSG-Network-logo.png" group-title="๐Ÿ‡บ๐Ÿ‡ธ United States" tvg-name="MSG_PLUS FHD",MSG_PLUS FHD -https://a1xs.vip/4000002#EXTINF:-1 tvg-id="SkySpMainEvHD.uk" tvg-name="UK: Sky Sports Main Event UHD" tvg-logo="https://i.ibb.co/gwCk7Bc/sky-m-event-uhd.png" group-title="UHD | 4K",UK: Sky Sports Main Event UHD -#EXTINF:-1 tvg-id="MSG.Plus.us" tvg-logo="https://i.postimg.cc/W1jFdzt4/MSG-Network-logo.png" group-title="๐Ÿ‡บ๐Ÿ‡ธ United States" tvg-name="MSG_PLUS FHD",MSG_PLUS FHD -https://a1xs.vip/4000002 -#EXTINF:-1 tvg-id="New.England.Sports.Network.HDTV.(NESNHD).us" tvg-logo="https://i.postimg.cc/CxVDbJrS/nesn.png" group-title="๐Ÿ‡บ๐Ÿ‡ธ United States" tvg-name="NESN UHD [4K]",NESN UHD [4K] -https://a1xs.vip/4000080 diff --git a/playlist_update.log b/playlist_update.log index 5cb6a97..6a0064b 100644 --- a/playlist_update.log +++ b/playlist_update.log @@ -1,157 +1,8 @@ -[2025-06-27 18:01:15] INFO: Starting comprehensive playlist generation... -[2025-06-27 18:01:15] INFO: FORCE re-detecting countries for ALL existing channels... -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'Sky Sports Mix FHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: Sky Sports Mix FHD (matched: 'sky') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'NESN UHD [4K]' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: NESN UHD [4K] (matched: '.us') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MSG FHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: MSG FHD (matched: '.us') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MSG_PLUS FHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: MSG_PLUS FHD (matched: '.us') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UK: Sky Sports F1 UHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: UK: Sky Sports F1 UHD (matched prefix: 'uk:') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UK: TNT Sports Ultimate UHD [4K]' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: UK: TNT Sports Ultimate UHD [4K] (matched prefix: 'uk:') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MY: Astro Sports UHD [4K]' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia for: MY: Astro Sports UHD [4K] (matched prefix: 'my:') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'PL | HBO HD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ต๐Ÿ‡ฑ Poland for: PL | HBO HD (matched prefix: 'pl |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'PL | HBO2 HD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ต๐Ÿ‡ฑ Poland for: PL | HBO2 HD (matched prefix: 'pl |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Preshyi' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Preshyi (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Suspline Kultura' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Suspline Kultura (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | PlusPlus' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | PlusPlus (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Detinets' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Detinets (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | One Planet' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | One Planet (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Rozpakuy TV' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Rozpakuy TV (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | FreeDom' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | FreeDom (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Dorama' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Dorama (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | KinoKazka' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | KinoKazka (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Continent-E' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Continent-E (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Yedyni novyny' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Yedyni novyny (matched prefix: 'ua |') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'BBC One' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: BBC One (matched: 'bbc') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'BBC Two' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: BBC Two (matched: 'bbc') -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'ITV 1' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: ITV 1 (matched: 'itv') -[2025-06-27 18:01:15] INFO: Created backup: channels.txt.backup.20250627_180115 -[2025-06-27 18:01:15] INFO: FORCE updated ALL 23 channels (0 changes made) -[2025-06-27 18:01:15] INFO: Processing bulk_import.m3u with ROBUST parsing... -[2025-06-27 18:01:15] INFO: Pre-processing M3U content to fix common issues... -[2025-06-27 18:01:15] INFO: Processing 53 lines after pre-processing... -[2025-06-27 18:01:15] DEBUG: Successfully imported: Sky Sports Mix FHD โ†’ Sports -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'NESN UHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: NESN UHD (matched: '.us') -[2025-06-27 18:01:15] INFO: Auto-detected: 'NESN UHD' โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Successfully imported: NESN UHD [4K] โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MSG FHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: MSG FHD (matched: '.us') -[2025-06-27 18:01:15] INFO: Auto-detected: 'MSG FHD' โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Successfully imported: MSG FHD โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MSG_PLUS FHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ธ United States for: MSG_PLUS FHD (matched: '.us') -[2025-06-27 18:01:15] INFO: Auto-detected: 'MSG_PLUS FHD' โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Successfully imported: MSG_PLUS FHD โ†’ ๐Ÿ‡บ๐Ÿ‡ธ United States -[2025-06-27 18:01:15] DEBUG: Successfully imported: UK: Sky Sports Main Event UHD โ†’ Sports -[2025-06-27 18:01:15] DEBUG: Successfully imported: UK: Sky Sports F1 UHD โ†’ Sports -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UK: TNT Sports Ultimate UHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: UK: TNT Sports Ultimate UHD (matched prefix: 'uk:') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UK: TNT Sports Ultimate UHD' โ†’ ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -[2025-06-27 18:01:15] DEBUG: Successfully imported: UK: TNT Sports Ultimate UHD [4K] โ†’ ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'MY: Astro Sports UHD' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia for: MY: Astro Sports UHD (matched prefix: 'my:') -[2025-06-27 18:01:15] INFO: Auto-detected: 'MY: Astro Sports UHD' โ†’ ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia -[2025-06-27 18:01:15] DEBUG: Successfully imported: MY: Astro Sports UHD [4K] โ†’ ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'PL | Golf Channel' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ต๐Ÿ‡ฑ Poland for: PL | Golf Channel (matched prefix: 'pl |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'PL | Golf Channel' โ†’ ๐Ÿ‡ต๐Ÿ‡ฑ Poland -[2025-06-27 18:01:15] DEBUG: Successfully imported: PL | Golf Channel โ†’ ๐Ÿ‡ต๐Ÿ‡ฑ Poland -[2025-06-27 18:01:15] DEBUG: Successfully imported: PL | HBO HD โ†’ Movies -[2025-06-27 18:01:15] DEBUG: Successfully imported: PL | HBO2 HD โ†’ Movies -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'TR | TV 8.5' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡น๐Ÿ‡ท Turkey for: TR | TV 8.5 (matched prefix: 'tr |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'TR | TV 8.5' โ†’ ๐Ÿ‡น๐Ÿ‡ท Turkey -[2025-06-27 18:01:15] DEBUG: Successfully imported: TR | TV 8.5 โ†’ ๐Ÿ‡น๐Ÿ‡ท Turkey -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Preshyi' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Preshyi (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Preshyi' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Preshyi โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Suspline Kultura' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Suspline Kultura (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Suspline Kultura' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Suspline Kultura โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | PlusPlus' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | PlusPlus (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | PlusPlus' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | PlusPlus โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Detinets' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Detinets (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Detinets' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Detinets โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | One Planet' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | One Planet (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | One Planet' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | One Planet โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Rozpakuy TV' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Rozpakuy TV (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Rozpakuy TV' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Rozpakuy TV โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | FreeDom' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | FreeDom (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | FreeDom' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | FreeDom โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Dorama' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Dorama (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Dorama' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Dorama โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | KinoKazka' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | KinoKazka (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | KinoKazka' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | KinoKazka โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Continent-E' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Continent-E (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Continent-E' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Continent-E โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'UA | Yedyni novyny' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine for: UA | Yedyni novyny (matched prefix: 'ua |') -[2025-06-27 18:01:15] INFO: Auto-detected: 'UA | Yedyni novyny' โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: UA | Yedyni novyny โ†’ ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine -[2025-06-27 18:01:15] DEBUG: Successfully imported: BBC One โ†’ News -[2025-06-27 18:01:15] DEBUG: Successfully imported: BBC Two โ†’ News -[2025-06-27 18:01:15] DEBUG: Detecting country for: 'ITV 1' -[2025-06-27 18:01:15] INFO: Detected ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom for: ITV 1 (matched: 'itv') -[2025-06-27 18:01:15] INFO: Auto-detected: 'ITV 1' โ†’ ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -[2025-06-27 18:01:15] DEBUG: Successfully imported: ITV 1 โ†’ ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -[2025-06-27 18:01:15] INFO: Pre-duplicate removal: 26 channels -[2025-06-27 18:01:15] INFO: Writing 6 new channels to file... -[2025-06-27 18:01:15] INFO: Successfully wrote 6 channels -[2025-06-27 18:01:15] INFO: === ROBUST IMPORT STATISTICS === -[2025-06-27 18:01:15] INFO: Total Lines: 53 -[2025-06-27 18:01:15] INFO: Extinf Lines: 26 -[2025-06-27 18:01:15] INFO: Parsed: 26 -[2025-06-27 18:01:15] INFO: Valid: 26 -[2025-06-27 18:01:15] INFO: Filtered Adult: 0 -[2025-06-27 18:01:15] INFO: Filtered Invalid: 0 -[2025-06-27 18:01:15] INFO: Duplicates: 0 -[2025-06-27 18:01:15] INFO: Already Existed: 20 -[2025-06-27 18:01:15] INFO: Final Imported: 6 -[2025-06-27 18:01:15] INFO: Malformed Fixed: 0 -[2025-06-27 18:01:15] INFO: === END STATISTICS === -[2025-06-27 18:01:15] INFO: Cleaned up bulk_import.m3u -[2025-06-27 18:01:15] INFO: Import returned 6 channels -[2025-06-27 18:01:15] INFO: Parsed 29 channels -[2025-06-27 18:01:15] INFO: Generated playlist.m3u with 29 channels -[2025-06-27 18:01:15] INFO: Channels by country: {'๐Ÿ‡บ๐Ÿ‡ฆ Ukraine': 11, '๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom': 6, '๐Ÿ‡บ๐Ÿ‡ธ United States': 4, '๐Ÿ‡ต๐Ÿ‡ฑ Poland': 3, '๐Ÿ‡ฒ๐Ÿ‡พ Malaysia': 2, 'Movies': 1, 'Sports': 1, '๐Ÿ‡น๐Ÿ‡ท Turkey': 1} -[2025-06-27 18:01:15] INFO: Comprehensive playlist generation complete +[2025-06-27 21:44:30] INFO: No import file found, skipping import +[2025-06-27 21:44:30] INFO: Import returned 0 channels +[2025-06-27 21:44:30] INFO: No channels.txt file found +[2025-06-27 21:44:30] INFO: Generated playlist.m3u with 0 channels +[2025-06-27 21:44:30] INFO: Top countries: {} +[2025-06-27 21:44:30] INFO: Report saved: reports/playlist_report_20250627_214430.md +[2025-06-27 21:44:30] INFO: Playlist generation complete: 0 channels across 0 countries +[2025-06-27 21:44:30] INFO: Top countries: {} diff --git a/scripts/__pycache__/channel_processor.cpython-311.pyc b/scripts/__pycache__/channel_processor.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd69ca5c7e34e1e73697780940034b17f3d44f6d GIT binary patch literal 25431 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 YonxMwBM5&URi{5{&wtvXRGY2;1rrr0ApigX literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/health_checker.cpython-311.pyc b/scripts/__pycache__/health_checker.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3211e6e652ad4f4bf9eb544dd94992d1af01bf2d GIT binary patch literal 6333 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 literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/report_generator.cpython-311.pyc b/scripts/__pycache__/report_generator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b01d617473dbf81fbabb3641f4935963b59f9394 GIT binary patch literal 10080 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 fGN@51P8rlDl}lOjU4j7G%EO{YJ~p}-wl#& literal 0 HcmV?d00001 diff --git a/scripts/config/group_overrides.json b/scripts/config/group_overrides.json new file mode 100644 index 0000000..1e3851b --- /dev/null +++ b/scripts/config/group_overrides.json @@ -0,0 +1,4 @@ +{ + "example_keyword": "๐Ÿ‡บ๐Ÿ‡ธ United States", + "another_keyword": "๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom" +} \ No newline at end of file diff --git a/scripts/config/patterns.json b/scripts/config/patterns.json new file mode 100644 index 0000000..7ea4c79 --- /dev/null +++ b/scripts/config/patterns.json @@ -0,0 +1,600 @@ +{ + "country_patterns": { + "๐Ÿ‡บ๐Ÿ‡ธ United States": [ + "cbs", + "nbc", + "abc", + "fox", + "espn", + "cnn", + "hbo", + " usa", + " us ", + ".us", + "america", + "nfl" + ], + "๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom": [ + "bbc", + "itv", + "sky", + "channel 4", + "e4", + " uk", + ".uk", + "british", + "premier league" + ], + "๐Ÿ‡จ๐Ÿ‡ฆ Canada": [ + "cbc", + "ctv", + "global", + "canada", + "canadian", + " ca ", + ".ca" + ], + "๐Ÿ‡ฉ๐Ÿ‡ช Germany": [ + "ard", + "zdf", + "rtl", + "sat.1", + "pro7", + "germany", + "german", + " de ", + ".de" + ], + "๐Ÿ‡ซ๐Ÿ‡ท France": [ + "tf1", + "france 2", + "m6", + "canal+", + "france", + "french", + " fr ", + ".fr" + ], + "๐Ÿ‡ช๐Ÿ‡ธ Spain": [ + "tve", + "antena 3", + "telecinco", + "spain", + "spanish", + " es ", + ".es" + ], + "๐Ÿ‡ฎ๐Ÿ‡น Italy": [ + "rai", + "mediaset", + "canale 5", + "italy", + "italian", + " it ", + ".it" + ], + "๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands": [ + "npo", + "rtl nl", + "netherlands", + "dutch", + "holland", + " nl ", + ".nl" + ], + "๐Ÿ‡ง๐Ÿ‡ช Belgium": [ + "vtm", + "รฉรฉn", + "canvas", + "belgium", + "belgian", + " be ", + ".be" + ], + "๐Ÿ‡จ๐Ÿ‡ญ Switzerland": [ + "srf", + "rts", + "switzerland", + "swiss", + " ch ", + ".ch" + ], + "๐Ÿ‡ฆ๐Ÿ‡น Austria": [ + "orf", + "austria", + "austrian", + " at ", + ".at" + ], + "๐Ÿ‡ต๐Ÿ‡น Portugal": [ + "rtp", + "sic", + "tvi", + "portugal", + "portuguese", + " pt ", + ".pt" + ], + "๐Ÿ‡ฎ๐Ÿ‡ช Ireland": [ + "rte", + "tg4", + "ireland", + "irish", + " ie ", + ".ie" + ], + "๐Ÿ‡ธ๐Ÿ‡ช Sweden": [ + "svt", + "tv4", + "sweden", + "swedish", + " se ", + ".se" + ], + "๐Ÿ‡ณ๐Ÿ‡ด Norway": [ + "nrk", + "tv 2 no", + "norway", + "norwegian", + " no ", + ".no" + ], + "๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark": [ + "dr", + "tv2 dk", + "denmark", + "danish", + " dk ", + ".dk" + ], + "๐Ÿ‡ซ๐Ÿ‡ฎ Finland": [ + "yle", + "mtv3", + "finland", + "finnish", + " fi ", + ".fi" + ], + "๐Ÿ‡ฎ๐Ÿ‡ธ Iceland": [ + "ruv", + "iceland", + "icelandic", + " is ", + ".is" + ], + "๐Ÿ‡ท๐Ÿ‡บ Russia": [ + "channel one", + "rossiya", + "ntv", + "russia", + "russian", + " ru ", + ".ru" + ], + "๐Ÿ‡ต๐Ÿ‡ฑ Poland": [ + "tvp", + "polsat", + "tvn", + "poland", + "polish", + " pl ", + ".pl" + ], + "๐Ÿ‡จ๐Ÿ‡ฟ Czech Republic": [ + "ct", + "nova", + "prima", + "czech", + " cz ", + ".cz" + ], + "๐Ÿ‡ธ๐Ÿ‡ฐ Slovakia": [ + "rtvs", + "markiza", + "slovakia", + "slovak", + " sk ", + ".sk" + ], + "๐Ÿ‡ญ๐Ÿ‡บ Hungary": [ + "mtv hu", + "rtl klub", + "hungary", + "hungarian", + " hu ", + ".hu" + ], + "๐Ÿ‡บ๐Ÿ‡ฆ Ukraine": [ + "1+1", + "inter", + "ictv", + "ukraine", + "ukrainian", + " ua ", + ".ua" + ], + "๐Ÿ‡ท๐Ÿ‡ด Romania": [ + "tvr", + "pro tv", + "romania", + "romanian", + " ro ", + ".ro" + ], + "๐Ÿ‡ง๐Ÿ‡ฌ Bulgaria": [ + "btv", + "nova bg", + "bulgaria", + "bulgarian", + " bg ", + ".bg" + ], + "๐Ÿ‡ญ๐Ÿ‡ท Croatia": [ + "hrt", + "nova tv hr", + "croatia", + "croatian", + " hr ", + ".hr" + ], + "๐Ÿ‡ท๐Ÿ‡ธ Serbia": [ + "rts", + "pink", + "serbia", + "serbian", + " rs ", + ".rs" + ], + "๐Ÿ‡ฌ๐Ÿ‡ท Greece": [ + "ert", + "mega gr", + "greece", + "greek", + " gr ", + ".gr" + ], + "๐Ÿ‡ง๐Ÿ‡ท Brazil": [ + "globo", + "band", + "sbt", + "brazil", + "brasil", + " br ", + ".br" + ], + "๐Ÿ‡ฆ๐Ÿ‡ท Argentina": [ + "telefe", + "canal 13", + "argentina", + " ar ", + ".ar" + ], + "๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico": [ + "televisa", + "tv azteca", + "mexico", + "mรฉxico", + " mx ", + ".mx" + ], + "๐Ÿ‡จ๐Ÿ‡ฑ Chile": [ + "tvn", + "mega", + "chile", + "chilean", + " cl ", + ".cl" + ], + "๐Ÿ‡จ๐Ÿ‡ด Colombia": [ + "caracol", + "rcn", + "colombia", + "colombian", + " co ", + ".co" + ], + "๐Ÿ‡ต๐Ÿ‡ช Peru": [ + "america tv pe", + "peru", + "peruvian", + " pe ", + ".pe" + ], + "๐Ÿ‡ป๐Ÿ‡ช Venezuela": [ + "venevision", + "venezuela", + "venezuelan", + " ve ", + ".ve" + ], + "๐Ÿ‡จ๐Ÿ‡ณ China": [ + "cctv", + "phoenix", + "china", + "chinese", + " cn ", + ".cn" + ], + "๐Ÿ‡ฏ๐Ÿ‡ต Japan": [ + "nhk", + "fuji", + "tv asahi", + "japan", + "japanese", + " jp ", + ".jp" + ], + "๐Ÿ‡ฐ๐Ÿ‡ท South Korea": [ + "kbs", + "sbs kr", + "mbc kr", + "korea", + "korean", + " kr ", + ".kr" + ], + "๐Ÿ‡ฐ๐Ÿ‡ต North Korea": [ + "kctv", + "north korea", + "dprk" + ], + "๐Ÿ‡น๐Ÿ‡ผ Taiwan": [ + "cts", + "ctv", + "tvbs", + "taiwan", + "taiwanese", + " tw ", + ".tw" + ], + "๐Ÿ‡ญ๐Ÿ‡ฐ Hong Kong": [ + "tvb", + "atv", + "hong kong", + "hongkong", + " hk ", + ".hk" + ], + "๐Ÿ‡น๐Ÿ‡ญ Thailand": [ + "ch3", + "ch7", + "thai pbs", + "thailand", + "thai", + " th ", + ".th" + ], + "๐Ÿ‡ป๐Ÿ‡ณ Vietnam": [ + "vtv", + "htv", + "vietnam", + "vietnamese", + " vn ", + ".vn" + ], + "๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia": [ + "tvri", + "sctv", + "rcti", + "indonesia", + "indonesian", + " id ", + ".id" + ], + "๐Ÿ‡ฒ๐Ÿ‡พ Malaysia": [ + "tv1", + "tv3", + "astro", + "malaysia", + "malaysian", + " my ", + ".my", + "my:" + ], + "๐Ÿ‡ธ๐Ÿ‡ฌ Singapore": [ + "channel 5", + "channel 8", + "singapore", + " sg ", + ".sg" + ], + "๐Ÿ‡ต๐Ÿ‡ญ Philippines": [ + "abs-cbn", + "gma", + "philippines", + "filipino", + " ph ", + ".ph" + ], + "๐Ÿ‡ฎ๐Ÿ‡ณ India": [ + "star plus", + "zee tv", + "colors", + "sony tv", + "india", + "indian", + "hindi", + " in ", + ".in" + ], + "๐Ÿ‡ต๐Ÿ‡ฐ Pakistan": [ + "ptv", + "geo tv", + "ary", + "pakistan", + "pakistani", + " pk ", + ".pk" + ], + "๐Ÿ‡ง๐Ÿ‡ฉ Bangladesh": [ + "btv", + "channel i", + "bangladesh", + "bangladeshi", + " bd ", + ".bd" + ], + "๐Ÿ‡ฑ๐Ÿ‡ฐ Sri Lanka": [ + "rupavahini", + "sirasa", + "sri lanka", + " lk ", + ".lk" + ], + "๐Ÿ‡ณ๐Ÿ‡ต Nepal": [ + "nepal tv", + "kantipur", + "nepal", + "nepali", + " np ", + ".np" + ], + "๐Ÿ‡ฆ๐Ÿ‡ซ Afghanistan": [ + "rta", + "tolo tv", + "afghanistan", + "afghan", + " af ", + ".af" + ], + "๐Ÿ‡ฆ๐Ÿ‡บ Australia": [ + "abc au", + "seven", + "nine", + "ten", + "australia", + "australian", + "aussie", + " au ", + ".au" + ], + "๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand": [ + "tvnz", + "tvnz 1", + "tvnz 2", + "three nz", + "tvnz duke", + "new zealand", + "kiwi", + " nz ", + ".nz" + ], + "๐Ÿ‡ธ๐Ÿ‡ฆ Arabic": [ + "al jazeera", + "mbc", + "lbc", + "dubai tv", + "arabic", + "arab", + "qatar", + "dubai", + "saudi" + ], + "๐Ÿ‡ฎ๐Ÿ‡ฑ Israel": [ + "kan", + "keshet 12", + "israel", + "israeli", + "hebrew", + " il ", + ".il" + ], + "๐Ÿ‡น๐Ÿ‡ท Turkey": [ + "trt", + "atv", + "kanal d", + "turkey", + "turkish", + " tr ", + ".tr", + "tr |" + ], + "๐Ÿ‡ฎ๐Ÿ‡ท Iran": [ + "irib", + "press tv", + "iran", + "iranian", + "persian", + " ir ", + ".ir" + ], + "๐Ÿ‡ช๐Ÿ‡ฌ Egypt": [ + "nile tv", + "cbc egypt", + "egypt", + "egyptian", + " eg ", + ".eg" + ], + "๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa": [ + "sabc", + "etv", + "mnet", + "south africa", + " za ", + ".za" + ], + "๐Ÿ‡ณ๐Ÿ‡ฌ Nigeria": [ + "nta", + "channels tv", + "nigeria", + "nigerian", + " ng ", + ".ng" + ] + }, + "country_prefixes": { + "๐Ÿ‡บ๐Ÿ‡ฆ Ukraine": [ + "ua |" + ], + "๐Ÿ‡ต๐Ÿ‡ฑ Poland": [ + "pl |" + ], + "๐Ÿ‡น๐Ÿ‡ท Turkey": [ + "tr |" + ], + "๐Ÿ‡ฒ๐Ÿ‡พ Malaysia": [ + "my:", + "my |" + ], + "๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom": [ + "uk:", + "uk |" + ], + "๐Ÿ‡บ๐Ÿ‡ธ United States": [ + "us:", + "us |" + ] + }, + "quality_patterns": { + "4K": [ + "4k", + "uhd", + "2160p" + ], + "FHD": [ + "fhd", + "1080p", + "1080" + ], + "HD": [ + "hd", + "720p", + "720" + ], + "SD": [ + "sd", + "480p", + "360p" + ] + }, + "adult_keywords": [ + "xxx", + "adult", + "porn", + "sex", + "erotic", + "playboy", + "18+" + ] +} \ No newline at end of file diff --git a/scripts/config/settings.json b/scripts/config/settings.json new file mode 100644 index 0000000..fdfbb87 --- /dev/null +++ b/scripts/config/settings.json @@ -0,0 +1,16 @@ +{ + "remove_duplicates": true, + "sort_channels": true, + "backup_before_import": true, + "auto_cleanup_import": true, + "auto_detect_country": true, + "detect_quality": true, + "skip_adult_content": true, + "min_channel_name_length": 2, + "max_workers": 4, + "enable_health_check": false, + "health_check_timeout": 5, + "create_backup": true, + "max_backups": 5, + "log_level": "INFO" +} \ No newline at end of file diff --git a/scripts/reports/playlist_report_20250627_214430.md b/scripts/reports/playlist_report_20250627_214430.md new file mode 100644 index 0000000..63eb576 --- /dev/null +++ b/scripts/reports/playlist_report_20250627_214430.md @@ -0,0 +1,16 @@ +# IPTV Playlist Generation Report +**Generated:** 2025-06-27 21:44:30 + +## Summary Statistics +- **Total channels processed:** 0 +- **Valid channels:** 0 +- **Duplicates removed:** 0 +- **New channels imported:** 0 +- **Countries detected:** 0 + +## Configuration +- **Remove duplicates:** True +- **Auto country detection:** True +- **Quality detection:** True +- **Adult content filtering:** True +- **Health check enabled:** False