diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..82b8da5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Антон Аксенов (aka Anthony Axenov) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +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 OR COPYRIGHT HOLDERS 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. diff --git a/README.md b/README.md index 2b0949a..369fa9b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ # Список самообновляемых плейлистов для IPTV +- [Список самообновляемых плейлистов для IPTV](#список-самообновляемых-плейлистов-для-iptv) + - [Как использовать этот список?](#как-использовать-этот-список) + - [Как добавить плейлист в этот список?](#как-добавить-плейлист-в-этот-список) + - [API](#api) + - [Формат `playlists.ini`](#формат-playlistsini) + - [Дополнительные инструменты](#дополнительные-инструменты) + - [tools/download-all.sh](#toolsdownload-allsh) + - [tools/check-pls.sh](#toolscheck-plssh) + - [tools/find-in-pls.sh](#toolsfind-in-plssh) + - [tools/find-in-all.sh](#toolsfind-in-allsh) + - [tools/make-pls.sh](#toolsmake-plssh) + - [Как создать свой собственный плейлист](#как-создать-свой-собственный-плейлист) + - [Лицензия](#лицензия) + +--- + > **[Перейти на актуальную сраницу](https://iptv.axenov.dev/)** Здесь собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе. @@ -89,41 +105,148 @@ redirect=p1 ### tools/check-pls.sh -Проверяет каждый канал в плейлисте и выводит результат проверки. +Проверяет каждый канал в плейлисте на доступность и выводит результат проверки. -Поддерживаются *.m3u и *.m3u8, как локальные файлы, так по прямым ссылкам. +Поддерживаются *.m3u и *.m3u8; как локальные файлы, так по прямым ссылкам. Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns). Пример: ``` -$ ./tools/check-pls.sh https://smarttvapp.ru/app/iptvfull.m3u  TSTP ✘  4s  ≡  16:47:00 -Playlist: https://smarttvapp.ru/app/iptvfull.m3u -Saved in /tmp/iptvfull.m3u +$ ./tools/check-pls.sh my.m3u8 +Playlist: my.m3u8 Note 1: operation may take some time. Note 2: press CTRL+C to skip current channel or CTRL+Z to kill process. Note 3: results may be inaccurate, you should use proper IPTV software to re-check. Note 4: error codes listed here - https://everything.curl.dev/usingcurl/returns -------------------- -[1] - 1.06.2022 - smarttvapp.ru -... - - OK: "https://smarttvapp.ru/wp-content/uploads/2017/02/smartTVradar_logo_405x127kkk12.png" -[2] Первый канал Евразия... - - OK: "http://stream.euroasia.lfstrm.tv/perviy_evrasia/1/index.m3u8" -[3] Первый канал. Всемирная сеть... - - OK: "https://sc.id-tv.kz:443/1KanalVsemSet_36_37.m3u8" -[4] Россия К +2... - - OK: "https://sc.id-tv.kz:443/RossiyaK_34_35.m3u8" -[5] НТВ Мир... - - OK: "http://92.46.127.146:8080/ntv-L3-TRANS/index.m3u8" -[6] НТВ Мир... - - ERROR (28): "https://sc.id-tv.kz:443/NTV_34_35.m3u8" +[1] Канал Disney... + - OK: "http://ott-cdn.ucom.am/s60/04.m3u8" +[2] Канал Disney... + - ERROR 28 (-): "http://92.243.113.179:8080/Disney_Channel/index.m3u8?token=nts_tv" +[3] Disney канал ... + - OK: "http://ott-cdn.ucom.am/s60/index.m3u8 " +[4] Канал Disney... + - OK: "http://ott-cdn.ucom.am/s60/04.m3u8" +[5] Fox_Life_HD... + - ERROR 6 (-): "http://live-ng-01.more.tv/hls/Fox_Life_HD/index_1.m3u8" +[6] FOX_HD... + - ERROR 22 (404): "http://live-ng-01.more.tv/hls/FOX_HD/index_1.m3u8" ... - -------------------- -Playlist: https://smarttvapp.ru/app/iptvfull.m3u +Playlist: my.m3u8 Check stats - Success: 995/999 - Failed: 4/999 ``` + +### tools/find-in-pls.sh + +Находит каналы по заданному регулярному выражению в указанном плейлисте. + +Поддерживаются *.m3u и *.m3u8; как локальные файлы, так по прямым ссылкам. + +Пример: + +``` +$ ./tools/find-in-pls.sh disney a.m3u8 +-------------------- +Playlist: a.m3u8 +Channel to find: disney +-------------------- + +267 FOUND: #EXTINF:-1 group-title="Disney" tvg-id="disney",Disney (1) + http://zabava-htlive.cdn.ngenix.net/hls/CH_DISNEY/bw2000000/variant.m3u8?version=2 + +270 FOUND: #EXTINF:-1 group-title="Disney" tvg-id="disney",Disney (2) + https://okkotv-live.cdnvideo.ru/channel/Disney.m3u8 +-------------------- +Playlist: a.m3u8 +Channel found: disney +Found: 2 +``` + +### tools/find-in-all.sh + +Находит каналы по заданному регулярному выражению в плейлистах, скачанных через download-all.sh. + +Пример: + +``` +$ ./tools/find-in-all.sh (disney|СТС) +... +-------------------- +Playlist: ./downloaded/kids.m3u.1 +Channel to find: (disney|СТС) +-------------------- + +35 FOUND: #EXTINF:-1 tvg-name="СТС Kids HD" group-title="Детские", СТС Kids HD + https://okkotv-live.cdnvideo.ru/channel/CTC_Kids_HD.m3u8 + +59 FOUND: #EXTINF:-1 tvg-name="Disney канал" group-title="Детские", Disney канал + http://zabava-htlive.cdn.ngenix.net/hls/CH_DISNEY/bw2000000/variant.m3u8?version=2 + +83 FOUND: #EXTINF:-1 tvg-name="Канал Disney (okko tv)" group-title="Детские", Канал Disney (okko tv) + https://okkotv-live.cdnvideo.ru/channel/Disney.m3u8 +-------------------- +Playlist: ./downloaded/kids.m3u.1 +Channel found: (disney|СТС) +Found: 3 +-------------------- +Playlist: ./downloaded/kz-all.m3u +Channel to find: (disney|СТС) +-------------------- +Nothing found +... +``` + +### tools/make-pls.sh + +Находит каналы по заданному регулярному выражению в плейлистах, скачанных через download-all.sh. + +Отличается от `find-in-all.sh` тем, что тот выводит результат в человекочитаемом формате, а `make-pls.sh` -- в готовом m3u формате для сохранения в файл. + +Пример: + +``` +./tools/make-pls.sh "(fox|disney)" +#EXTM3U +# Autogenerated at 09.06.2022 +# https://github.com/anthonyaxenov/iptv + +#EXTINF:-1,Канал Disney +http://ott-cdn.ucom.am/s60/04.m3u8 + +#EXTINF:-1,Канал Disney +http://92.243.113.179:8080/Disney_Channel/index.m3u8?token=nts_tv + +#EXTINF:-1 ,Fox HD +http://live02-cdn.tv.ti.ru:80/dtv/id376_NBN_SG--Fox_HD/04/plst.m3u8 +... +``` + +## Как создать свой собственный плейлист + +1. Скачать все плейлисты, указанные в `playlists.ini`: + ``` + $ ./tools/download-all.sh + ``` +2. Вытащить из них нужные каналы и сохранить в отдельный файл: + ``` + $ ./tools/make-pls.sh "(fox|disney)" > my.m3u8 + ``` + Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встрелись `fox` или `disney`. +3. Проверить доступность каналов в полученном плейлисте: + ``` + $ ./tools/check-pls.sh my.m3u8 + ``` + > Результат `ОК` не значит, что канал действительно работает и отдаёт видео/аудио потоки. + > Результат `ERROR` с любыми кодами ошибок значит, что канал гарантированно не работает. +4. Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы. +5. Вручную: добавить плейлист в IPTV-плеер и перепроверить результат. + +## Лицензия + +[The MIT License](LICENSE) diff --git a/index.php b/index.php index e6388a9..01429fb 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,9 @@ /dev/null && pwd 2> /dev/null; )"; diff --git a/tools/find-in-pls.sh b/tools/find-in-pls.sh index 1a0f5f0..6a7805b 100755 --- a/tools/find-in-pls.sh +++ b/tools/find-in-pls.sh @@ -5,8 +5,8 @@ # IPTV channel finder (one playlist) # # Usage: -# ./find-in-pls.sh disney local/pls.m3u -# ./find-in-pls.sh disney https://example.com/pls.m3u +# ./find-in-pls.sh "disney" local/pls.m3u +# ./find-in-pls.sh "disney" https://example.com/pls.m3u # # 1st argument is channel name pattern. # @@ -16,6 +16,10 @@ # # Both *.m3u and *.m3u8 are supported. # +# Anthony Axenov (c) 2022 +# The MIT License: +# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE +# ################################################# awk ' @@ -53,14 +57,12 @@ awk ' sub("\r$", "", $0) # crlf -> lf if (tolower($0) ~ tolower(regex_ch)) { found_count++ - #print "\n\033[32m" FNR " FOUND:\033[0m\t" $0 - print "\n" $0 + print "\n\033[32m" FNR " FOUND:\033[0m\t" $0 found_last = FNR } if (found_last > 0) { if (tolower($0) ~ tolower(regex_url)) { - #print "\t\t" $0 - print $0 "\n" + print "\t\t" $0 found_last = 0 } } diff --git a/tools/make-pls.sh b/tools/make-pls.sh new file mode 100755 index 0000000..5c83aca --- /dev/null +++ b/tools/make-pls.sh @@ -0,0 +1,60 @@ + +#!/bin/bash + +################################################# +# +# IPTV channel maker (all playlists) +# +# Usage: +# ./download-all.sh +# ./make-pls.sh "disney" +# +# 1st argument is channel name pattern. +# +# To save output in file use redirection: +# ./make-pls.sh "disney" > disney.m3u8 +# +# Anthony Axenov (c) 2022 +# The MIT License: +# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE +# +################################################# + +#SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )"; +SCRIPT_DIR="$(cd "$(dirname "$0")" >/dev/null 2>&1 && pwd)" +[ ! -d ./downloaded ] && echo "Error: ./downloaded directory does not exist. Run $SCRIPT_DIR/tools/download-all.sh" && exit 1 +[ ! "$(ls -A ./downloaded)" ] && echo "Error: ./downloaded directory is empty. Run $SCRIPT_DIR/tools/download-all.sh" && exit 2 +echo "#EXTM3U" +echo "# Autogenerated at `date +%d.%m.%Y`" +echo "# https://github.com/anthonyaxenov/iptv" +echo +for file in ./downloaded/*; do + awk ' + BEGIN { + IGNORECASE=1 + "date +%Y-%m-%d" | getline date + channel = ARGV[1] + playlist = ARGV[2] + ARGV[1] = playlist + delete ARGV[2] + found_count = 0 + found_last = 0 + regex_ch = tolower(sprintf("^#EXTINF:.+,\s*(.*%s.*)", channel)) + regex_url = "^https?:\/\/.*$" + } + { + sub("\r$", "", $0) # crlf -> lf + if (tolower($0) ~ tolower(regex_ch)) { + print $0 + found_count++ + found_last = FNR + } + if (found_last > 0) { + if (tolower($0) ~ tolower(regex_url)) { + print $0 "\n" + found_last = 0 + } + } + } + ' "$1" "$file" +done