61

Re: Tree.TV (2017.04.19)

baat пишет:

а как с плейлистом на сериалы быть?

Не, этот метод только для получения потока конкретной серии (у них тоже свой id). Список серий получать можно и по id самого сериала, но тогда парсить json для этого нужно.

baat пишет:

а если указать их в статистике и не менять, не прокатит? обязательно каждый раз новые?
мне казалось, что главное, чтобы они во всех запросах совпадали...

Точно не знаю, но без них у меня не получилось. Значение куки UserEnter похоже на timestamp и переустанавливается не каждый раз. А значение в куках key устанавливается всегда разным при просмотре разных серий сериала даже с сайта и может быть зависит от запрашиваемого id (и бог знает от чего ещё). Да и так просто более надёжней - делать всё как будто мы с сайта смотрим. Чтобы там (на сервере) ни о чём не догадались. )

baat пишет:

значит не правильно понял принцип... я решил, что запрос один раз для получения p g, потом второй раз для s_key... после sck посчитал и получил ссылку в следующем запросе...

Я сам его не понял ещё. Но подозреваю, что два раза делать приходится из-за их алгоритма формирования s_key в ответе. Чтобы правильно посчитать skc нужно заранее знать некоторые параметры. Поэтому делается один запрос и потом второй со скорректированными p и g.
У себя в скрипте я тоже побоялся делать рекурсию. Там в javascript у них проверка, если после запроса в ответе p и g не совпадают с нашими отправленными - делать по циклу (вызывает свою функцию опять) - пока не совпадут.
Но по сути, после корректировки и запроса со второго раза в ответе те же самые p и g, что и при запросе. Только s_key отличается. Так что двух раз всегда достаточно. Но мало ли что у них там с сервером будет. А с первого раза будет только когда по какому-то стечению - в ответе будут равны значения с установленными изначально в скрипте.
Я даже проверку сделал немного не такую как у них. Там у них - проверка: если p И g не совпадает, то они их переустанавливают. Мне показалось это ошибкой и я сделал условие: если p ИЛИ g не совпадает. Ибо это правильней и s_key и skc зависит от обоих параметров.

http://player.tree.tv/js/app.js
Функция initMainModule и sendCheckParams.

Sony Bravia KDL-32CX523

62 (2017.02.07 20:54:07 отредактировано baat)

Re: Tree.TV (2017.04.19)

WendyH пишет:

Не, этот метод только для получения потока конкретной серии (у них тоже свой id). Список серий получать можно и по id самого сериала, но тогда парсить json для этого нужно.

то что парсить нужно, я понял, то без проблем, я за другое, оно просто не работало...

хм, уже работает... как-то странно оно работает, через раз... ничего не понимаю...
http://rgho.st/8QcSXJMT8/image.png

а раза 2-4 обновляешь страницу и корректные ссылки получаешь....
http://rgho.st/8dCG7mCHB/image.png

63

Re: Tree.TV (2017.04.19)

baat пишет:

хм, уже работает... как-то странно оно работает, через раз... ничего не понимаю...

Блин, и точно. Через раз срабатывает. Хм...

Sony Bravia KDL-32CX523

64

Re: Tree.TV (2017.04.19)

В общем, я нашёл закономерность косяка, когда не отдаётся плейлист нормально. Когда значение $b слишком большое (118940252685546875). Это key=275 в степени 7. А эта степень может быть от 1 до семи. При малых значениях key от сервера всё норм, но если случается, что и степень 7 и key большой - то затык. Интересно, что key при запросе в функции sendCheckParams выбирается от 1 до 7 рандомно = rand(1, 7). И это значение используется для возведения в степень при подсчёте $b и $skc.
Короче...
Вот именно в данный момент и затупил tree.tv. Вот когда я вроде догадался и нужно проверить теорию - сервер tree.tv в дауне и не отвечает..
А теория проста. Вместо

$playerKeyParams->key = rand(1, 7);

можно делать просто всегда

$playerKeyParams->key = 1;

Убрать рандомность и сделать самое простое значение. Все возведения в степень будут легкими и пушистыми.
Теперь всегда должно работать норм.

Sony Bravia KDL-32CX523

65

Re: Tree.TV (2017.04.19)

В общем, после всех сокращений и упрощений, переписанный скрипт теперь выглядит вот так:

+ открыть спойлер
<?php
// Присваиваем переменным переданные параметры или значения по-умолчанию
$id   = isset($_REQUEST['id'  ]) ? $_REQUEST['id'] : ""; // id фильма/сериала/серии
$json = isset($_REQUEST['json']); // Если установлен такой параметр - вернём json данные

if (!$id) die ("No iD");
 
$cookies = array(); // Глобальная переменная для хранения Cookies

// HTTP заголовки, чтобы никто не догадался, кто делает запрос
$headers = "Content-type: application/x-www-form-urlencoded\r\n" .
           "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\r\n" .
           "Accept-Encoding: gzip, deflate\r\n" .
           "Origin: http://player.tree.tv\r\n";

// Загружаем страницу с фильмом, где устанавливаются кукисы UserEnter и key (они важны!)
$page = LoadPage("http://tree.tv/player/$id/1", "GET", $headers);

// Делаем первый запрос, он всегда с одними изначальными параметрами
$data       = LoadPage("http://player.tree.tv/guard", "POST", $headers, "key=2");
$serverData = json_decode($data);

// Из ответа посчитаем key заново и отправляем второй запрос
$clientKey  = $serverData->g % $serverData->p;
$data       = LoadPage("http://player.tree.tv/guard", "POST", $headers, "key=$clientKey");
$serverData = json_decode($data);

// Теперь считаем skc по полученным данным
$skc  = $serverData->s_key % $serverData->p;
$data = LoadPage("http://player.tree.tv/guard/guard", "POST", $headers, "file=$id&source=1&skc=$skc");

if ($json) {
    // Если в параметрах нам указано вернуть json данные - просто возвращаем их
    echo $data;

} else {
    // Иначе пытаемся получить ссылку на поток
    $videos = json_decode($data); // Превращаем текст json в PHP объект

    // Вытаскиваем значение src в объекте с таким id (в ответе
    // для сериалов могут быть много объектов с разными id)
    $link = "";
    if (isset($videos[0]->sources)) {
        // Ищем в цикле объект с point равным нашему id
        foreach($videos[0]->sources as $video) {
           if ($video->point == $id) {
               $link = $video->src;
               break;
           }
        }

    } else {
        var_dump($videos);
        die(":`( No sources found.");
    }
    if (!$link) die("Point with id $id not found.");
    // Получаем содержимое плейлиста, чтобы отдать его плееру
    $playlist = LoadPage($link, "GET", $headers);
    echo $playlist;
}

exit;

///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;

    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";

    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}

Теперь всё намного проще.

Sony Bravia KDL-32CX523

66 (2017.02.07 23:22:21 отредактировано baat)

Re: Tree.TV (2017.04.19)

WendyH пишет:

Теперь всё намного проще.

проще то оно проще, только теперь вообще ни одну ссылку не открывает))))
всегда "504 Gateway Time-out"...

может у них с сервером чего?... :(

67

Re: Tree.TV (2017.04.19)

baat пишет:

всегда "504 Gateway Time-out"...
может у них с сервером чего?... :(

Конечно чего. Если даже просто их сайт не открывался. Но сейчас вроде норм. Были периоды.

Sony Bravia KDL-32CX523

68

Re: Tree.TV (2017.04.19)

Теперь всё намного проще.
Видать снова что то сменили у меня не работает, типа ссылки не рабочие выдает  :\'(

69

Re: Tree.TV (2017.04.19)

Обновлён подкаст в первом сообщении темы.

bond пишет:

Теперь всё намного проще.
Видать снова что то сменили у меня не работает, типа ссылки не рабочие выдает  :\'(

Не то, что ссылки не рабочие, просто теперь нужно при запросе по таким ссылкам передавать дополнительно HTTP заголовок:

Origin: http://player.tree.tv

Без него сервер не даёт доступа к ссылкам. Так что в VLC такие ссылки не будут проигрываться.

В подкасте тоже пришлось использовать ffmpeg, где в параметрах указываю -headers "Origin: http://player.tree.tv", чтобы транскодер мог забирать плейлист.

Не знаю как подкаст будет работать на разных устройствах, если что - пишите.

Кстати, при использовании встроенного профиля "Фильмы (основной)" и транскодера hmsmpeg тоже можно передавать параметр -headers. Но, однако, было замечено затыки, когда транскодирование вставало колом и не могло дальше идти. Как будто не мог скачать файлы из плейлиста. А при ffmpeg - нормально. Вроде.
Может у других и при обычном "Фильмы (основной)" пойдёт. Я ни в чём не уверен.

Sony Bravia KDL-32CX523
Спасибо сказали: lidars, baat2

70

Re: Tree.TV (2017.04.19)

WendyH, при запуске фильмов появляется табличка с надписью:
Программа "Модуль для запуска FFMPEG" не работает.

BRAVIA KDL-55W905A

71

Re: Tree.TV (2017.04.19)

miccc74 пишет:

WendyH, при запуске фильмов появляется табличка с надписью:
Программа "Модуль для запуска FFMPEG" не работает.

Где такая табличка появляется? На телеке? в программе?
Можете сделать скриншот тестового транскодирования?

Sony Bravia KDL-32CX523

72

Re: Tree.TV (2017.04.19)

miccc74 пишет:

WendyH, при запуске фильмов появляется табличка с надписью:
Программа "Модуль для запуска FFMPEG" не работает.

Если вы запускаете данный подкаст на ps4 pro, не забудьте, что транскод для интерполирования в разрешение 2160p неприемлем, если вы используете профиль устройства из темы ps4 pro, нужно использовать профиль транскодирования фильм оптимальный

WD TV LS+Sony KDLS5600/Samsung UEF5400/Sony PS 3/Yamaha RX-V379/hms 2.33
Кладовая HMS (список полезных ссылок и инструкций)
https://hms.lostcut.net/misc.php?action=pun_attachment&amp;item=2914&amp;download=0
Временно отсутствую

73

Re: Tree.TV (2017.04.19)

Big Dog, такая ошибка при запуске напрямую на телевизор

BRAVIA KDL-55W905A

74

Re: Tree.TV (2017.04.19)

WendyH, ошибка выскакивает на ПК.
На телевизоре изображение просто дёргается и замирает, хотя в HMS транскодирование идёт.

BRAVIA KDL-55W905A

75

Re: Tree.TV (2017.04.19)

miccc74 пишет:

Big Dog, такая ошибка при запуске напрямую на телевизор

Значит mime тип и dlna контейнер в устройстве или подкасте, выбраны не подходящие для тв и он не понимает или не умеет их воспроизводить

Сони очень плохо работает с прямыми ссылками, точнее не работает совсем, так что воспользуйтесь профилем вот от сюда https://hms.lostcut.net/viewtopic.php?id=252 вся серия w одинаковая в плане настроек, так что профиль подойдет.
И еще вопрос вы на этом тв пробовали запустить контент на ps4 pro, тогда понятно почему ничего не работало, так как он не 4k, а как я уже и писал профиль для ps4 pro рассчитан, только на передачу 2160p даже для 1080p

WD TV LS+Sony KDLS5600/Samsung UEF5400/Sony PS 3/Yamaha RX-V379/hms 2.33
Кладовая HMS (список полезных ссылок и инструкций)
https://hms.lostcut.net/misc.php?action=pun_attachment&amp;item=2914&amp;download=0
Временно отсутствую

76

Re: Tree.TV (2017.04.19)

понятно

BRAVIA KDL-55W905A

77

Re: Tree.TV (2017.04.19)

Big Dog, телевизор этот.
я поменял во вкладке "кодеки, кадр" сжатие на MPEG2 и на PS4Pro всё зароботало

BRAVIA KDL-55W905A

78

Re: Tree.TV (2017.04.19)

miccc74 пишет:

Big Dog, телевизор этот.
я поменял во вкладке "кодеки, кадр" сжатие на MPEG2 и на PS4Pro всё зароботало

Тогда пропадает главное преимущество этой системы, вывод 4к контента, лучше тогда воспользуйтесь профилем от стандартной ps4 так хотя бы качество получите исходного материала

WD TV LS+Sony KDLS5600/Samsung UEF5400/Sony PS 3/Yamaha RX-V379/hms 2.33
Кладовая HMS (список полезных ссылок и инструкций)
https://hms.lostcut.net/misc.php?action=pun_attachment&amp;item=2914&amp;download=0
Временно отсутствую

79

Re: Tree.TV (2017.04.19)

Спасибо за совет.
Кстати поставил профиль, что был посоветован, проблемы воспроизведения подкаста Tree.TV исчезли! :)

BRAVIA KDL-55W905A

80

Re: Tree.TV (2017.04.19)

WendyH пишет:

В общем, после всех сокращений и упрощений, переписанный скрипт теперь выглядит вот так:

+ открыть спойлер
<?php
// Присваиваем переменным переданные параметры или значения по-умолчанию
$id   = isset($_REQUEST['id'  ]) ? $_REQUEST['id'] : ""; // id фильма/сериала/серии
$json = isset($_REQUEST['json']); // Если установлен такой параметр - вернём json данные

if (!$id) die ("No iD");
 
$cookies = array(); // Глобальная переменная для хранения Cookies

// HTTP заголовки, чтобы никто не догадался, кто делает запрос
$headers = "Content-type: application/x-www-form-urlencoded\r\n" .
           "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\r\n" .
           "Accept-Encoding: gzip, deflate\r\n" .
           "Origin: http://player.tree.tv\r\n";

// Загружаем страницу с фильмом, где устанавливаются кукисы UserEnter и key (они важны!)
$page = LoadPage("http://tree.tv/player/$id/1", "GET", $headers);

// Делаем первый запрос, он всегда с одними изначальными параметрами
$data       = LoadPage("http://player.tree.tv/guard", "POST", $headers, "key=2");
$serverData = json_decode($data);

// Из ответа посчитаем key заново и отправляем второй запрос
$clientKey  = $serverData->g % $serverData->p;
$data       = LoadPage("http://player.tree.tv/guard", "POST", $headers, "key=$clientKey");
$serverData = json_decode($data);

// Теперь считаем skc по полученным данным
$skc  = $serverData->s_key % $serverData->p;
$data = LoadPage("http://player.tree.tv/guard/guard", "POST", $headers, "file=$id&source=1&skc=$skc");

if ($json) {
    // Если в параметрах нам указано вернуть json данные - просто возвращаем их
    echo $data;

} else {
    // Иначе пытаемся получить ссылку на поток
    $videos = json_decode($data); // Превращаем текст json в PHP объект

    // Вытаскиваем значение src в объекте с таким id (в ответе
    // для сериалов могут быть много объектов с разными id)
    $link = "";
    if (isset($videos[0]->sources)) {
        // Ищем в цикле объект с point равным нашему id
        foreach($videos[0]->sources as $video) {
           if ($video->point == $id) {
               $link = $video->src;
               break;
           }
        }

    } else {
        var_dump($videos);
        die(":`( No sources found.");
    }
    if (!$link) die("Point with id $id not found.");
    // Получаем содержимое плейлиста, чтобы отдать его плееру
    $playlist = LoadPage($link, "GET", $headers);
    echo $playlist;
}

exit;

///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;

    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";

    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}

Теперь всё намного проще.

Проверяю фильмы,например Плохой Санта 2 (Расширенная версия) / Поганий Санта 2 / Bad Santa 2 (Extended Cut).Два перевода,русский и украинский.Вот id 173520 и 173859.Почему то не один id не показывает.Вернее первый получает ссылки но они не воспроизводятся,а второй id вообще не получает ссылки. И так во многих фильмах первый перевод работает а второй нет.

81

Re: Tree.TV (2017.04.19)

ruslachka пишет:

Проверяю фильмы,например Плохой Санта 2 (Расширенная версия) / Поганий Санта 2 / Bad Santa 2 (Extended Cut).Два перевода,русский и украинский.Вот id 173520 и 173859.Почему то не один id не показывает.Вернее первый получает ссылки но они не воспроизводятся,а второй id вообще не получает ссылки. И так во многих фильмах первый перевод работает а второй нет.

Вы про PHP скрипт или про работу подкаста?
Если про подкаст, то просьба показать тестовое транскодирование.

Если про скрипт PHP - то это просто пример. Пробовали сами с ним разбираться? Где используете, у себя на сервере?

Дело в том, что все последние ссылки, вида "st4.3tv.im/play/4679e75cacf44a6669e2cea0b01ed373/720p_Bad.Santa.2.Ukr.mp4/index.m3u8" - к ним будет доступ только если в HTTP заголовках указан "Origin: http://player.tree.tv". Это значит, что просто так в VLC его не проиграть. Его нужно забирать с установленными заголовками.

Или что там у вас?

Sony Bravia KDL-32CX523

82

Re: Tree.TV (2017.04.19)

WendyH пишет:

Вы про PHP скрипт или про работу подкаста?
Если про подкаст, то просьба показать тестовое транскодирование.

Если про скрипт PHP - то это просто пример. Пробовали сами с ним разбираться? Где используете, у себя на сервере?

Дело в том, что все последние ссылки, вида "st4.3tv.im/play/4679e75cacf44a6669e2cea0b01ed373/720p_Bad.Santa.2.Ukr.mp4/index.m3u8" - к ним будет доступ только если в HTTP заголовках указан "Origin: http://player.tree.tv". Это значит, что просто так в VLC его не проиграть. Его нужно забирать с установленными заголовками.

Или что там у вас?

Да php скрипт. На сервере запускаю у себя.И на вашем сервере пробывал запускать,тоже самое.

83

Re: Tree.TV (2017.04.19)

ruslachka пишет:

Да php скрипт. На сервере запускаю у себя.И на вашем сервере пробывал запускать,тоже самое.

Запускать - это, конечно, здорово. Но разобраться хоть вы пробовали?
var_dump-ы всякие вставлять, хотя бы...

Этот скрипт как пример, проверка концепции для тех, кто хочет разобраться. Я не делаю скрипты для ваших сайтов.

Sony Bravia KDL-32CX523

84

Re: Tree.TV (2017.04.19)

WendyH пишет:

Запускать - это, конечно, здорово. Но разобраться хоть вы пробовали?
var_dump-ы всякие вставлять, хотя бы...

Этот скрипт как пример, проверка концепции для тех, кто хочет разобраться. Я не делаю скрипты для ваших сайтов.

Спасибо. Попробуем разобраться.

85

Re: Tree.TV (2017.04.19)

WendyH пишет:

Дело в том, что все последние ссылки, вида "st4.3tv.im/play/4679e75cacf44a6669e2cea0b01ed373/720p_Bad.Santa.2.Ukr.mp4/index.m3u8" - к ним будет доступ только если в HTTP заголовках указан "Origin: http://player.tree.tv". Это значит, что просто так в VLC его не проиграть. Его нужно забирать с установленными заголовками.

Дело в том, что сервер этого ресурса не всегда работает и часть фильмов просто не находит на сервере, это не проблема скрипта или подкаста, это на самом сайте проблемы... и указываешь в заголовке Origin: http://player.tree.tv или не указываешь, разницы особой нет...

86

Re: Tree.TV (2017.04.19)

baat пишет:

Дело в том, что сервер этого ресурса не всегда работает и часть фильмов просто не находит на сервере, это не проблема скрипта или подкаста, это на самом сайте проблемы... и указываешь в заголовке Origin: http://player.tree.tv или не указываешь, разницы особой нет...

Да, но если фильм на сайте идёт, то проблема не в сервере.

Sony Bravia KDL-32CX523

87

Re: Tree.TV (2017.04.19)

Как я понял из всех сообщении проиграть конечные ссылки без отправки Origin: http://player.tree.tv не получится. Например на smart tv. Но почему то некоторые ссылки и без отправки Origin: http://player.tree.tv проигрываются. И возможно ли вообще в плеер прицепить этот заголовок.

88

Re: Tree.TV (2017.04.19)

ruslachka, совершенно верно. Только некоторые ссылки не работают без заголовка Origin. Как мне показалось, только новые не работают. Старые, как были, так и остались и им он не нужен.
Насчёт плеера. Я вижу только один способ - промежуточное звено, которое будет забирать плейлист с этим заголовком и отправлять на плеер.
Хотя, смотря что вы имеете в виду. Если это программный плеер, у которого можно указать параметры подключения, то всё возможно. Смотря что вы делаете.

Sony Bravia KDL-32CX523

89

Re: Tree.TV (2017.04.19)

Народ у кого нибудь именно сейчас работает ? Просто они в куках запроса видео еще какойто mycook ввели. Смотрел смотрел да так и не высмотрел откуда они его берут. но появляется после /js/glory.js, и сюда по его коду он там просто устанавливается но не вычисляется или я туплю :) Гуру автор помоги разобраться :)

90

Re: Tree.TV (2017.04.19)

bigmanalexey, да, перестало работать.

В glory.js вот этот участок его устанавливает:

+ открыть спойлер
    new Fingerprint2().get(function(result, components){

        Cookie.set('mycook', result, 4); // установили куки на 4 часа

        // console.log(result); //a hash, representing your device fingerprint
        // console.log(components); // an array of FP components
        $.ajax({
            url: '/film/index/imprint',
            type: 'post',
            data: {
                result: result,
                components: components
            },
            success: function(responce){
                // console.log('response ->',responce);
            }
        })
    });

Где Fingerprint2 - это функция fingerprintjs2, которая получает уникальный идентификатор пользователя (отпечаток браузера, версия, разрешение экрана и проч.).

Ранее, когда я проверял, значение в mycook просто должно было быть. Поэтому я туда сам md5 идентификатор генерил свой левый. И вроде работало.
Теперь не работает. Пойду ковырять.

Sony Bravia KDL-32CX523