Mp3goo

Darkensand

VIP
VIP
Регистрация
30 Июн 2017
Сообщения
56
Реакции
4
Баллы
8
всем привет кто знает что за модуль или поиск стоит на сайте MP3GOO двиг стоит WordPress
Кто знает подскажите пожалуйста!
 

newdancer

Новичок
Регистрация
9 Июл 2017
Сообщения
60
Реакции
5
Баллы
8
Интересный парсер youtube, тоже интересует этот вопрос
 

Darkensand

VIP
VIP
Регистрация
30 Июн 2017
Сообщения
56
Реакции
4
Баллы
8
ага + найти не могу нигде чет такого!
 

igrovik

Новичок
Регистрация
28 Июн 2017
Сообщения
201
Реакции
83
Баллы
28
Где-то валялся когда-то, подобный парсер, для скачивания файлов с ютуб, но в работоспособности не уверен, + нужно затачивать под Дле.
 

Darkensand

VIP
VIP
Регистрация
30 Июн 2017
Сообщения
56
Реакции
4
Баллы
8
а для WordPress чет такое есть?
 

MainC0de

Новичок
Регистрация
3 Окт 2017
Сообщения
78
Реакции
10
Баллы
8
@Ruhas, Смысла нет никакого. Парсер просто ищет по Ютубу ключевые слова запроса, выводит их на страницу и прячет видео, оставляя только звук. Поэтому ни закачки, ни прослушивания на моб. устройствах, когда экран заблокирован он не умеет. Так же работает кстати Bemusic, но он хотя бы выглядит красиво и информацию тянет с Last.fm.

Из готовых парсеров более менее рабочие я нашел только 3 штуки по всему инету. Это MSE, парсер Zk.fm и парсер ВК через апи я.ws. Все остальное либо на заказ, либо без нужного функционала.
 

Ruhas

VIP
VIP
Регистрация
8 Фев 2018
Сообщения
340
Реакции
55
Баллы
28
@Darkensand, более менее схож с этим вот этот скрипт SongCharts - Top Songs Charts and Music Search Engine
у него даже вроде чартов есть. Но у него как то туго с индексацией
У него туго не только с индексацией но с многим другим. Я все эти движки прошёл лет пять ( года четыре назад точно) что би музик, этот двиг, ещё был один, там вообще был выбор формата скачиваемого файл MP3 MP4 , как оказалось, из этого нечего путного нет.
 

CanceL

Продвинутый
Кодер
Регистрация
20 Янв 2018
Сообщения
48
Реакции
25
Баллы
18
youtube downloader

php-библиотека для скачивания видео с youtube.
Код:
<?php
// YouTube is capitalized twice because that's how youtube itself does it:
// https://developers.google.com/youtube/v3/code_samples/php
class YouTubeDownloader
{
    private $storage_dir;
    private $cookie_dir;
    private $client;
    private $itag_info = array(
        5 => "FLV 400x240",
        6 => "FLV 450x240",
        13 => "3GP Mobile",
        17 => "3GP 144p",
        18 => "MP4 360p",
        22 => "MP4 720p (HD)",
        34 => "FLV 360p",
        35 => "FLV 480p",
        36 => "3GP 240p",
        37 => "MP4 1080",
        38 => "MP4 3072p",
        43 => "WebM 360p",
        44 => "WebM 480p",
        45 => "WebM 720p",
        46 => "WebM 1080p",
        59 => "MP4 480p",
        78 => "MP4 480p",
        82 => "MP4 360p 3D",
        83 => "MP4 480p 3D",
        84 => "MP4 720p 3D",
        85 => "MP4 1080p 3D",
        91 => "MP4 144p",
        92 => "MP4 240p HLS",
        93 => "MP4 360p HLS",
        94 => "MP4 480p HLS",
        95 => "MP4 720p HLS",
        96 => "MP4 1080p HLS",
        100 => "WebM 360p 3D",
        101 => "WebM 480p 3D",
        102 => "WebM 720p 3D",
        120 => "WebM 720p 3D",
        127 => "TS Dash Audio 96kbps",
        128 => "TS Dash Audio 128kbps"
    );
    function __construct()
    {
        $this->storage_dir = sys_get_temp_dir();
        $this->cookie_dir = sys_get_temp_dir();
        $this->client = null;
    }
    function setStorageDir($dir)
    {
        $this->storage_dir = $dir;
    }
    // if URL: download it
    private function toHtml($html)
    {
    }
    // what identifies each request? user agent, cookies...
    public function curl($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
        //curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
        //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
    // TODO: remove this as it required PECL extension
    public static function head($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch, CURLOPT_NOBODY, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        return http_parse_headers($result);
    }
    // accepts either raw HTML or url
    // <script src="//s.ytimg.com/yts/jsbin/player-fr_FR-vflHVjlC5/base.js" name="player/base"></script>
    public function getPlayerUrl($video_html)
    {
        if (strpos($video_html, 'http') === 0) {
            $video_html = $this->curl($video_html);
        }
        $player_url = null;
        // check what player version that video is using
        if (preg_match('@<script\s*src="([^"]+player[^"]+js)@', $video_html, $matches)) {
            $player_url = $matches[1];
            // relative protocol?
            if (strpos($player_url, '//') === 0) {
                $player_url = 'http://' . substr($player_url, 2);
            } elseif (strpos($player_url, '/') === 0) {
                // relative path?
                $player_url = 'http://www.youtube.com' . $player_url;
            }
        }
        return $player_url;
    }
    // Do not redownload player.js everytime - cache it
    public function getPlayerHtml($video_html)
    {
        $player_url = $this->getPlayerUrl($video_html);
        $cache_path = sprintf('%s/%s', $this->storage_dir, md5($player_url));
        if (file_exists($cache_path)) {
            $contents = file_get_contents($cache_path);
            //return unserialize($contents);
        }
        $contents = $this->curl($player_url);
        // cache it too!
        file_put_contents($cache_path, serialize($contents));
        return $contents;
    }
    /*
     * Youtube Sep2018 Changes
    deDE:
        var aL={NI:function(a,b){a.splice(0,b)},jl:function(a){a.reverse()},l5:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c}}
        bL=function(a){a=a.split("");aL.jl(a,58);aL.NI(a,2);aL.l5(a,35);aL.NI(a,2);aL.jl(a,45);aL.l5(a,4);aL.jl(a,46);return a.join("")};
    ->$L=function(a,b,c){b=void 0===b?"":b;c=void 0===c?"":c;var d=new g.cL(a);a.match(/https:\/\/yt.akamaized.net/)||d.set("alr","yes");c&&d.set(b,bL(c));return d};
    */
    public function getSigDecodeFunctionName($player_html)
    {
        $pattern = '@yt\.akamaized\.net\/\)\s*\|\|\s*.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*\([^\)]+\)\(([a-zA-Z0-9$]+)@is';
        if (preg_match($pattern, $player_html, $matches)) {
            $func_name = $matches[1];
            $func_name = preg_quote($func_name);
            return $func_name;
        }
        return null;
    }
    // convert JS code for signature decipher to PHP code
    public function getSigDecodeInstructions($player_html, $func_name)
    {
        // extract code block from that function
        // single quote in case function name contains $dollar sign
        // xm=function(a){a=a.split("");wm.zO(a,47);wm.vY(a,1);wm.z9(a,68);wm.zO(a,21);wm.z9(a,34);wm.zO(a,16);wm.z9(a,41);return a.join("")};
        if (preg_match('/' . $func_name . '=function\([a-z]+\){(.*?)}/', $player_html, $matches)) {
            $js_code = $matches[1];
            // extract all relevant statements within that block
            // wm.vY(a,1);
            if (preg_match_all('/([a-z0-9]{2})\.([a-z0-9]{2})\([^,]+,(\d+)\)/i', $js_code, $matches) != false) {
                // must be identical
                $obj_list = $matches[1];
                //
                $func_list = $matches[2];
                // extract javascript code for each one of those statement functions
                preg_match_all('/(' . implode('|', $func_list) . '):function(.*?)\}/m', $player_html, $matches2, PREG_SET_ORDER);
                $functions = array();
                // translate each function according to its use
                foreach ($matches2 as $m) {
                    if (strpos($m[2], 'splice') !== false) {
                        $functions[$m[1]] = 'splice';
                    } elseif (strpos($m[2], 'a.length') !== false) {
                        $functions[$m[1]] = 'swap';
                    } elseif (strpos($m[2], 'reverse') !== false) {
                        $functions[$m[1]] = 'reverse';
                    }
                }
                // FINAL STEP! convert it all to instructions set
                $instructions = array();
                foreach ($matches[2] as $index => $name) {
                    $instructions[] = array($functions[$name], $matches[3][$index]);
                }
                return $instructions;
            }
        }
        return null;
    }
    public function decodeSignature($signature, $video_html)
    {
        $player_html = $this->getPlayerHtml($video_html);
        $func_name = $this->getSigDecodeFunctionName($player_html);
        // PHP instructions
        $instructions = $this->getSigDecodeInstructions($player_html, $func_name);
        foreach ($instructions as $opt) {
            $command = $opt[0];
            $value = $opt[1];
            if ($command == 'swap') {
                $temp = $signature[0];
                $signature[0] = $signature[$value % strlen($signature)];
                $signature[$value] = $temp;
            } elseif ($command == 'splice') {
                $signature = substr($signature, $value);
            } elseif ($command == 'reverse') {
                $signature = strrev($signature);
            }
        }
        return trim($signature);
    }
    // this is in beta mode!!
    // TODO: move this to its own HttpClient class
    public function stream($id)
    {
        $links = $this->getDownloadLinks($id, "mp4");
        if (count($links) == 0) {
            die("no url found!");
        }
        // grab first available MP4 link
        $url = $links[0]['url'];
        // request headers
        $headers = array(
            'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'
        );
        if (isset($_SERVER['HTTP_RANGE'])) {
            $headers[] = 'Range: ' . $_SERVER['HTTP_RANGE'];
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        // we deal with this ourselves
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        // whether request to video success
        $headers = '';
        $headers_sent = false;
        $success = false;
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $data) use (&$headers, &$headers_sent) {
            $headers .= $data;
            // this should be first line
            if (preg_match('@HTTP\/\d\.\d\s(\d+)@', $data, $matches)) {
                $status_code = $matches[1];
                // status=ok or partial content
                if ($status_code == 200 || $status_code == 206) {
                    $headers_sent = true;
                    header(rtrim($data));
                }
            } else {
                // only headers we wish to forward back to the client
                $forward = array('content-type', 'content-length', 'accept-ranges', 'content-range');
                $parts = explode(':', $data, 2);
                if ($headers_sent && count($parts) == 2 && in_array(trim(strtolower($parts[0])), $forward)) {
                    header(rtrim($data));
                }
            }
            return strlen($data);
        });
        // if response is empty - this never gets called
        curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl, $data) use (&$headers_sent) {
            if ($headers_sent) {
                echo $data;
                flush();
            }
            return strlen($data);
        });
        $ret = @curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);
        // if we are still here by now, return status_code
        return true;
    }
    // extract youtube video_id from any piece of text
    public function extractVideoId($str)
    {
        if (preg_match('/[a-z0-9_-]{11}/i', $str, $matches)) {
            return $matches[0];
        }
        return false;
    }
    // selector by format: mp4 360,
    private function selectFirst($links, $selector)
    {
        $result = array();
        $formats = preg_split('/\s*,\s*/', $selector);
        // has to be in this order
        foreach ($formats as $f) {
            foreach ($links as $l) {
                if (stripos($l['format'], $f) !== false || $f == 'any') {
                    $result[] = $l;
                }
            }
        }
        return $result;
    }
    // some of the data may need signature decoding
    public function parseStreamMap($video_html, $video_id)
    {
        $stream_map = array();
        $result = array();
        // http://stackoverflow.com/questions/35608686/how-can-i-get-the-actual-video-url-of-a-youtube-live-stream
        if (preg_match('@url_encoded_fmt_stream_map["\']:\s*["\']([^"\'\s]*)@', $video_html, $matches)) {
            $stream_map = $matches[1];
        } else {
            $gvi = $this->curl("https://www.youtube.com/get_video_info?el=embedded&eurl=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D" . urlencode($video_id) . "&video_id={$video_id}");
            if (preg_match('@url_encoded_fmt_stream_map=([^\&\s]+)@', $gvi, $matches_gvi)) {
                $stream_map = urldecode($matches_gvi[1]);
            }
        }
        if ($stream_map) {
            $parts = explode(",", $stream_map);
            foreach ($parts as $p) {
                $query = str_replace('\u0026', '&', $p);
                parse_str($query, $arr);
                $result[] = $arr;
            }
            return $result;
        }
        // TODO:
        // elseif (strpos($html, 'player-age-gate-content') !== false) { // age-gate
        // youtube must have changed something
        return $result;
    }
    // options | deep_links | append_redirector
    // TODO: make it accept video_html too
    public function getDownloadLinks($video_id, $selector = false)
    {
        // you can input HTML of /watch? page directory instead of id
        $video_id = $this->extractVideoId($video_id);
        $video_html = $this->curl("https://www.youtube.com/watch?v={$video_id}");
        $result = array();
        $url_map = $this->parseStreamMap($video_html, $video_id);
        foreach ($url_map as $arr) {
            $url = $arr['url'];
            if (isset($arr['sig'])) {
                $url = $url . '&signature=' . $arr['sig'];
            } elseif (isset($arr['signature'])) {
                $url = $url . '&signature=' . $arr['signature'];
            } elseif (isset($arr['s'])) {
                $signature = $this->decodeSignature($arr['s'], $video_html);
                $url = $url . '&signature=' . $signature;
            }
            // redirector.googlevideo.com
            //$url = preg_replace('@(\/\/)[^\.]+(\.googlevideo\.com)@', '$1redirector$2', $url);
            $itag = $arr['itag'];
            $format = isset($this->itag_info[$itag]) ? $this->itag_info[$itag] : 'Unknown';
            $result[$itag] = array(
                'url' => $url,
                'format' => $format
            );
        }
        // do we want all links or just select few?
        if ($selector) {
            return $this->selectFirst($result, $selector);
        }
        return $result;
    }
}
Необходимиы PHP Зависимости: cURL

Код:
$yt = new YouTubeDownloader();

$links = $yt->getDownloadLinks("https://www.youtube.com/watch?v=QxsmWxxouIM");

var_dump($links);
Код:
array(5) {
  [22]=>
  array(2) {
    ["url"]=>
    string(670) "https://r3---sn-vgqs7ney.googlevideo.com/videoplayback?ratebypass=yes&requiressl=yes&initcwndbps=1142500&nh=IgpwZjAxLm9yZDM1Kg42Ni4yMDguMjI4LjIwMQ&key=yt6&mime=video%2Fmp4&mn=sn-vgqs7ney&mm=31&id=o-APybfQxBq_Uf0UwtAWdBuT2hoXzus5lvuXnd9VSmh5Dl&ip=67.184.200.25&gcr=us&sparams=dur%2Cei%2Cgcr%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mt=1482861742&ms=au&pl=16&itag=22&ei=Fq1iWM-PIsLyugLMor-gBA&mv=m&source=youtube&upn=pDkyvSW9InM&dur=265.357&ipbits=0&expire=1482883446&lmt=1478829845344913&signature=A27686411B20AD4EB61A29BC695509DB4D003681.9AE606614F809319EEE0B230BFCEFD09F5C39E12"
    ["format"]=>
    string(13) "MP4 720p (HD)"
  }
  [43]=>
  array(2) {
    ["url"]=>
    string(704) "https://r3---sn-vgqs7ney.googlevideo.com/videoplayback?ratebypass=yes&requiressl=yes&initcwndbps=1142500&nh=IgpwZjAxLm9yZDM1Kg42Ni4yMDguMjI4LjIwMQ&key=yt6&gir=yes&mime=video%2Fwebm&mn=sn-vgqs7ney&mm=31&id=o-APybfQxBq_Uf0UwtAWdBuT2hoXzus5lvuXnd9VSmh5Dl&clen=23934795&ip=67.184.200.25&gcr=us&sparams=clen%2Cdur%2Cei%2Cgcr%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mt=1482861742&ms=au&pl=16&itag=43&ei=Fq1iWM-PIsLyugLMor-gBA&mv=m&source=youtube&upn=pDkyvSW9InM&dur=0.000&ipbits=0&expire=1482883446&lmt=1466552369088504&signature=4A9B43F989EF4DB937C56AC889BF9AFAA1363439.87B358B93A19E3C292BE823A2E7FD505E527956C"
    ["format"]=>
    string(9) "WebM 360p"
  }
  [18]=>
  array(2) {
    ["url"]=>
    string(705) "https://r3---sn-vgqs7ney.googlevideo.com/videoplayback?ratebypass=yes&requiressl=yes&initcwndbps=1142500&nh=IgpwZjAxLm9yZDM1Kg42Ni4yMDguMjI4LjIwMQ&key=yt6&gir=yes&mime=video%2Fmp4&mn=sn-vgqs7ney&mm=31&id=o-APybfQxBq_Uf0UwtAWdBuT2hoXzus5lvuXnd9VSmh5Dl&clen=18431345&ip=67.184.200.25&gcr=us&sparams=clen%2Cdur%2Cei%2Cgcr%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mt=1482861742&ms=au&pl=16&itag=18&ei=Fq1iWM-PIsLyugLMor-gBA&mv=m&source=youtube&upn=pDkyvSW9InM&dur=265.357&ipbits=0&expire=1482883446&lmt=1478827692757115&signature=0C2203FABCEBC01A0B154C109EA7A03EBB778A17.7FFE657A41B06ABB4729E03253A92E1AA5562D3E"
    ["format"]=>
    string(8) "MP4 360p"
  }
  [36]=>
  array(2) {
    ["url"]=>
    string(677) "https://r3---sn-vgqs7ney.googlevideo.com/videoplayback?requiressl=yes&initcwndbps=1142500&nh=IgpwZjAxLm9yZDM1Kg42Ni4yMDguMjI4LjIwMQ&key=yt6&gir=yes&mime=video%2F3gpp&mn=sn-vgqs7ney&mm=31&id=o-APybfQxBq_Uf0UwtAWdBuT2hoXzus5lvuXnd9VSmh5Dl&clen=7400500&ip=67.184.200.25&gcr=us&sparams=clen%2Cdur%2Cei%2Cgcr%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&mt=1482861742&ms=au&pl=16&itag=36&ei=Fq1iWM-PIsLyugLMor-gBA&mv=m&source=youtube&upn=pDkyvSW9InM&dur=265.404&ipbits=0&expire=1482883446&lmt=1466551971126275&signature=121F4D6F18C10D31951E2C2A857E52351BCC1A8C.B6EFCCB6734190053A0F3980FC67D3E508EA30FF"
    ["format"]=>
    string(7) "Unknown"
  }
  [17]=>
  array(2) {
    ["url"]=>
    string(677) "https://r3---sn-vgqs7ney.googlevideo.com/videoplayback?requiressl=yes&initcwndbps=1142500&nh=IgpwZjAxLm9yZDM1Kg42Ni4yMDguMjI4LjIwMQ&key=yt6&gir=yes&mime=video%2F3gpp&mn=sn-vgqs7ney&mm=31&id=o-APybfQxBq_Uf0UwtAWdBuT2hoXzus5lvuXnd9VSmh5Dl&clen=2661359&ip=67.184.200.25&gcr=us&sparams=clen%2Cdur%2Cei%2Cgcr%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&mt=1482861742&ms=au&pl=16&itag=17&ei=Fq1iWM-PIsLyugLMor-gBA&mv=m&source=youtube&upn=pDkyvSW9InM&dur=265.404&ipbits=0&expire=1482883446&lmt=1466551946325771&signature=9C0017C6EE3EC754BCB73E4546483807143CC495.A738E50D2B2C9073E9369A8828BA780B6BA453F7"
    ["format"]=>
    string(8) "3GP 144p"
  }
}
 

MainC0de

Новичок
Регистрация
3 Окт 2017
Сообщения
78
Реакции
10
Баллы
8
@CanceL, Полезно, спасибо. Жаль, что мп3 не умеет.
 

MainC0de

Новичок
Регистрация
3 Окт 2017
Сообщения
78
Реакции
10
Баллы
8
@CanceL, Инициализация не проходит. Должно перекидывать на страницу админа, но просто голая html страница вместо этого. Требования все выполнены, в консоли ошибок нету. Будем разбираться..
 

CanceL

Продвинутый
Кодер
Регистрация
20 Янв 2018
Сообщения
48
Реакции
25
Баллы
18
@CanceL, Инициализация не проходит. Должно перекидывать на страницу админа, но просто голая html страница вместо этого. Требования все выполнены, в консоли ошибок нету. Будем разбираться..
Если вы о theabhisheksingh/youtube-mp3-downloader-pro (не тестировал!), нашел другое:

[HIDE="5"]soufianedev7/youtube-mp3-downloader
Логин и пароль в админку: admin / 12345[/HIDE]
 

MainC0de

Новичок
Регистрация
3 Окт 2017
Сообщения
78
Реакции
10
Баллы
8
@CanceL, с этим получше, код кстати почти такой же. Инициализацию проходит, потом появляется приглашение в админку и потом при нажатии на ссылку админки выдает 404 The requested URL /$admin was not found on this server. Урл как-то странно выглядит..

P.S. Разобрался. Все работает. Но есть одно "но". Он хочет "Purchase code". Где ж я ему возьму? :)
 
Последнее редактирование:

MainC0de

Новичок
Регистрация
3 Окт 2017
Сообщения
78
Реакции
10
Баллы
8
попробуй что небудь ввести)
Пробывал. Он вообще не сохраняет никаких настроек в админке. Хотя пишет, что настройки успешно применены. Я уже на конфиги права на запись поставил, пофиг ему..
 
Сверху Снизу