1

Тема: Collaps

Балансер Collaps что-то у себя подкрутил в результате полученная прямая ссылка выдает сообщение

Status Code: 409 Conflict

и не проигрывается.

Возьмем например ссылку

 https://c.epizod.life/12276-mirage-1-season.html

, где видим плеер

https://api1625847679.tobaco.ws/embed/movie/18349?season=1

там зарыт json

seasons:[{"season":1,"blocked":false,"episodes":[{"episode":"1","id":193441,"dash":"https://test.streamvid.club/05_20/09/00/I6CTN3OY/538283.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3077,"title":"Мираж (1 сезон) - 1 серия","download":""},{"episode":"2","id":193440,"dash":"https://test.streamvid.club/05_20/09/00/RMAQULXQ/538282.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/00/U7MKCDTP/NJ2QPW53.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3067,"title":"Мираж (1 сезон) - 2 серия","download":""},{"episode":"3","id":193443,"dash":"https://test.streamvid.club/05_20/09/00/75HY44IQ/538285.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/00/LOCMLKP3/PFKVPNQW.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3286,"title":"Мираж (1 сезон) - 3 серия","download":""},{"episode":"4","id":193442,"dash":"https://test.streamvid.club/05_20/09/00/GL7IEGNW/538284.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/00/NXU7PISL/3DTGYPTO.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3249,"title":"Мираж (1 сезон) - 4 серия","download":""},{"episode":"5","id":193641,"dash":"https://test.streamvid.club/05_20/09/17/W2UN3OLE/538524.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/16/CJ34ED75/U4QRLLDS.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3148,"title":"Мираж (1 сезон) - 5 серия","download":""},{"episode":"6","id":193642,"dash":"https://test.streamvid.club/05_20/09/16/HUXMDQEI/538525.mpd","hls":"https://test.streamvid.club/05_09_20/05/09/16/6ZMTRZGO/3Y5TSF3H.mp4/master.m3u8","audio":{"names":["Cold Film"],"order":[0]},"duration":3229,"title":"Мираж (1 сезон) - 6 серия","download":""}]}]
            },
            qualityByWidth: {"1280":1080,"640":480,"864":720},
            p2p: {
                geo: ["RU","","12714"],
                tolerance:  4 ,
                tracker: "wss://t5.zcvh.net/v1/ws",
                longDownload: 30 * 1000
            }
        });

        var id = 193441 ;
        var videoKey = 538283 ;
        var eventFranchiseID = 18349 ;

        function listenChangeEpisode(player) {
            player.on('playlistItem', function (data) {
                post({
                    event: 'changeEpisode',
                    id: data.id,
                    episode: data.episode,
                    season: data.season
                });
                id = data.id;
                document.title = data.title;

                try {
                    var franch = location.pathname.split('/').slice(-1)[0];
                    if (!/\d+/.test(franch)) return;
                    document.cookie = 'vp' + franch + '=' + data.season + ':' + data.episode +
                        ';domain=.' + location.hostname.split('.').slice(1).join('.') +
                        ';expires=' + new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 10).toUTCString();
                } catch (e) {
                }
                middleCount = 0;
            });
        }
    </script>

    </body>
    </html>

dash меня не интересует, мой ТВ его не проигрывает, поэтому берем hls

https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/master.m3u8

Вроде бы все классно, длительность видео определяет и не стартует.
Если это master.m3u8 скачать видим

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="default",DEFAULT=YES,AUTOSELECT=YES,URI="https://5119510610.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-a1.m3u8"
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1020580,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1280x648,AUDIO="audio0",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://5119510610.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=406405,CODECS="avc1.640016,mp4a.40.2",RESOLUTION=640x324,AUDIO="audio0",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://5119510610.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v2.m3u8
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=56303,CODECS="avc1.64001f",RESOLUTION=1280x648,VIDEO-RANGE=SDR,URI="https://5119510610.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=22351,CODECS="avc1.640016",RESOLUTION=640x324,VIDEO-RANGE=SDR,URI="https://5119510610.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v2.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="failover-audio-0",NAME="default",DEFAULT=YES,AUTOSELECT=YES,URI="https://5121020934.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-a1.m3u8"
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1020580,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1280x648,AUDIO="failover-audio-0",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://5121020934.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v1.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="failover-audio-1",NAME="default",DEFAULT=YES,AUTOSELECT=YES,URI="https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-a1.m3u8"
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1020580,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1280x648,AUDIO="failover-audio-1",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=406405,CODECS="avc1.640016,mp4a.40.2",RESOLUTION=640x324,AUDIO="failover-audio-0",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://5121020934.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v2.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=406405,CODECS="avc1.640016,mp4a.40.2",RESOLUTION=640x324,AUDIO="failover-audio-1",FRAME-RATE=23.974,VIDEO-RANGE=SDR
https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v2.m3u8
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=56303,CODECS="avc1.64001f",RESOLUTION=1280x648,VIDEO-RANGE=SDR,URI="https://5121020934.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=56303,CODECS="avc1.64001f",RESOLUTION=1280x648,VIDEO-RANGE=SDR,URI="https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=22351,CODECS="avc1.640016",RESOLUTION=640x324,VIDEO-RANGE=SDR,URI="https://5121020934.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v2.m3u8"
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=22351,CODECS="avc1.640016",RESOLUTION=640x324,VIDEO-RANGE=SDR,URI="https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/iframes-v2.m3u8"

Все как обычно. Но если раньше, полученные ссылки можно было просмотреть, то теперь, например вот по этой ссылке

https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/index-v2.m3u8

полученные сегменты например
https://test.streamvid.club/05_23_19/05 … eg-3-a1.ts
дают ошибку Conflict 409
На компьютере, в отладчике, плеер запускает что-то другое, не hls, имеет вот такой вид

https://51918258.streamvid.club/x-en-x/khbxkvL1Ya8cky8aRC8cFn8cRC9OkwkbBvkjmn82YvbGFhL4Ra9JMre0YoKezr0=

2 (2021.07.13 18:44:28 отредактировано hokkonorti)

Re: Collaps

smsbox3 пишет:

Балансер Collaps что-то у себя подкрутил в результате полученная прямая ссылка выдает сообщение

Status Code: 409 Conflict

и не проигрывается.

Добрый день. Удалось решить?

3

Re: Collaps

Мне нет, надо разворачивать что-то что будет трафик перехватывать, чтобы посмотреть что за пакеты теперь колапс отдает. hls и dash они не отдают, выводят фейковую ошибку, Conflict, но так как ТВ запускает плеер колапса и показывает, можно предположить, что не что-то новое они отдают, а хорошо известное.

4 (2021.07.13 22:08:25 отредактировано smsbox3)

Re: Collaps

Что я вижу,

https://test.streamvid.club/x-en-x/[b]khbxkGLGYa8cky8aRC8cFn8cRC9OkwkbBvkjmn81RGQaFhRuMWlw[/b]

при

Host: test.streamvid.club
Origin: https://api1625847679.tobaco.ws
Referer: https://api1625847679.tobaco.ws/

Если первую ссылку подгрузить,там xml, выходит dash все таки работает?

+ открыть спойлер
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT3077.990966796875S" minBufferTime="PT2S">
  <BaseURL>https://1856689131.streamvid.club/05_20/09/00/I6CTN3OY/</BaseURL>
  <BaseURL>https://512101159.streamvid.club/05_20/09/00/I6CTN3OY/</BaseURL>
  <BaseURL>https://test.streamvid.club/05_20/09/00/I6CTN3OY/</BaseURL>
  <Period id="0">
    <AdaptationSet id="1" segmentAlignment="true" lang="ru0" contentType="audio">
      <Representation mimeType="audio/webm" audioSamplingRate="48000" bandwidth="78060" codecs="opus" id="2">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
        <SegmentTemplate initialization="4.538283-0/init.webm" media="4.538283-0/$Number$.webm" startNumber="1" timescale="1000000">
          <SegmentTimeline>
            <S t="0" d="6001000"></S>
            <S t="6001000" d="6000000" r="510"></S>
            <S t="3072001000" d="5921000"></S>
          </SegmentTimeline>
        </SegmentTemplate>
      </Representation>
    </AdaptationSet>
    <AdaptationSet frameRate="1000000/42000" id="0" segmentAlignment="true" par="2:1" maxWidth="864" maxHeight="432" contentType="video">
      <Representation sar="1:1" mimeType="video/webm" bandwidth="2669777" codecs="vp09.00.30.08.00.01.01.01.00" height="432" id="0" width="864">
        <SegmentTemplate initialization="7.538283/init.webm" media="7.538283/$Number$.webm" startNumber="1" timescale="1000000">
          <SegmentTimeline>
            <S t="0" d="10010000" r="306"></S>
            <S t="3073070000" d="4921000"></S>
          </SegmentTimeline>
        </SegmentTemplate>
      </Representation>
      <Representation sar="81:80" mimeType="video/webm" bandwidth="1093538" codecs="vp09.00.21.08.00.01.01.01.00" height="324" id="1" width="640">
        <SegmentTemplate initialization="6.538283/init.webm" media="6.538283/$Number$.webm" startNumber="1" timescale="1000000">
          <SegmentTimeline>
            <S t="0" d="10010000" r="306"></S>
            <S t="3073070000" d="4921000"></S>
          </SegmentTimeline>
        </SegmentTemplate>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>
MPD-это описание ресурсов, образующих потоковую службу, которые клиент DASH использует для определения того, какие ресурсы запрашивать.

Играет сегменты
https://512101159.streamvid.club/x-en-x/khbxkGLGYa8cky8aRC8cFn8cRC9OkwkbBvkjmn82YvbGFhL4Ra9JMre0YoKezr0=
https://512101159.streamvid.club/x-en-x/khbxkGLGYa8cky8aRC8cFn8cRC9OkwkbBvkjmn80YvbGFhL4Ra0cY2euHWAuK2ypMA==
для адрес сравнения описания  MPD
https://test.streamvid.club/x-en-x/khbxkGLGYa8cky8aRC8cFn8cRC9OkwkbBvkjmn81RGQaFhRuMWlw
А вот dash в старом формате из заголовка, который сейчас не работает

https://test.streamvid.club/05_20/09/00/I6CTN3OY/538283.mpd

Выходит сейчас проигрывает  dash, возможно можно и m3u8 вытащить, но не из заголовка, как раньше.

5 (2021.07.14 10:32:21 отредактировано hokkonorti)

Re: Collaps

наконец-то получилось сгенерировать ссылку которая должна воспроизводиться

const
                    g = "/x-en-x/",
                    b = Date.now();
                let v;
                function w(e) {
                    if (null == v || L(e)) return e;
                    const t = Date.now() + v,
                        n = Math.round(t / 1e3 / 60 / 60),
                        o = new URL(e);
                    return o.origin + g + E(btoa(n + "/" + o.pathname + o.search));
                }
                const L = (e) => e.includes(g),
                    E = (e) => e.split("").map(T).join("");
                function T(e) {
                    const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(e);
                    return t > -1 ? "DlChEXitLONYRkFjAsnBbymWzSHMqKPgQZpvwerofJTVdIuUcxaG"[t] : e;
                }
                C = 1626244290; /* x.unixTime; */
                v = 1e3 * C - b;
                console.log(
                    w("https://test.streamvid.club/07_12_21/07/12/11/SHRW6VHJ/NAMGER3T.mp4/master.m3u8")
                    ===
                    'https://test.streamvid.club/x-en-x/khbxkGR1Ya8ck18xRe8aRn8cka8xRp8xRn9BnXOWkeSLnp9FAb1tsyLGyC5IqhAUMmXGKiyaYr0GKBQ='
                );

теперь бы придумать как плеер заставить менять ссылки на сегменты не генерировав файл m3u8 на сервере )))))

Спасибо сказали: smsbox31

6

Re: Collaps

hokkonorti пишет:

теперь бы придумать как плеер заставить менять ссылки на сегменты не генерировав файл m3u8 на сервере )))))

Они каждый сегмент шифруют?

7 (2021.07.14 23:59:35 отредактировано hokkonorti)

Re: Collaps

smsbox3 пишет:

Они каждый сегмент шифруют?

Да. В этом и проблема))

8

Re: Collaps

hokkonorti пишет:

Да. В этом и проблема))

ну если делать под playerjs
тогда перед инициализацией ставьте


Hls.DefaultConfig.xhrSetup = function(xhr, url) {

  if (!url.includes('.m3u8') && url.includes('.streamvid.')) {
    if (!url.includes('/x-en-x/')) {
      var nd = Math.round(Date.now() / 1000 / 60 / 60),
        rd = new URL(url);
      segment = btoa(nd + "/" + rd.pathname + rd.search);

      segment = segment.split("").map(
        (e) => {
          var ddt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(e);
          return -1 < ddt ? "DlChEXitLONYRkFjAsnBbymWzSHMqKPgQZpvwerofJTVdIuUcxaG" [ddt] : e
        }
      ).join("");



      url = rd.origin + '/x-en-x/' + segment;
    }
  }
  xhr.open("GET", url, !0);
};

а потом
var player = new Playerjs(.....)

Спасибо сказали: smsbox31

9

Re: Collaps

eugene.php7 пишет:

ну если делать под playerjs

для андроид приложения )
на сайте их плеер показывается, а вот для приложения приходится выдергивать ссылки на m3u8/mp4 файлы

10

Re: Collaps

А под php не поясните как сделать?

11

Re: Collaps

Чисто на php решения вероятно нет, там каждый сегмент требует дешифроки перед проигрыванием. eugene.php7 предложил другое решение, на php мы получаем ссылку на m3u8 ( которая не работает), получаем ее из плеера колапса выдергивая вот из этого

"hls":"https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/master.m3u8",

А далее определяем плеер playerjs в javascript-е

var count_error;
var player = new Playerjs({id:"player", file:'<?=$s1?>'});

где в переменной $s1 у меня находится выдернутая из плеера колапса ссылка

https://test.streamvid.club/05_09_20/05/09/00/2Y2JDRLZ/MWKTGJ5T.mp4/master.m3u8

перед инициализацией ставим код из https://hms.lostcut.net/viewtopic.php?pid=17898#p17898
И javascript производит дешифровку ссылок. Все работает отлично. Большая благодарность eugene.php7 за отличное решение проблемы. Однако, если вам не под Playerjs надо, то я не знаю, как переделать.

12

Re: Collaps

На php можно сделать, просто генерировать m3u8 файл с прописанным в нем путями на сегменты
Я так сделал на java - чтоб генерировался m3u8 файл и сохранялся у пользователя на sdcard'е и уже он в плеере открывался - напомню - у меня андроид приложение, а в веб версии используется плеер collaps

Спасибо сказали: smsbox31

13

Re: Collaps

hokkonorti пишет:

На php можно сделать, просто генерировать m3u8 файл с прописанным в нем путями на сегменты

Здравствуйте может кто подскажет как это сделать.Спасибо

14 (2021.08.30 10:41:20 отредактировано hokkonorti)

Re: Collaps

bond пишет:

Здравствуйте может кто подскажет как это сделать.Спасибо

могу. но мне нужна документация api коллапса. сохраните в pdf все страницы где про api и скиньте мне в личку

15

Re: Collaps

bond пишет:

Здравствуйте может кто подскажет как это сделать.Спасибо

готово

+ открыть спойлер
<?php

header('Content-Type: application/vnd.apple.mpegurl');

$iframe = $_GET['iframe'];
// $iframe = 'https://api1631112020.tobaco.ws/embed/movie/44194?season=1&episode=1';
// $iframe = 'https://api1631112020.tobaco.ws/embed/movie/44194?season=1&episode=1&oneSound=HDRezka%20Studio';

$iframe = $iframe.'&showPreNext=false&sharing=false&noPreview=true&showMenu=false';

function json_parse($str) {
    $str = trim(preg_replace([
        '#^\s*//(.+)$#m', '#^\s*/\*(.+)\*/#Us', '#/\*(.+)\*/\s*$#Us'
    ], '', $str));
    switch (strtolower($str)) {
    case 'true':
        return true;
    case 'false':
        return false;
    case 'null':
        return null;
    default:
        $m = [];
    if (is_numeric($str)) {
        return (((float)$str == (integer)$str) ? (integer)$str : (float)$str);
    }else if (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
        $delim = substr($str, 0, 1);
        $utf8 = '';
        $strlen_chrs = strlen(($chrs = substr($str, 1, -1)));
        for ($c = 0; $c < $strlen_chrs; ++$c) {
            $substr_chrs_c_2 = substr($chrs, $c, 2);
            $ord_chrs_c = ord($chrs{$c});
            switch (true) {
                case $substr_chrs_c_2 == '\b':
                    $utf8 .= chr(0x08);
                    ++$c;
                break;
                case $substr_chrs_c_2 == '\t':
                    $utf8 .= chr(0x09);
                    ++$c;
                break;
                case $substr_chrs_c_2 == '\n':
                    $utf8 .= chr(0x0A);
                    ++$c;
                break;
                case $substr_chrs_c_2 == '\f':
                    $utf8 .= chr(0x0C);
                    ++$c;
                break;
                case $substr_chrs_c_2 == '\r':
                    $utf8 .= chr(0x0D);
                    ++$c;
                break;
                case $substr_chrs_c_2 == '\\"':
                case $substr_chrs_c_2 == '\\\'':
                case $substr_chrs_c_2 == '\\\\':
                case $substr_chrs_c_2 == '\\/':
                    if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"'))
                        $utf8 .= $chrs{++$c};
                break;
                case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
                    $utf8 .= $chrs{$c};
                break;
                case ($ord_chrs_c & 0xE0) == 0xC0:
                    $utf8 .= substr($chrs, $c, 2);
                    ++$c;
                break;
                case ($ord_chrs_c & 0xF0) == 0xE0:
                    $utf8 .= substr($chrs, $c, 3);
                    $c += 2;
                break;
                case ($ord_chrs_c & 0xF8) == 0xF0:
                    $utf8 .= substr($chrs, $c, 4);
                    $c += 3;
                break;
                case ($ord_chrs_c & 0xFC) == 0xF8:
                    $utf8 .= substr($chrs, $c, 5);
                    $c += 4;
                break;
                case ($ord_chrs_c & 0xFE) == 0xFC:
                    $utf8 .= substr($chrs, $c, 6);
                    $c += 5;
                break;
            }
        }
        return $utf8;
    }else if (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
        if ($str{0} == '[') {
            $stk = array(3);
            $arr = [];
        }else{
            $stk = array(4);
            $obj = new stdClass();
        }
        array_push($stk, ['what'  => 1, 'where' => 0, 'delim' => false]);
        $chrs = trim(preg_replace([
            '#^\s*//(.+)$#m', '#^\s*/\*(.+)\*/#Us', '#/\*(.+)\*/\s*$#Us'
        ], '', substr($str, 1, -1)));
        if ($chrs == '')
            return ((reset($stk) == 3) ? $arr : $obj);
        $strlen_chrs = strlen($chrs);
        for ($c = 0; $c <= $strlen_chrs; ++$c) {
            $top = end($stk);
            $substr_chrs_c_2 = substr($chrs, $c, 2);
            if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == 1))) {
                $slice = substr($chrs, $top['where'], ($c - $top['where']));
                array_push($stk, array('what' => 1, 'where' => ($c + 1), 'delim' => false));
                if (reset($stk) == 3)
                    array_push($arr, json_parse($slice));
                else if (reset($stk) == 4) {
                    $parts = [];
                    if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts))
                        $obj->{json_parse($parts[1])} = json_parse($parts[2]);
                    else if (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts))
                        $obj->{$parts[1]} = json_parse($parts[2]);
                }
            }else if ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != 2))
                array_push($stk, array('what' => 2, 'where' => $c, 'delim' => $chrs{$c}));
            else if (($chrs{$c} == $top['delim']) && ($top['what'] == 2) && ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1))
                array_pop($stk);
            else if (($chrs{$c} == '[') && in_array($top['what'], array(1, 3, 4)))
                array_push($stk, array('what' => 3, 'where' => $c, 'delim' => false));
            else if (($chrs{$c} == ']') && ($top['what'] == 3))
                array_pop($stk);
            else if (($chrs{$c} == '{') && in_array($top['what'], array(1, 3, 4)))
                array_push($stk, array('what' => 4, 'where' => $c, 'delim' => false));
            elseif (($chrs{$c} == '}') && ($top['what'] == 4))
                array_pop($stk);
            elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(1, 3, 4))) {
                array_push($stk, array('what' => 5, 'where' => $c, 'delim' => false));
                $c++;
            }else if (($substr_chrs_c_2 == '*/') && ($top['what'] == 5)) {
                array_pop($stk);
                $c++;
                for ($i = $top['where']; $i <= $c; ++$i) {
                    $chrs = substr_replace($chrs, ' ', $i, 1);
                }
            }
        }
        if (reset($stk) == 3)
            return $arr;
        else if (reset($stk) == 4)
            return $obj;
        }
    }
}
$hls = json_parse(preg_replace('/"(\d+)":/', '"_$1":', '{'.explode(');', explode('makePlayer({', file_get_contents($iframe))[1])[0].'}'))->source->hls;
$path = preg_replace('/\/master.m3u8/', '/', $hls);
$hls = $path.'index-v1-a1.m3u8';
// $hls = $path.'index-v1-a3.m3u8';

function w($e) {
    $nd = round(time() / 60 / 60);
    $rd = parse_url($e);
    return $rd['scheme'].'://'.$rd['host'].'/x-en-x/'.implode(array_map(function($e) {
        $ddt = strpos('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', $e);
        return ($ddt === false ? $e : 'DlChEXitLONYRkFjAsnBbymWzSHMqKPgQZpvwerofJTVdIuUcxaG'[$ddt]);
    }, str_split(base64_encode($nd.'/'.$rd['path']))));
    return $e;
}
echo implode("\n", array_map(function($v) use ($path) {
    return (($v && (strrpos($v, '#') === false)) ? w($path.$v) : $v);
}, explode("\n", file_get_contents($hls))));
Спасибо сказали: smsbox3, bond, foks5050, Dimon1978pl4

16

Re: Collaps

Гениально Спасибо!

17

Re: Collaps

Collaps долго работал без защиты но ведать загрузили сервер нормально