0
0
mirror of https://github.com/anthonyaxenov/iptv.git synced 2024-11-01 01:26:00 +00:00

Compare commits

..

No commits in common. "efc1324b58895e3bf86a62b6ddd169fa484b3f0f" and "a1bc21c050c34a21ed4c4b6780907279042c2101" have entirely different histories.

2 changed files with 260 additions and 230 deletions

239
index.php
View File

@ -24,15 +24,13 @@ if (!empty($_GET['getinfo'])) {
curl_close($ch); curl_close($ch);
unset($ch); unset($ch);
$matches = []; $matches = [];
preg_match_all("/^#EXTINF:-?[\d](?:(\s?url-tvg=\".*\")?(\stvg-logo=\".*\")?(\stvg-name=\".*\")?(\sgroup-title=\".*\")?)\s?,\s?(.*)/m", preg_match_all("/^#EXTINF:-?\d[\s]?,[\s]?(.*$)/m", $content, $matches);
$content, $matches);
unset($content); unset($content);
$channels = $matches[5]; $channels = $matches[1];
unset($matches); unset($matches);
$is_online = is_array($headers) && !empty($headers) && strpos($headers[0], ' 200') !== false; $is_online = is_array($headers) && !empty($headers) && strpos($headers[0], ' 200') !== false;
unset($headers); unset($headers);
array_walk($channels, function (&$str) { $str = trim($str); }); array_walk($channels, function (&$str) { $str = trim($str); });
header("Content-Type: text/plain; charset=utf-8");
die(json_encode([ die(json_encode([
'is_online' => $is_online, 'is_online' => $is_online,
'count' => $is_online ? count($channels) : '-', 'count' => $is_online ? count($channels) : '-',
@ -62,7 +60,7 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
</head> </head>
<body class="bg-dark text-light"> <body class="bg-dark text-light">
<div class="col-lg-8 mx-auto p-3 py-md-5"> <div class="col-lg-8 mx-auto p-3 py-md-5">
<header class="pb-3 mb-3"> <header class="pb-3 mb-5 border-bottom">
<a href="/" class="text-light text-decoration-none"> <a href="/" class="text-light text-decoration-none">
<h1>Самообновляемые плейлисты IPTV</h1> <h1>Самообновляемые плейлисты IPTV</h1>
</a> </a>
@ -74,146 +72,105 @@ if (array_intersect(array_keys($_GET), array_keys($ini))) {
</header> </header>
<main> <main>
<ul class="nav nav-tabs" id="myTab" role="tablist"> <div class="container">
<li class="nav-item" role="presentation"> <p>
<button class="nav-link active" id="list-tab" data-bs-toggle="tab" data-bs-target="#list" type="button" На этой странице собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе.
role="tab" aria-controls="list" aria-selected="true">Список</button> Они бесплатны для использования. Список плейлистов отбирается мной вручную и проверяется здесь автоматически.
</li> Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
<li class="nav-item" role="presentation"> Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
<button class="nav-link" id="faq-tab" data-bs-toggle="tab" data-bs-target="#faq" type="button" </p>
role="tab" aria-controls="faq" aria-selected="false">FAQ</button> <p>Чтобы подключить плейлист, нужно в настройках IPTV-плеера указать ссылку из последней колонки.</p>
</li> </div>
</ul>
<div class="tab-content" id="myTabContent"> <div class="container py-5">
<div class="tab-pane fade show active pt-5" id="list" role="tabpanel" aria-labelledby="list-tab"> <h2>Пояснение статусов проверки плейлистов</h2>
<table class="table table-dark table-hover small"> <ui>
<thead> <li>
<tr> <span class="badge small bg-warning text-dark">?</span> Загрузка данных.
<th>ID</th> </li>
<th>Информация о плейлисте</th> <li>
<th>Каналов</th> <span class="badge small text-dark bg-success">online</span> Плейлист активен. В этом случае, возможно,
<th title="Нажми на ссылку, чтобы скопировать её в буфер обмена">Ссылка</th> даже подгрузится список и количество каналов, но корректность этих данных не гарантируется. А если нет,
</tr> то следует проверить плейлист вручную.
</thead> </li>
<tbody> <li>
<?php <span class="badge small text-dark bg-secondary">unknown</span> Состояние неизвестно.
foreach ($ini as $id => $element) { Скорее всего, плейлист активен, но получить данные о нём не удалось. Следует проверить вручную.
if (empty($element['pls'])) { </li>
continue; <li>
} <span class="badge small text-dark bg-secondary">timeout</span> Не удалось вовремя проверить плейлист.
?> </li>
<tr class="pls" data-playlist-id="<?=$id?>"> <li>
<td class="text-center id"> <span class="badge small text-dark bg-danger">offline</span> Плейлист неактивен.
<strong><?=$id?></strong> </li>
</td> <li>
<td class="info"> <span class="badge small text-dark bg-danger">error</span> Ошибка при проверке плейлиста.
<strong><?=$element['name'] ?: "Плейлист #" . $id?></strong> </li>
<span class="badge small bg-warning text-dark status">?</span> </ui>
<div class="small"> </div>
<a href="<?=$element['pls']?>"
target="_blank" <div class="container py-5">
rel="noopener nofollow">M3U</a> <h2>Список плейлистов</h2>
<table class="table table-dark table-hover">
<thead>
<tr>
<th>ID</th>
<th>Информация о плейлисте</th>
<th>Каналов</th>
<th title="Нажмите на ссылку, чтобы скопировать её в буфер обмена">Ссылка</th>
</tr>
</thead>
<tbody>
<?php
foreach ($ini as $id => $element) {
if (empty($element['pls'])) {
continue;
}
?>
<tr class="pls" data-playlist-id="<?=$id?>">
<td class="text-center id">
<strong><?=$id?></strong>
</td>
<td class="info">
<strong><?=$element['name'] ?: "Плейлист #" . $id?></strong>
<span class="badge small bg-warning text-dark status">?</span>
<div class="small">
<a href="<?=$element['pls']?>"
target="_blank"
rel="noopener nofollow">M3U</a>
<?php
if (!empty($element['src'])) { ?>
| <a href="<?=$element['src']?>"
target="_blank"
rel="noopener nofollow">Источник</a>
<?php <?php
if (!empty($element['src'])) { ?> } ?>
| <a href="<?=$element['src']?>" <?php
target="_blank" if (!empty($element['desc'])) { ?>
rel="noopener nofollow">Источник</a> <br/><p class="my-1"><?=$element['desc']?></p>
<?php
} ?>
<?php <?php
if (!empty($element['desc'])) { ?> } ?>
<br/><p class="my-1"><?=$element['desc']?></p> </div>
<?php </td>
} ?> <td class="text-center count">
</div> <div class="spinner-border text-success" role="status">
</td> <span class="visually-hidden">загрузка...</span>
<td class="text-center count"> </div>
<div class="spinner-border text-success" role="status"> </td>
<span class="visually-hidden">загрузка...</span> <td class="col-3">
</div> <span onclick="prompt('Скопируйте адрес плейлиста', '<?=$my_url?><?=$id?>')"
</td> data-bs-toggle="tooltip"
<td class="col-3"> data-bs-placement="top"
<span onclick="prompt('Скопируй адрес плейлиста', '<?=$my_url?><?=$id?>')" title="Нажмите на ссылку, чтобы скопировать её в буфер обмена"
data-bs-toggle="tooltip" class="font-monospace">
data-bs-placement="top"
title="Нажми на ссылку, чтобы скопировать её в буфер обмена"
class="font-monospace">
<?=$my_url?><?=$id?> <?=$my_url?><?=$id?>
</span> </span>
</td> </td>
</tr> </tr>
<?php <?php
} ?> } ?>
</tbody> </tbody>
</table> </table>
</div>
<div class="tab-pane fade p-3 pt-5" id="faq" role="tabpanel" aria-labelledby="profile-tab">
<h2>Что здесь происходит?</h2>
<p class="mb-5">
На этой странице собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе.
Они отбираются мной вручную и проверяются здесь автоматически.
Поддержкой этих плейлистов занимаются администраторы ресурсов, указанные как источник.
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
</p>
<h2>Эти плейлисты бесплатны?</h2>
<p class="mb-5">Да, но в любой момент могут перестать таковыми быть.</p>
<h2>Как подключить плейлист?</h2>
<p class="mb-5">
<a href="https://www.google.com/search?q=%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C%20iptv%20%D0%BF%D0%BB%D0%B5%D0%B9%D0%BB%D0%B8%D1%81%D1%82%20%D0%BF%D0%BE%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B5">
Добавить в твой IPTV-плеер</a> ссылку из последней колонки.
</p>
<h2>Что означают статусы плейлистов?</h2>
<ul class="mb-5">
<li>
<span class="badge small bg-warning text-dark">?</span> Загрузка данных.
</li>
<li>
<span class="badge small text-dark bg-success">online</span> Плейлист активен. Фактически
означает, что удалённый файл успешно скачивается.
</li>
<li>
<span class="badge small text-dark bg-secondary">unknown</span> Состояние неизвестно. Скорее всего, плейлист активен, но получить данные о нём не удалось.
</li>
<li>
<span class="badge small text-dark bg-secondary">timeout</span> Не удалось вовремя проверить плейлист.
</li>
<li>
<span class="badge small text-dark bg-danger">offline</span> Плейлист неактивен.
</li>
<li>
<span class="badge small text-dark bg-danger">error</span> Ошибка при проверке плейлиста.
</li>
</ul>
<h2>Почему нельзя доверять результатам проверки?</h2>
<p>
Я не гарантирую корректность информации, которую ты увидишь здесь.
Рекомендую проверять желаемые плейлисты вручную, ибо нет никаких гарантий:
</p>
<ul class="mb-5">
<li>
что это вообще плейлисты, а не чьи-то архивы с мокрыми кисками;
</li>
<li>
что плейлисты по разным ссылкам не дублируют друг друга и отличаются каналами хотя бы на четверть;
</li>
<li>
что плейлист работоспособен (каналы работают, корректно названы, имеют аудио, etc.);
</li>
<li>
что подгрузится корректное количество каналов и их список (хотя на это я ещё могу влиять и
стараюсь как-то улучшить).
</li>
</ul>
<h2>Как пополнить этот список?</h2>
<p class="mb-5">
Сделать pull-request в <a href="https://github.com/anthonyaxenov/iptv">репозиторий</a>.
</p>
</div>
</div> </div>
</main> </main>

View File

@ -112,32 +112,26 @@ desc=
pls='https://iptvmaster.ru/music.m3u' pls='https://iptvmaster.ru/music.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[ser] [kin1]
name='Сериалы' name='Фильмы1'
desc=
pls='http://bluecrabstv.do.am/serial.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[kino1]
name='Фильмы 1'
desc= desc=
pls='https://smarttvnews.ru/apps/Films.m3u' pls='https://smarttvnews.ru/apps/Films.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[kino2] [kin2]
name='Фильмы 2' name='Фильмы2'
desc= desc=
pls='http://iptvm3u.ru/500newFilms.m3u' pls='http://iptvm3u.ru/500newFilms.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[kino3] [kin3]
name='Фильмы 3' name='Фильмы3'
desc= desc=
pls='http://iptvm3u.ru/film1.m3u' pls='http://iptvm3u.ru/film1.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[kino4] [kin4]
name='Фильмы 4' name='Фильмы4'
desc= desc=
pls='http://iptvm3u.ru/film4.m3u' pls='http://iptvm3u.ru/film4.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
@ -316,6 +310,144 @@ desc=
pls='https://iptvmaster.ru/ukraine.m3u' pls='https://iptvmaster.ru/ukraine.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w1]
name='Каналы мира 1'
desc=
pls='https://www.tvbox.one/iptv/playlist.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w2]
name='Каналы мира 2'
desc=
pls='https://iptv-org.github.io/iptv/categories/business.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w3]
name='Каналы мира 3'
desc=
pls='https://iptv-org.github.io/iptv/categories/comedy.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w4]
name='Каналы мира 4'
desc=
pls='https://iptv-org.github.io/iptv/categories/documentary.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w5]
name='Каналы мира 5'
desc=
pls='https://iptv-org.github.io/iptv/categories/education.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w6]
name='Каналы мира 6'
desc=
pls='https://iptv-org.github.io/iptv/categories/entertainment.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w7]
name='Каналы мира 7'
desc=
pls='https://iptv-org.github.io/iptv/categories/family.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w8]
name='Каналы мира 8'
desc=
pls='https://iptv-org.github.io/iptv/categories/general.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w9]
name='Каналы мира 9'
desc=
pls='https://iptv-org.github.io/iptv/categories/kids.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w10]
name='Каналы мира 10'
desc=
pls='https://iptv-org.github.io/iptv/categories/legislative.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w11]
name='Каналы мира 11'
desc=
pls='https://iptv-org.github.io/iptv/categories/lifestyle.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w12]
name='Каналы мира 12'
desc=
pls='https://iptv-org.github.io/iptv/categories/local.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w13]
name='Каналы мира 13'
desc=
pls='https://iptv-org.github.io/iptv/categories/movies.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w14]
name='Каналы мира 14'
desc=
pls='https://iptv-org.github.io/iptv/categories/music.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w15]
name='Каналы мира 15'
desc=
pls='https://iptv-org.github.io/iptv/categories/news.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w16]
name='Каналы мира 16'
desc=
pls='https://iptv-org.github.io/iptv/categories/religious.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w17]
name='Каналы мира 17'
desc=
pls='https://iptv-org.github.io/iptv/categories/shop.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w18]
name='Каналы мира 18'
desc=
pls='https://iptv-org.github.io/iptv/categories/travel.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w19]
name='Каналы мира 19'
desc=
pls='https://iptv-org.github.io/iptv/categories/weather.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w20]
name='Каналы мира 20'
desc=
pls='https://iptv-org.github.io/iptv/categories/other.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w21]
name='Каналы мира 21'
desc=
pls='https://getsapp.ru/IPTV/12.18_18.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w22]
name='Каналы мира 22'
desc=
pls='https://iptvmaster.ru/spain.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[w23]
name='Каналы мира 23'
desc=
pls='https://iptvmaster.ru/azerbaijan.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[m1] [m1]
name='Мультфильмы 1' name='Мультфильмы 1'
desc= desc=
@ -340,65 +472,6 @@ desc=
pls='https://iptvmaster.ru/kids-all.m3u' pls='https://iptvmaster.ru/kids-all.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[m5]
name='Мультфильмы 5'
desc=
pls='https://smarttvnews.ru/apps/Films.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[m6]
name='Мультфильмы 6'
desc=
pls='http://iptvm3u.ru/film4.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[m7]
name='Мультфильмы 7'
desc=
pls='http://iptvm3u.ru/film2.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[m8]
name='Мультфильмы 8'
desc=
pls='http://iptvm3u.ru/film1.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[m9]
name='Мультфильмы 9'
desc=
pls='http://iptvm3u.ru/500newFilms.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[sci]
name='Познавательные'
desc=
pls='https://iptvmaster.ru/poznavatelnoe.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[r1]
name='Радио каналы 1'
desc=
pls='http://lradio.c1.biz/ltradio.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[r2]
name='Радио каналы 2'
desc=
pls='https://cdn.iptvmate.net/index.category.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[r3]
name='Радио каналы 3'
desc=
pls='https://iptvmaster.ru/radio.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[r4]
name='Радио каналы 4'
desc=
pls='http://2kom.tv/channels/radio.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv'
[sng1] [sng1]
name='Каналы СНГ 1' name='Каналы СНГ 1'
@ -472,26 +545,26 @@ desc=
pls='https://iptvmaster.ru/armenia.m3u' pls='https://iptvmaster.ru/armenia.m3u'
src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[sng13] [sci]
name='Каналы СНГ 13' name='Познавательные'
desc= desc=
pls='https://dl.dropboxusercontent.com/s/iw9v57cln6dfkpu/Vinnitsa.m3u' pls='https://iptvmaster.ru/poznavatelnoe.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[sng14] [r1]
name='Каналы СНГ 14' name='Радио каналы 1'
desc= desc=
pls='http://gorod.tv/iptv.m3u' pls='http://lradio.c1.biz/ltradio.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[sng15] [r2]
name='Каналы СНГ 15' name='Радио каналы 2'
desc= desc=
pls='http://motivation.pp.ua/Stabil_05_18.m3u' pls='https://cdn.iptvmate.net/index.category.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'
[sng16] [r3]
name='Каналы СНГ 16' name='Радио каналы 3'
desc= desc=
pls='http://ettytv.com/playlist/LLC_Uplink.m3u8' pls='https://iptvmaster.ru/radio.m3u'
src='https://iptvsensei.ru/samoobnovlyayemyye-pleylisty-iptv' src='https://iptvsensei.ru/novye-samoobnovlyaemye-plejlisty'