Как извлечь m3u8 из YouTube с помощью регулярных выражений? - PullRequest
2 голосов
/ 20 мая 2019

У меня уже был php-файл, использующий regex для извлечения ссылки m3u8 из youtube, которая работала до последней недели.

http://server.com/youtube.php?id=youtbueid используйте для передачи идентификатора YouTube, как это.

$string = get_data('https://www.youtube.com/watch?v=' . $channelid);

if(preg_match('@"hlsManifestUrl.":."(.*?m3u8)@', $string, $match)) {
    $var1=$match[1];
    $var1=str_replace("\/", "/", $var1);
    $man = get_data($var1);
    //echo $man;
    preg_match_all('/(https:\/.*\/95\/.*index.m3u8)/U',$man,$matches, PREG_PATTERN_ORDER);
    $var2=$matches[1][0];
    header("Content-type: application/vnd.apple.mpegurl");
    header("Location: $var2");
}
else {
    preg_match_all('@itag.":([^,]+),."url.":."(.*?).".*?qualityLabel.":."(.*?)p."@', $string, $match);
    //preg_match_all('@itag.":([^,]+),."url.":."(.*?).".*?bitrate.":.([^,]+),@', $string, $match);


    $filter_keys = array_filter($match[3], function($element) {
        return $element <= 720;
    });
    //print_r($filter_keys);

    $max_key = array_keys($filter_keys, max($filter_keys))[0];
    //print_r($max_key);
    $urls = $match[2];
    foreach($urls as &$url) {
        $url = str_replace('\/', '/', $url);
        $url = str_replace('\\\u0026', '&', $url);
    }
    print_r($urls[$max_key]);
    header('location: ' . $urls[$max_key]);

Как мне решить эту проблему?

1 Ответ

2 голосов
/ 20 мая 2019

Исходя из этого поста , я предполагаю, что нужные URL-адреса могут выглядеть следующим образом:

enter image description here

и мы можем написать простое выражение, например:

(.+\?v=)(.+)

Мы также можем добавить больше границ, если это было необходимо.

RegEx

Если это выражение нежелательно, вы можете изменить / изменить выражения в regex101.com .

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

Тест PHP

$re = '/(.+\?v=)(.+)/m';
$str = ' https://www.youtube.com/watch?v=_Gtc-GtLlTk';
$subst = '$2';

$result = preg_replace($re, $subst, $str);

echo $result;

Демонстрация JavaScript

Этот фрагмент показывает, что мы, вероятно, имеем правильное выражение:

const regex = /(.+\?v=)(.+)/gm;
const str = ` https://www.youtube.com/watch?v=_Gtc-GtLlTk`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
...