mirror of
https://github.com/anthonyaxenov/iptv.git
synced 2024-12-22 06:15:48 +00:00
Some new stuff
- MIT License - new make-pls.sh - some tools refactoring and documentation
This commit is contained in:
parent
0e741bae8f
commit
1a2bc188c6
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -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.
|
161
README.md
161
README.md
@ -1,5 +1,21 @@
|
|||||||
# Список самообновляемых плейлистов для IPTV
|
# Список самообновляемых плейлистов для 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/)**
|
> **[Перейти на актуальную сраницу](https://iptv.axenov.dev/)**
|
||||||
|
|
||||||
Здесь собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе.
|
Здесь собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе.
|
||||||
@ -89,41 +105,148 @@ redirect=p1
|
|||||||
|
|
||||||
### tools/check-pls.sh
|
### tools/check-pls.sh
|
||||||
|
|
||||||
Проверяет каждый канал в плейлисте и выводит результат проверки.
|
Проверяет каждый канал в плейлисте на доступность и выводит результат проверки.
|
||||||
|
|
||||||
Поддерживаются *.m3u и *.m3u8, как локальные файлы, так по прямым ссылкам.
|
Поддерживаются *.m3u и *.m3u8; как локальные файлы, так по прямым ссылкам.
|
||||||
|
|
||||||
Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns).
|
Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns).
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./tools/check-pls.sh https://smarttvapp.ru/app/iptvfull.m3u TSTP ✘ 4s ≡ 16:47:00
|
$ ./tools/check-pls.sh my.m3u8
|
||||||
Playlist: https://smarttvapp.ru/app/iptvfull.m3u
|
Playlist: my.m3u8
|
||||||
Saved in /tmp/iptvfull.m3u
|
|
||||||
|
|
||||||
Note 1: operation may take some time.
|
Note 1: operation may take some time.
|
||||||
Note 2: press CTRL+C to skip current channel or CTRL+Z to kill process.
|
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 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
|
Note 4: error codes listed here - https://everything.curl.dev/usingcurl/returns
|
||||||
--------------------
|
--------------------
|
||||||
[1] - 1.06.2022 - smarttvapp.ru -...
|
[1] Канал Disney...
|
||||||
- OK: "https://smarttvapp.ru/wp-content/uploads/2017/02/smartTVradar_logo_405x127kkk12.png"
|
- OK: "http://ott-cdn.ucom.am/s60/04.m3u8"
|
||||||
[2] Первый канал Евразия...
|
[2] Канал Disney...
|
||||||
- OK: "http://stream.euroasia.lfstrm.tv/perviy_evrasia/1/index.m3u8"
|
- ERROR 28 (-): "http://92.243.113.179:8080/Disney_Channel/index.m3u8?token=nts_tv"
|
||||||
[3] Первый канал. Всемирная сеть...
|
[3] Disney канал ...
|
||||||
- OK: "https://sc.id-tv.kz:443/1KanalVsemSet_36_37.m3u8"
|
- OK: "http://ott-cdn.ucom.am/s60/index.m3u8 "
|
||||||
[4] Россия К +2...
|
[4] Канал Disney...
|
||||||
- OK: "https://sc.id-tv.kz:443/RossiyaK_34_35.m3u8"
|
- OK: "http://ott-cdn.ucom.am/s60/04.m3u8"
|
||||||
[5] НТВ Мир...
|
[5] Fox_Life_HD...
|
||||||
- OK: "http://92.46.127.146:8080/ntv-L3-TRANS/index.m3u8"
|
- ERROR 6 (-): "http://live-ng-01.more.tv/hls/Fox_Life_HD/index_1.m3u8"
|
||||||
[6] НТВ Мир...
|
[6] FOX_HD...
|
||||||
- ERROR (28): "https://sc.id-tv.kz:443/NTV_34_35.m3u8"
|
- 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
|
Check stats
|
||||||
- Success: 995/999
|
- Success: 995/999
|
||||||
- Failed: 4/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)
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/**
|
||||||
|
* Anthony Axenov (c) 2022
|
||||||
|
* The MIT License:
|
||||||
|
* https://github.com/anthonyaxenov/iptv/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
//ini_set('display_errors', 1);
|
//ini_set('display_errors', 1);
|
||||||
//ini_set('display_startup_errors', 1);
|
//ini_set('display_startup_errors', 1);
|
||||||
|
@ -14,6 +14,10 @@
|
|||||||
#
|
#
|
||||||
# Both *.m3u and *.m3u8 are supported.
|
# Both *.m3u and *.m3u8 are supported.
|
||||||
#
|
#
|
||||||
|
# Anthony Axenov (c) 2022
|
||||||
|
# The MIT License:
|
||||||
|
# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE
|
||||||
|
#
|
||||||
#################################################
|
#################################################
|
||||||
|
|
||||||
awk '
|
awk '
|
||||||
|
@ -10,8 +10,13 @@
|
|||||||
# All playlists from playlists.ini will be
|
# All playlists from playlists.ini will be
|
||||||
# downloaded in ./downloaded directory
|
# downloaded in ./downloaded directory
|
||||||
#
|
#
|
||||||
|
# Anthony Axenov (c) 2022
|
||||||
|
# The MIT License:
|
||||||
|
# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE
|
||||||
|
#
|
||||||
#################################################
|
#################################################
|
||||||
|
|
||||||
mkdir -p downloaded && \
|
rm -rf ./downloaded
|
||||||
cd downloaded && \
|
mkdir -p ./downloaded && \
|
||||||
|
cd ./downloaded && \
|
||||||
grep -P "pls='(.*)'" ../playlists.ini | sed "s/^pls=//g" | sed "s/'//g" | tr -d '\r' | xargs wget
|
grep -P "pls='(.*)'" ../playlists.ini | sed "s/^pls=//g" | sed "s/'//g" | tr -d '\r' | xargs wget
|
||||||
|
@ -6,10 +6,14 @@
|
|||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./download-all.sh
|
# ./download-all.sh
|
||||||
# ./find-in-all.sh disney
|
# ./find-in-all.sh "(disney|atv)"
|
||||||
#
|
#
|
||||||
# 1st argument is channel name pattern.
|
# 1st argument is channel name pattern.
|
||||||
#
|
#
|
||||||
|
# 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 -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )";
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
# IPTV channel finder (one playlist)
|
# IPTV channel finder (one playlist)
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./find-in-pls.sh disney local/pls.m3u
|
# ./find-in-pls.sh "disney" local/pls.m3u
|
||||||
# ./find-in-pls.sh disney https://example.com/pls.m3u
|
# ./find-in-pls.sh "disney" https://example.com/pls.m3u
|
||||||
#
|
#
|
||||||
# 1st argument is channel name pattern.
|
# 1st argument is channel name pattern.
|
||||||
#
|
#
|
||||||
@ -16,6 +16,10 @@
|
|||||||
#
|
#
|
||||||
# Both *.m3u and *.m3u8 are supported.
|
# Both *.m3u and *.m3u8 are supported.
|
||||||
#
|
#
|
||||||
|
# Anthony Axenov (c) 2022
|
||||||
|
# The MIT License:
|
||||||
|
# https://github.com/anthonyaxenov/iptv/blob/master/LICENSE
|
||||||
|
#
|
||||||
#################################################
|
#################################################
|
||||||
|
|
||||||
awk '
|
awk '
|
||||||
@ -53,14 +57,12 @@ awk '
|
|||||||
sub("\r$", "", $0) # crlf -> lf
|
sub("\r$", "", $0) # crlf -> lf
|
||||||
if (tolower($0) ~ tolower(regex_ch)) {
|
if (tolower($0) ~ tolower(regex_ch)) {
|
||||||
found_count++
|
found_count++
|
||||||
#print "\n\033[32m" FNR " FOUND:\033[0m\t" $0
|
print "\n\033[32m" FNR " FOUND:\033[0m\t" $0
|
||||||
print "\n" $0
|
|
||||||
found_last = FNR
|
found_last = FNR
|
||||||
}
|
}
|
||||||
if (found_last > 0) {
|
if (found_last > 0) {
|
||||||
if (tolower($0) ~ tolower(regex_url)) {
|
if (tolower($0) ~ tolower(regex_url)) {
|
||||||
#print "\t\t" $0
|
print "\t\t" $0
|
||||||
print $0 "\n"
|
|
||||||
found_last = 0
|
found_last = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
60
tools/make-pls.sh
Executable file
60
tools/make-pls.sh
Executable file
@ -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
|
Loading…
Reference in New Issue
Block a user