Compare commits

...

5 Commits

Author SHA1 Message Date
Anthony Axenov e4e055c2a3
Cursor style 2022-06-04 17:06:21 +08:00
Anthony Axenov c59330b56c
Move .sh scripts into ./tools + README 2022-06-04 17:03:31 +08:00
Anthony Axenov 94671a1515
Micro optimizations of getinfo 2022-06-04 16:25:07 +08:00
Anthony Axenov 60f2834cca
ajax timout back to 1 min 2022-06-04 14:48:14 +08:00
Anthony Axenov 621f9c7932
New playlists 2022-06-04 14:46:36 +08:00
5 changed files with 251 additions and 40 deletions

View File

@ -10,6 +10,8 @@
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
## Как использовать этот список?
Чтобы подключить плейлист, нужно в настройках IPTV-плеера указать ссылку в следующем формате:
```
@ -31,7 +33,7 @@ iptv.axenov.dev?ID
Можно получать состояние плейлистов из этого сборника при помощи метода:
```
GET https://iptv.axenov.dev/getinfo=<ID>
GET https://iptv.axenov.dev/?getinfo=<ID>
```
где `ID` - один из идентификаторов, указанных в `playlists.ini` в квадратных скобках.
@ -78,3 +80,50 @@ src='https://webarmen.com/my/iptv/xxx.php'
; Необязателен, но если указан, то приоритетнее, чем pls.
redirect=p1
```
## Дополнительные инструменты
### tools/download-all.sh
Скачивает все плейлисты из `playlists.ini` в локальную директорию `./flies/...`.
### tools/check-pls.sh
Проверяет каждый канал в плейлисте и выводит результат проверки.
Поддерживаются *.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
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"
...
--------------------
Playlist: https://smarttvapp.ru/app/iptvfull.m3u
Check stats
- Success: 995/999
- Failed: 4/999
```

View File

@ -4,56 +4,57 @@
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
function response(array $content): void
{
header("Content-Type: application/json; charset=utf-8");
die(json_encode($content));
}
$updated_at = date('d.m.Y h:i', filemtime('playlists.ini'));
$my_url = $_SERVER['SERVER_NAME'] . '?';
$ini = parse_ini_file('playlists.ini', true);
// get playlist info (ajax)
if (!empty($_GET['getinfo'])) {
$pls_cfg = $ini[$_GET['getinfo']];
$pls = $ini[$_GET['getinfo']];
if (!empty($pls['redirect'])) {
$pls = $ini[$pls['redirect']];
}
unset($ini);
if (empty($pls_cfg)) {
die(json_encode([
if (empty($pls)) { // no playlist in ini
response([
'is_online' => false,
'count' => 0,
'channels' => [],
]));
]);
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $pls_cfg['pls']);
curl_setopt($curl, CURLOPT_URL, $pls['pls']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 3);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_HEADER, 0);
$response = curl_exec($curl);
$headers_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$code = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($response === false) {
die(json_encode([
unset($curl);
if ($response === false) { // timed out
response([
'is_online' => false,
'count' => '-',
'channels' => [],
]));
]);
}
$headers = array_unique(explode("\r\n", substr($response, 0, $headers_size)));
$pls_content = substr($response, $headers_size);
unset($response, $headers_size, $curl);
$matches = [];
// preg_match_all("/^#EXTINF:-?[\d](?:(\s?url-tvg=\".*\")?(\stvg-logo=\".*\")?(\stvg-name=\".*\")?(\stvg-id=\".*\")?(\sgroup-title=\".*\")?)\s?,\s?(.*)/m", $content, $matches);
preg_match_all("/^#EXTINF:-?\d.*,\s*(.*)/m", $pls_content, $matches);
$channels = $matches[1];
unset($pls_content, $matches);
$is_online = !empty($headers) && strpos($headers[0], ' 200') !== false;
unset($headers);
$channels = array_map('trim', $channels);
header("Content-Type: application/json; charset=utf-8");
die(json_encode([
'is_online' => $is_online,
preg_match_all("/^#EXTINF:-?\d.*,\s*(.*)/m", $response, $matches);
$channels = array_map('trim', $matches[1]);
unset($response, $matches);
response([
'is_online' => $is_online = $code < 400,
'count' => $is_online ? count($channels) : '-',
'channels' => $channels,
]));
]);
}
// redirect to playlist
@ -75,6 +76,7 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IPTV Playlists</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<style>.cursor-pointer {cursor: pointer} </style>
<script src="js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-dark text-light">
@ -154,7 +156,7 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Нажми на ссылку, чтобы скопировать её в буфер обмена"
class="font-monospace">
class="font-monospace cursor-pointer">
<?=$my_url?><?=$id?>
</span>
</td>
@ -284,7 +286,7 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
const id = tr.attributes['data-playlist-id'].value
const xhr = new XMLHttpRequest()
xhr.responseType = 'json'
xhr.timeout = 5000 // ms = 5 sec
xhr.timeout = 60000 // ms = 1 min
let st_el = tr.querySelector('span.status')
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
@ -296,7 +298,7 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
st_el.innerHTML = 'online'
st_el.classList.add('bg-success')
if (xhr.response.channels.length > 0) {
tr.querySelector('td.info').innerHTML += '<a class="small" ' +
tr.querySelector('td.info').innerHTML += '<a class="small cursor-pointer" ' +
'data-bs-toggle="collapse" data-bs-target="#channels-' + id + '" aria-expanded="false" ' +
'aria-controls="channels-' + id + '">Список каналов</a><div class="collapse" id="channels-' + id +
'"><p class="card card-body bg-dark small" style="max-height:250px;overflow-y:auto;">' +

View File

@ -4,14 +4,44 @@ desc='В этом IPTV плейлисте формата m3u вы найдете
pls='https://smarttvapp.ru/app/iptvfull.m3u'
src='https://smarttvapp.ru/aktualnyiy-i-rabochiy-iptv-pleylist-m3u/'
[p1]
name='smarttvnews.ru'
[2]
name='Самообновляемый IPTV плейлист — июнь 2022 (prodigtv.ru)'
desc='Возможно, доублирует какой-то от smarttvnews'
pls='https://prodigtv.ru/play/iptv.m3u'
src='https://prodigtv.ru/iptv/playlist/samoobnovlyaemyj'
[3]
name='IPTV каналы плейлист m3u без тормозов (poiskpmr)'
desc='Самые популярные и актуальные жанры iptv каналов m3u в 2022 году'
pls='https://iptvmaster.ru/december.m3u'
src='https://poiskpmr.ru/blog/ip-kanaly-plejlist-m3u-bez-tormozov-b256'
[4]
name='Самообновляемый IPTV плейлист 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/iptv-playlist.m3u'
src='https://iptv-russia.ru/playlists/iptv-playlist/'
[5]
name='IPTV плейлист с миксом ТВ каналов 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/mix.m3u'
src='https://iptv-russia.ru/playlists/mix/'
[p1]
name='Каналы в SD и HD качестве (smarttvnews.ru)'
desc='Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года'
pls='https://smarttvnews.ru/apps/iptvchannels.m3u'
src='https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/'
[p2]
name='Самообновляемый iptv плейлист 2022 июнь (smarttvnews.ru)'
desc='Лучший самообновляемый IPTV плейлист в 2022 году'
pls='https://smarttvnews.ru/apps/freeiptv.m3u'
src='https://smarttvnews.ru/samoobnovlyaemyj-iptv-plejlist/'
[p4]
name='IPTV плейлист на июль 2020 iptvm3u.ru'
name='IPTV плейлист на июль 2020 (iptvm3u.ru)'
desc='Плейлист содержит 1200+ ТВ каналов всех категорий (музыка, спорт, детские, образовательные, взрослые). Так же в файле есть каналы Украины, Белоруссии, Молдовы. Для удобства каналы других стран расположены в низу списка.'
pls='https://iptvm3u.ru/0720.m3u'
src='https://iptvm3u.ru/iptv-plejlist-na-ijul-2/'
@ -23,10 +53,7 @@ pls='https://iptv-playlisty.ru/wp-content/uploads/m3u/2020.m3u'
src='https://iptv-playlisty.ru/collection/samyj-svezheobnovlennyj-plejlist-iptv-na-2020-god/'
[p6]
name='Плейлист от smarttvnews'
desc=''
pls='https://smarttvnews.ru/apps/iptvchannels.m3u'
src='https://ottfox.net/articles/samoobnovlyaemue-pleylistu-iptv.html'
redirect='p1'
[kid1]
name='Детский IPTV «Kids»'
@ -71,11 +98,23 @@ pls='https://iptvmaster.ru/news.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[mus]
name='Музыкальные'
name='Музыкальные 1'
desc=
pls='https://iptvmaster.ru/music.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[mus1]
name='Музыкальные 2 (smarttvnews.ru)'
desc='IPTV плейлист музыкальных каналов 2022'
pls='https://smarttvnews.ru/apps/music.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[mus2]
name='IPTV плейлист с музыкальными каналами (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/music.m3u'
src='https://iptv-russia.ru/playlists/music/'
[ser]
name='Сериалы'
desc=
@ -112,6 +151,12 @@ desc=
pls='https://pastebin.com/raw/jLaRge54'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[kino6]
name='IPTV плейлист с кино, сериалами и мультфильмами 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/cinematic.m3u'
src='https://iptv-russia.ru/playlists/cinematic/'
[ru1]
name='Русские 1'
desc=
@ -142,12 +187,84 @@ desc=
pls='http://iptv.ktkru.ru/playlist.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[ru7]
name='IPTV плейлист с ТВ каналами России 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/ru-all.m3u'
src='https://iptv-russia.ru/playlists/ru-all/'
[reg]
name='IPTV Плейлист — Региональные каналы России (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/ru-regional.m3u'
src='https://iptv-russia.ru/playlists/ru-regional/'
[ua1]
name='Украинские IPTV каналы (smarttvnews.ru)'
desc=''
pls='https://smarttvnews.ru/apps/ukraine.m3u'
src='https://smarttvnews.ru/iptv-plejlist-ukrainskih-kanalov/'
[ua2]
name='Украинские 2'
desc=
desc=''
pls='https://iptvmaster.ru/ukraine.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[ua3]
name='IPTV плейлист с ТВ каналами Украины 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/ua-all.m3u'
src='https://iptv-russia.ru/playlists/ua-all/'
[ua4]
name='IPTV m3u плейлист Украина самообновляемый 2022 (tva.org.ua)'
desc='IPTV плейлист m3u бесплатных украинских каналов на 29 мая 2022 року'
pls='https://tva.org.ua/ip/u/iptv_ukr.m3u'
src='https://tva.org.ua/iptv-m3u-plejlist-ukraina-samoobnovlyaemyj.html'
[by]
name='IPTV плейлист с ТВ каналами Беларуси 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/by-all.m3u'
src='https://iptv-russia.ru/playlists/by-all/'
[arm]
name='IPTV плейлист с ТВ каналами Армении 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/arm-all.m3u'
src='https://iptv-russia.ru/playlists/all-arm/'
[uz]
name='IPTV плейлист с ТВ каналами Узбекистана 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/uz-all.m3u'
src='https://iptv-russia.ru/playlists/uz-all/'
[uz]
name='IPTV плейлист с ТВ каналами Казахстана 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/kz-all.m3u'
src='https://iptv-russia.ru/playlists/kz-all/'
[tr]
name='IPTV плейлист с ТВ каналами Турции и Азербайджана 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/tr-all.m3u'
src='https://iptv-russia.ru/playlists/tr-all/'
[usa]
name='IPTV плейлист с ТВ каналами США 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/usa-all.m3u'
src='https://iptv-russia.ru/playlists/usa-all/'
[ita]
name='IPTV плейлист с ТВ каналами Италии 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/ita-all.m3u'
src='https://iptv-russia.ru/playlists/ita-all/'
[m2]
name='Мультфильмы 2'
desc=
@ -196,12 +313,42 @@ desc=
pls='http://iptvm3u.ru/500newFilms.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[m10]
name='Детский Iptv плейлист с каналами и мультфильмами (smarttvnews.ru)'
desc=''
pls='https://smarttvnews.ru/apps/mult.m3u'
src='https://smarttvnews.ru/samoobnovlyaemyie-iptv-pleylistyi/'
[sci]
name='Познавательные'
desc=
desc=''
pls='https://iptvmaster.ru/poznavatelnoe.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[sci2]
name='IPTV плейлист с познавательными ТВ каналами 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/sci-all.m3u'
src='https://iptv-russia.ru/playlists/sci-all/'
[sp]
name='IPTV плейлист со спортивными каналами 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/sport-all.m3u'
src='https://iptv-russia.ru/playlists/sports-all/'
[cam]
name='IPTV плейлист с вебкамерами России и мира 2022 на июнь (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/webcams.m3u'
src='https://iptv-russia.ru/playlists/webcams/'
[cam2]
name='Веб камеры онлайн всего мира m3u (tva.org.ua)'
desc='Веб камеры со всего мира онлайн в формате m3u плейлиста iptv.'
pls='https://tva.org.ua/ip/web/web-kam-14.12.2021.m3u'
src='https://tva.org.ua/veb-kamery-onlayn-vsego-mira-m3u.html'
[r1]
name='Радио каналы 1'
desc=
@ -291,3 +438,15 @@ name='Каналы СНГ 14'
desc=
pls='http://gorod.tv/iptv.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[x]
name='IPTV плейлист для взрослых 2022 (smarttvnews.ru)'
desc='Рабочий IPTV плейлист с каналами и фильмами для взрослых'
pls='https://smarttvnews.ru/apps/xxx.m3u'
src='https://smarttvnews.ru/iptv-plejlist-dlya-vzroslyh/'
[x2]
name='IPTV плейлист для взрослых 2022 (iptv-russia.ru)'
desc=''
pls='https://iptv-russia.ru/list/xxx.m3u'
src='https://iptv-russia.ru/playlists/xxx/'

View File

@ -61,6 +61,7 @@ awk '
}
END {
print "--------------------"
print "Playlist: " ARGV[1]
print "Check stats"
print "- Success:\t" success_count "/" total_count
print "- Failed: \t" fail_count "/" total_count