Re: Filmix.net (2018.12.16)
Опять что то изменили не работает.
Вы тут как гость.
Неофициальный форум DLNA Home Media Server → Подкасты → Filmix.net (2018.12.16)
Опять что то изменили не работает.
Опять что то изменили не работает.
Подтверждаю. При обновлении разделов ссылки на фильмы не находятся.
Анонсы (описания) и трейлеры после обновления отображаются, а фильмы - нет.
В не обновленных разделах ссылки на фильмы - рабочие.
Проблемы на сайте Filmix.me,сайт полностью не открывается в браузере
Проблемы на сайте Filmix.me,сайт полностью не открывается в браузере
У меня отклично открывается как https://filmix.me (т.е. в защищенном режиме)
Обновил, но требуется более тщательная проверка.
Обновил, но требуется более тщательная проверка.
Проверил на паре фильмов - вроде работает.
Большое спасибо.
Здравствуйте, открываются папкки с фильмом, а там пусто.
Здравствуйте, открываются папкки с фильмом, а там пусто.
У меня после обновления все ОК.
Здравствуйте, открываются папкки с фильмом, а там пусто.
Ох уж этот Windows XP. Попробуйте этот прикреплённый подкаст.
Ох уж этот Windows XP. Попробуйте этот прикреплённый подкаст.
Есть
что-то опять не работает, ссылки не создает.
что-то опять не работает, ссылки не создает.
Да, действительно, все ссылки на фильмы и Info-информацию пропади.
Обновление не помогает.
а что было, расскажешь?..
Ну, я, такой, глядь - а запрос на /api/movies/player_data возвращает json, но без нужных данных.
Иду на сайт, включаю фильм и смотрю какие запросы были. Запрос на player_data с сайта тоже есть и тоже пустой. Значит, думаю, теперь он это делает (получает данные о ссылке и плейлистах) по-другому.
Посмотрел в html странице блок с классом "players", в котором во время загрузки появляется код с плеером. Сохранил по Ctrl-S страницу на диск со всеми скриптами и файлами, запустил поиск в этих файлах слово "players" и искал, где в javascript идёт манипуляции с этим классом. Так я нашёл файл play_fullstory.js.
Открыл страницу в Chrome, открыл инструменты разработчика, зашел в исходник templates/Filmix/media/js/play/play_fullstory.js и поставил точку останова в функции getDataPlayer и по шагам многократно выполнял код этой и других функций, пока не разобрался, откуда он берёт ссылки на видео или плейлисты.
В коде выяснил, что ссылки содержаться в объекте player_translations и начал искать, откуда они там появляются.
Оказалось, что за это отвечает функция drawTranslation:
function drawTranslation(){
player_translations = {
flash: {},
html5: {},
pl: ''
}
$('body').find('.translations li').each(function(index, val) {
if (index == 0) {
player_translations.pl = $(this).find('span').attr('data-pl');
}
player_translations['flash'][$(this).find('span').text()] = $(this).find('span').attr('data-trans-link');
player_translations['html5'][$(this).find('span').text()] = $(this).find('span').attr('data-trans-link5');
});
checkDefaultPlayer();
}
В которой видно, что из свойства data-trans-link скрипт получает зашифрованные ссылки. А атрибут data-pl содержит "yes", если это ссылка на плейлист (там в других участках кода видно, как идёт проверка на наличие "yes" в этом свойстве).
Вот и всё. Теперь сканируем все перечисления вариантов перевода и берём из каждого значения из data-trans-link, расшифровываем и создаём ссылки.
WendyH, ты это... не пугай так... я минут двадцать переваривал твой ответ... уже паниковать думал начинать... пока не посмотрел сам страницу...
мог бы и проще ответить... ссылку из /api/movies/player_data и /api/playlist/get_list убрали, запросы больше не нужны и вернули опять на страницу в шифрованном виде, как было до появления этой ереси с запросами...
прям боюсь вас перебить...))
Вообщем, спасибо за оперативность.
Orenburg, действительно, поторопился и накосячил. Исправил.
Ничего страшного,все мы люди куда-то спешим,иногда совершаем ошибки.Сейчас проверю подкаст.
WendyH. C подкастом всё окей
Доброй ночи. Что-то опять не работает, перестал ссылки создавать.
Доброй ночи. Что-то опять не работает, перестал ссылки создавать.
Ага, спасибо. Починил и обновил подкаст на оф. форуме.
У меня тут в личке попросили помочь переделать функцию getDataPlayer из подкаста на PHP. Решил ответить здесь, ибо я за доступность, публичность, просвещение.
Пара слов про защиту.
В общем, защита на сайте filmix.net вернулась к POST запросу /api/movies/player_data, где теперь нужно передавать значение параметра key.
Но это значение спрятано в массиве meta_key, который устанавливается в коде страницы видео. В этом массиве несколько (сегодня только три) значений и только одно из них правильное.
Вообще, изначально, когда я экспериментировал, то можно послать подряд все три запроса с этими значениями и выявить именно правильный путём проверки ответа - в правильном есть данные "translations":{"flash":{... , а в неправильном там пустой массив. И такой перебор прекрасно работает. Благо там всего три варианта и правильный может быть и первый.
Однако я захотел сделать "правильно" и разобрался с функцией определения нужного ключа. Зачем-то обфусцированные функции этого вычисления есть в
/templates/Filmix/media/public/js/play/<hash>_player_data.js и некоторые значения для этой функции в /templates/Filmix/media/vendor/vendor.js.
Функция определения ключа из массива на PHP выглядит вот так:
///////////////////////////////////////////////////////////////////////////////
// Значения переменных из /templates/Filmix/media/vendor/vendor.js?v2.2.5a
function getDataPlayer($meta_keys_str) {
$p=13; $n=11; $m=7; $km=18; $kn=27; $pk=0; $dp=29; $dn=25; $dm=22;
$max = 0; $selected_key = "";
foreach (explode(',', $meta_keys_str) as $index => $key) {
switch ($index) {
case 0: $val = substr($key, $p, 2) . substr($key, $pk, 3) . substr($key, $dp, 1); break;
case 1: $val = substr($key, $n, 3) . substr($key, $kn, 1) . substr($key, $dn, 2); break;
case 2: $val = substr($key, $m, 1) . substr($key, $km, 3) . substr($key, $dm, 2); break;
}
$val = hexdec($val);
$max = max($max, $val);
if ($max==$val) $selected_key = $key;
}
return $selected_key;
}
Эта функция принимает строку из meta_key с перечисленными ключами через запятую и на выходе отдаёт нужный ключ.
Возможно, с некоторым временем, значения могут поменяться. Ибо js файлы загружаются с указанием версий.
Также важны http заголовки: Origin и "X-Requested-With: XMLHttpRequest" при POST запросе к /api/movies/player_data. Да! Также важны и cookies, полученные при обращении к странице фильма/сериала. Поэтому их тоже нужно устанавливать и хранить.
В общем тест этого всего можно посмотреть при исполнении вот такого вот скрипта:
<?php header('Content-type: text/html; charset=utf-8');
$url = "https://filmix.me/komedii/6749-semejnye-cennosti-2-sezon-2010.html";
$cookies = array(); // глобальная переменная для хранения кук
$headers = "Accept-Encoding: gzip, deflate\r\n" .
"Accept: application/json, text/javascript, */*; q=0.01\r\n" .
"Referer: $url\r\n" .
"Origin: https://filmix.me\r\n" .
"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" .
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36\r\n";
$html = LoadPage($url, $headers);
// Получаем id
if (!preg_match('/data-id="(\d+)"/', $html, $matches)) die("Невозможно найти видео ID на странице фильма.");
$id = $matches[1];
// Ищем перечисление ключей. Берём всё, что между квадратных скобок после "meta_key ="
if (!preg_match("/meta_key\s*=\s*\[(.*?)\]/s", $html, $matches)) die("Не нашли значения meta_key.");
// Избавляемся от кавычек и пробелов
$keys = str_replace(["'", " "], "", $matches[1]);
// Получаем из нескольких ключей один правильный
$key = getDataPlayer($keys);
$headers .= "X-Requested-With: XMLHttpRequest\r\n";
$data = LoadPage("https://filmix.me/api/movies/player_data", $headers, "POST", "post_id=$id&key=$key");
var_dump($key);
echo $data;
///////////////////////////////////////////////////////////////////////////////
// Значения переменных из /templates/Filmix/media/vendor/vendor.js?v2.2.5a
function getDataPlayer($meta_keys_str) {
$p=13; $n=11; $m=7; $km=18; $kn=27; $pk=0; $dp=29; $dn=25; $dm=22;
$max = 0; $selected_key = "";
foreach (explode(',', $meta_keys_str) as $index => $key) {
switch ($index) {
case 0: $val = substr($key, $p, 2) . substr($key, $pk, 3) . substr($key, $dp, 1); break;
case 1: $val = substr($key, $n, 3) . substr($key, $kn, 1) . substr($key, $dn, 2); break;
case 2: $val = substr($key, $m, 1) . substr($key, $km, 3) . substr($key, $dm, 2); break;
}
$val = hexdec($val);
$max = max($max, $val);
if ($max==$val) $selected_key = $key;
}
return $selected_key;
}
///////////////////////////////////////////////////////////////////////////////
function LoadPage($url, $headers, $method="GET", $post_data="") {
global $cookies;
$coo = ""; // Если есть cookies - добавляем их значения в HTTP заголовки
foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
if ($coo) $headers .= "Cookie: $coo\r\n";
$options = array('http'=>array('method'=>$method, 'header'=>$headers, 'content'=>$post_data));
$page = file_get_contents($url, false, stream_context_create($options));
// Перебираем заголовки ответа, чтобы установить ccokies или распаковать
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
$cookies += $tmp;
}
}
return $page;
}
Пример работы: http://wonky.lostcut.net/filmix.php
Добрый вечер. После последнего обновления у меня везде "видео не доступно". Хотелось бы понять в чем проблема, может у меня?
Добрый вечер. После последнего обновления у меня везде "видео не доступно". Хотелось бы понять в чем проблема, может у меня?
Не, там или они с защитой что-то мутят или просто какие-то переделки. У меня и на сайте через браузер через раз. Иногда просто черный экран.
У них во вконтакте там сегодня сообщения посыпались с проблемами. Подождём.
михаил, спасибо что заботитесь о работоспособности подкастов.
Как я понял, вы там ничего и не поменяли. А тот подкаст, который выложен на оф. форуме тоже просто стал работать и всё. Т.е. ваш вариант ничем не отличается.
Создает только пустые папки
Подтвердите, именно по ссылке на оф. форуме подкаст у вас не работает?
Эта ссылка указана в первом сообщении темы. Проверил, вроде работает.
Подтвердите, именно по ссылке на оф. форуме подкаст у вас не работает?
Эта ссылка указана в первом сообщении темы. Проверил, вроде работает.
Проверил: добавляю подкаст в папке "поиск", обновляю - находит, выделяю любой найденный фильм/сериал - пусто.
У меня работает по ссылке с первого поста (30.03.17).
Неофициальный форум DLNA Home Media Server → Подкасты → Filmix.net (2018.12.16)