Как должен быть POST запрос на добавление фильма?

Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#1
Добрый день,
Не подскажете как не открывая веб-интерфейс можно запросом добавить фильм на страницу?
Например, что-то вроде такого
curl -XPOST http://my_site.com/admin/movies?kp_id=_add_&movie.kp_id=11111&.....&movie.player=http://url_to_local_file.mp4
 
Регистрация
15 Дек 2017
Сообщения
5,067
#2
Не подскажете как не открывая веб-интерфейс можно запросом добавить фильм на страницу?
URL: /admin/change

POST BODY:
JSON:
{
   "movie":{
      "id":"298",
      "kp_id":"298",
      "title_page":"",
      "description_short":"",
      "title_ru":"Люди Икс 2",
      "title_en":"X2",
      "description":"Мутанты продолжают борьбу...",
      "poster":"1",
      "type":"0",
      "year":"2003",
      "country":"Канада,США",
      "genre":"фантастика,боевик,триллер,приключения",
      "director":"Брайан Сингер",
      "actor":"Патрик Стюарт,Хью Джекман,Иэн МакКеллен,Холли Берри,Фамке Янссен",
      "premiere":"2003-04-25",
      "kp_rating":"75",
      "kp_vote":"127579",
      "imdb_rating":"75",
      "imdb_vote":"456928",
      "pictures":"2934854,2934853,2934852",
      "player":"",
      "quality":"",
      "translate":"",
      "custom":"{\n    \"unique\": true\n}"
   }
}
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#3
URL: /admin/change

POST BODY:
JSON:
{
   "movie":{
      "id":"298",
      "kp_id":"298",
      "title_page":"",
      "description_short":"",
      "title_ru":"Люди Икс 2",
      "title_en":"X2",
      "description":"Мутанты продолжают борьбу...",
      "poster":"1",
      "type":"0",
      "year":"2003",
      "country":"Канада,США",
      "genre":"фантастика,боевик,триллер,приключения",
      "director":"Брайан Сингер",
      "actor":"Патрик Стюарт,Хью Джекман,Иэн МакКеллен,Холли Берри,Фамке Янссен",
      "premiere":"2003-04-25",
      "kp_rating":"75",
      "kp_vote":"127579",
      "imdb_rating":"75",
      "imdb_vote":"456928",
      "pictures":"2934854,2934853,2934852",
      "player":"",
      "quality":"",
      "translate":"",
      "custom":"{\n    \"unique\": true\n}"
   }
}
Огромное спасибо, попробую сегодня
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#4
URL: /admin/change

POST BODY:
JSON:
{
   "movie":{
      "id":"298",
      "kp_id":"298",
      "title_page":"",
      "description_short":"",
      "title_ru":"Люди Икс 2",
      "title_en":"X2",
      "description":"Мутанты продолжают борьбу...",
      "poster":"1",
      "type":"0",
      "year":"2003",
      "country":"Канада,США",
      "genre":"фантастика,боевик,триллер,приключения",
      "director":"Брайан Сингер",
      "actor":"Патрик Стюарт,Хью Джекман,Иэн МакКеллен,Холли Берри,Фамке Янссен",
      "premiere":"2003-04-25",
      "kp_rating":"75",
      "kp_vote":"127579",
      "imdb_rating":"75",
      "imdb_vote":"456928",
      "pictures":"2934854,2934853,2934852",
      "player":"",
      "quality":"",
      "translate":"",
      "custom":"{\n    \"unique\": true\n}"
   }
}
А не подскажете как авторизацию пройти? а то получаю 401
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#5
с авторизацией вроде разобрался.
Но при запросе получаю в ответ
{"config":"Null","modules":"Null","movie":"Null","switch":"Null","content":"Null","flush_static":"Null","flush_memcached":"Null","flush":"Null","image":"Null","database":"Null","restart":"Null"}
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#7
Без папаметра id вставляйте.
Увы, то же самое.

PHP:
<?php

function Film($url, $user, $pass, array $params) {
    $query = http_build_query($params);
    $ch    = curl_init();
    curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

$user   = "MY_USER";
$pass   = "MY_PASS";

$kp_id  = "623250";
$url    = "http://film.a-kom.biz/admin/change";
$player = "http://172.30.31.240:80/vod/bunny.mp4";

$params = array(
    "kp_id"=>"$kp_id",
    "title_page"=>"TEST",
    "player"=>"$player"
);

$send = Film($url, $user, $pass, $params);
print_r($send);
?>
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#8
Разобрался!
Я не заметил, что нужно отправлять не просто массив, а массив внутри movie.
Рабочий код под спойлером. Может кому поможет
PHP:
<?php

function Film($url, $user, $pass, array $params) {
    $query = http_build_query($params);
    $ch    = curl_init();
    curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

$user   = "MY_USER";
$pass   = "MY_PASS";

$kp_id  = "623250";
$url    = "http://film.a-kom.biz/admin/change";
$player = "http://172.30.31.240:80/vod/bunny.mp4";

$params = array(
    "movie" => array (
                    "kp_id"=>"$kp_id",
                    "title_page"=>"TEST",
                    "player"=>"$player"
                )
);

$send = Film($url, $user, $pass, $params);
print_r($send);
?>
 
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#9
Хм, хороший код пооучился
 
Последнее редактирование:
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#10
Хм, хороший код пооучился
Спасибо, вообще я с php на Вы...всё сложно)
Если есть замечания по коду либо идеи как это лучше реализовать - буду рад.
Были некоторые проблемы с добавлением собственного тега, чтобы пользователи могли видеть что будет воспроизводиться из локалки а что из интернета.
Под спойлером подробнее

P.s. перед использованием для добавления фильмов убедитесь что ваша страница парсится скриптом правильно, я не знаю зависит ли это от установленной темы. Писалось лично для себя, у вас может и не работать.
У меня была следующая идея:
Т.к. уже куплена максимальная база, на сайте уже есть огромная коллекция фильмов.
Файл.mp4 переименовываем в id_KP.mp4 (есть специально обученный человек качающий и переименовывающий фильмы согласно id кинопоиска)
Для видео, которых нет на КП используем id > 2 500 000.
Все файлы лежат в 1 папке и подпапке внутри неё.
Скрипт запускается кроном, проходится по всем mp4 файлам и сверяет список с файлом list.xls, в котором хранится список id уже добавленных мной(скриптом) фильмов.
Если фильм не был добавлен, для него с моего сайта парсится нужная информация (она уже есть там благодаря CinemaPress, но при добавлении скриптом кое что не добавляется, потому надо сохранить).
Далее в поле "Жанр" добавляется тег "Коллекция" и фильм добавляется на сайт.
Пишется лог добавленных фильмов, лог неудачных попыток, дописываются id успешно добавленных в list.xls.
(Ну и logrotate для всех логов раз в неделю отдельно в системе настроен)

PHP:
<?php

function LogToFile(string $file, string $l) {
        file_put_contents($file,$l,FILE_APPEND);
}

function DoneList(string $file, string $l) {
        file_put_contents($file,$l,FILE_APPEND);
}

function ListID(string $chkLIST, string $filmDIR) {
    $idLIST = array();
    $DIR = new RecursiveDirectoryIterator($filmDIR);
    foreach (new RecursiveIteratorIterator($DIR) as $filename => $file) {
        if (strpos($filename, '.mp4') !== FALSE) {
            $filename   = str_replace('.mp4', '', $filename);
            $foo        = explode("/",$filename);
            $ID         = array_values(array_slice($foo, -1))[0];
            if (ctype_digit($ID) && strlen($ID)>2 && ($ID < 2500000) && (strpos($chkLIST, $ID) === FALSE)) {
                $idLIST[] = $ID;
            }
        }
    }
    return $idLIST;
}

function ParcePage(string $url) {
    $data = file_get_contents($url);
    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML( $data );
    $links = array();
    foreach($dom->getElementsByTagName('div') as $link) {
        $links[] = array('text' => $link->nodeValue);
    }

    $foo = array();
    $foo = explode("\n",$links[11]['text']);
    $res['name_RU'] = trim($foo[1],"\n");
    $res['name_EN'] = trim($foo[2],"\n");

    $foo = array();
    $foo = explode("\n",$links[12]['text']);
    $res['date'] = trim($foo[1],"\n");
    $res['country'] = trim($foo[2],"\n");
    $res['genre'] = "Коллекция,".trim(str_replace(" и ", ",", $foo[3]),"\n");
    $res['description'] = trim($links[22]['text'],"\n");


    $links = array();
    foreach($dom->getElementsByTagName('dd') as $link) {
        $links[] = array('text' => $link->nodeValue);
    }
    $res['rating'] = trim($links[0]['text'],"\n");
    $res['rating_KP'] = trim($links[1]['text'],"\n");
    $res['rating_IMDB'] = trim($links[2]['text'],"\n");
    $res['director'] = str_replace(" и", ",", trim($links[3]['text'],"\n"));
    $res['actor'] = str_replace(" и", ",", trim($links[4]['text'],"\n"));
    
    return $res;
}

function AddFilm(array $params) {
    $url    = "http://film.a-kom.biz/admin/change";
    $user   = "MY_USER";
    $pass   = "MY_PASS";
    $query  = http_build_query($params);
    $ch     = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_PORT => "80",
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "",
        CURLOPT_USERPWD => "$user:$pass",
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_POSTFIELDS => $query
    ));
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

?>
PHP:
<?php

require_once "action.php";

$filmDIR    = "/opt/flussonic/priv";
$workDIR    = "/opt/autoadd";
$logDIR     = "/opt/autoadd/LOG";

$okLOG      = "$logDIR/ok.log";
$errLOG     = "$logDIR/err.log";

$chkFILE    = "$workDIR/list.xls";
$chkLIST    = file_get_contents($chkFILE);

$idLIST = ListID($chkLIST, $filmDIR);
print_r($idLIST);

foreach ($idLIST as $ID) {

    $data  = ParcePage('http://film.a-kom.biz/movie/id'.$ID);

    $params = array(
        "movie" => array (
            "kp_id"         => $ID,
            "description"   => $data['description'],
            "country"       => $data['country'],
            "genre"         => $data['genre'],
            "director"      => $data['director'],
            "actor"         => $data['actor'],
            "player"        => "http://172.30.31.240:80/vod/".
                                $ID.".mp4/embed.html?autoplay=false"
    ));

    $send = json_decode(AddFilm($params), true);
    if ((strpos($send['movie'], $ID) !== false) && (strlen($send['description']) > 2) && (strlen($send['name_RU'] > 1) || strlen($send['name_EN'] > 1))) {
        $logMSG = date('Y/m/d h:i:s')."\t- OK\t- ".$ID."\t- ".$data['name_RU']."\n";
        echo $logMSG;
        LogToFile($okLOG, $logMSG);
        DoneList($chkFILE,"$ID\n");
    } else {
        $logMSG = date('Y/m/d h:i:s')."\t- FAILED\t- ".$ID."\n\t Parced ".print_r($data, true)."\n";
        echo $logMSG;
        LogToFile($errLOG,$logMSG);
    }
}

?>
 
Енот
Новичо́к, через «о́»
Регистрация
25 Мар 2018
Сообщения
322
#11
не пойму ето парсер для cinemapress и как
 
Енот
Новичо́к, через «о́»
Регистрация
25 Мар 2018
Сообщения
322
#12
и как его правильно установить
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#13
Устанавливать ничего не нужно, кладёте в какую-нибудь папку.
Пропишите вместо моих url и путей к файлам ваши.
Надо чтобы на сервере был php с curl.
url - это, естественно, ваш собственный сайт, созданный с помощью CinemaPress.
 
Енот
Новичо́к, через «о́»
Регистрация
21 Ноя 2018
Сообщения
53
#15
Положил И что дальше делать
В основном нужно редактировать файл autoadd.php
указать в скрипте нужные папки для сканирования
$filmDIR - где лежат фильмы
$workDIR - где лежит список уже добавленных фильмов (list.xls)
$logDIR - где будут созданы файлы .log
скопировать в папку $filmDIR фильмы в формате .mp4(в моём плеере нужен mp4)
указать в скрипте значение "player" в нужном вам виде- у меня это флюсоник, я просто прописал ссылку для его плеера.
(Для вставки своего плеера и тега на сайт я всёэто и затеял изначально. Ссылку вы должны знать сами - зависит от вашего плеера)
$data - там надо прописать ссылку от вашего сайта.
В файле action.php
$res['genre'] - у меня там добавляется тег "Коллекция" в список жанров.
$url - прописываете url своего сайта.
$user - ваш логин.
$pass - ваш пароль.

Запустить скрипт руками (Например, php autoadd.php), либо добавить для него задачу в кроне.
 
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#16
Приветствую всех, вопрос преимущественно для @Alisa и всех кто в теме, подскажите пожалуйста:
  1. как можно циклично получать ID всех произведений из memcashed?
  2. где находится обработчик POST-запроса для получения фильмов?
  3. возможно ли в админку передавать свои параметры в "custom":"{\n \"unique\": true\n \n \"параметр1\":"значение"\n \n \"параметр2\":"значение"\n}"или придется передавать их в уже имеющиеся "answer" и "question"?
  4. как читать из кеша переданые мной параметры, для вывода на страницу.
Для чего всё: есть информация к произведениям которую хотелось бы тоже занести в кеш (затем сверять актуальность по крону) и потом выводить в шаблон.
 
Последнее редактирование:
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#17
Еще вопрос, может можно запросом передавать еще и новости? заметил что параметры страниц новостей (content) и т.п. хранятся в файле /config/update/default.json
Нашел откуда черпать новости мира кино, хочу по крону их добавлять раз в сутки.
Если получится передавать данные в админку то можно будет запилить новенький модуль с автопубликацией новостей с предварительным рерайтом :)
 
Последнее редактирование:
Регистрация
15 Дек 2017
Сообщения
5,067
#18
как можно циклично получать ID всех произведений из memcashed?
где находится обработчик POST-запроса для получения фильмов?
У всех сайтов теперь есть API. Можете получать информацию через него по токену.
возможно ли в админку передавать свои параметры в "custom":"{\n \"unique\": true\n \n \"параметр1\":"значение"\n \n \"параметр2\":"значение"\n}"или придется передавать их в уже имеющиеся "answer" и "question"?
Да, можно передавать всё что угодно. Главное чтобы JSON валидный был.
как читать из кеша переданые мной параметры, для вывода на страницу.
В шаблоне: <%- movie.custom.параметр %>
Еще вопрос, может можно запросом передавать еще и новости?
Да, можно и новости так добавлять.
 
Енот
Новичо́к, через «о́»
Регистрация
26 Авг 2018
Сообщения
495
#19
У всех сайтов теперь есть API. Можете получать информацию через него по токену.

Да, можно передавать всё что угодно. Главное чтобы JSON валидный был.

В шаблоне: <%- movie.custom.параметр %>

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