Несколько preg_match - медленный рендер, как сделать быстрее? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть функция, чтобы определить тип ошибки в файле журнала программы youtube-dl. для проверки, какой тип ошибки мне нужно использовать несколько preg_match. проблема в том, что я думаю, что это не самый лучший способ, и я думаю, что он слишком медленный для рендеринга этого кода. У кого-нибудь есть другой способ или пример, чтобы сделать быстрый рендеринг кода?

private function getError(){
        $message = $this->log_output;
        $output = null;


        if (preg_match('/ERROR(.*)please sign in to view this video|video is protected by a password/i', $message)) {
            $output= Translate::doInternal('Video protetto da password');
        }elseif (preg_match('/ERROR(.*)Playback on other websites has been disabled/', $message)){
            $output= Translate::doInternal('Video non scaricabile, è stata imposta la visualizzazione solo sul sito di youtube');
        }elseif (preg_match('/ERROR(.*)copyright infringement/i', $message)||preg_match('/copyright claim/i', $message)||preg_match('/copyright grounds/i', $message)) {
            $output= Translate::doInternal('Video rimosso per motivi di copyright');
        }elseif (preg_match('/ERROR(.*)this video does not exist/i', $message)) {
            $output= Translate::doInternal('Video inesistente');
        }elseif (preg_match('/ERROR(.*)account associated with this video has been terminated/', $message)) {
            $output= Translate::doInternal('Video con account chiuso');
        }elseif (preg_match('/ERROR(.*)This video is unavailable/i', $message)) {
            $output= Translate::doInternal('Video Privato o non disponibile');
        }elseif (preg_match('/ERROR(.*)This video contains content from/', $message)) {
            $output= Translate::doInternal('Video non disponibile per motivi di copyright');
        }elseif (preg_match('/ERROR(.*)This video has been removed by the user/i', $message)) {
            $output= Translate::doInternal('Video rimosso dall\'utente youtube');
        }elseif (preg_match('/ERROR(.*)This video is unavailable/i', $message)) {
            $output= Translate::doInternal('Video Privato o non disponibile');
        }elseif (preg_match('/ERROR(.*)This video is not available/i', $message)){
            $output= Translate::doInternal('Questo video non è disponibile');
        }elseif (preg_match('/ERROR(.*)The uploader has not made this video available in your country/i', $message)){
            $output= Translate::doInternal('Video non disponibile, è stato imposto blocco di paese');
        }elseif (preg_match('/ERROR(.*)Video geo-restricted by the owner/', $message)){
            $output= Translate::doInternal('Video geo-limitato dal proprietario');
        }elseif (preg_match('/ERROR(.*)Unsupported URL: /i', $message)){
            $output= Translate::doInternal('Player non rilevato oppure questo sito non è riconosciuto');
        }elseif (preg_match('/ERROR(.*)This video is only available for registered users. /i', $message)){
            $output= Translate::doInternal('Questo video non è scaricabile perchè è un profilo privato');
        }elseif (preg_match('/ERROR(.*)Access denied to video /', $message)){
            $output= Translate::doInternal('Questo video non è scaricabile perchè è un profilo privato');
        }elseif (preg_match('/ERROR(.*)caused by URLError/', $message)){
            $output= Translate::doInternal('Questo URL non è valido, controlla e riprova');
        }elseif (preg_match('/ERROR(.*); please report this issue on/i', $message)){
            $output= Translate::doInternal('Errore di estrazione video');
        }elseif (preg_match('/ERROR(.*)HTTP Error 403/', $message)){
            $output= Translate::doInternal('Errore temporaneo su youtube, RIPROVA');
        }elseif (preg_match('/ERROR(.*)No login info available, needed for using youtube/', $message)){
            $output= Translate::doInternal('Questo/i video richiedono l\'accesso a youtube, impossibile da scaricare');
        }elseif (preg_match('/ERROR(.*)Content Warning/', $message)){
            $output= Translate::doInternal('Questo video richiede l\'accesso a youtube per contenuti espliciti, verrà trovata una soluzione prima possibile.');
        }elseif (preg_match('/ERROR(.*)This live stream recording is not available/', $message)){
            $output= Translate::doInternal('La live registrata per questo video non è disponibile.');
        }elseif (preg_match('/ERROR(.*)Upgrade now to enjoy this video Start Your Free Week Already a Premium member\? Log in or Sign up/', $message)){
            $output= Translate::doInternal('Questo video richiede l\'accesso all\'account premium, non posso scaricarlo.');
        }elseif (preg_match('/ERROR(.*)The uploader has not made this video available/', $message)){
            $output= Translate::doInternal('L\'autore del caricamento non ha reso disponibile questo video');
        }elseif (preg_match('/ERROR(.*)who has blocked it from display on this website or application/', $message)){
            $output= Translate::doInternal('L\'autore del caricamento non ha reso disponibile questo video per il download');
        }elseif (preg_match('/ERROR(.*)unable to download video data/', $message)){
            $output= Translate::doInternal('Errore temporaneo, RIPROVA');
        }elseif (preg_match('/ERROR(.*)This video is no longer available because the uploader has closed their YouTube account/', $message)){
            $output= Translate::doInternal('Questo video non è più disponibile perché l\'autore del caricamento ha chiuso il suo account YouTube');
        }elseif (preg_match('/ERROR(.*)This video has been removed for violating YouTube\'s Terms of Service/', $message)){
            $output= Translate::doInternal('Questo video è stato rimosso per violazione dei Termini di servizio di YouTube');
        }elseif (preg_match('/ERROR(.*)This video is only available to Music Premium members/', $message)){
            $output= Translate::doInternal('Questo video disponibile solo per i membri di Music Premium');
        }elseif (preg_match('/ERROR(.*)This video requires payment to watch/', $message)){
            $output= Translate::doInternal('Questo video non è scaricabile perchè richiede un abbonamento a Youtube');
        }elseif (preg_match('/ERROR(.*)Filtering and streamcopy cannot be used together/', $message)){
            //Logger::setLog($this->id,'errore di aumento volume !');
            $output= Translate::doInternal('Errore durante l\'aumento volume, lo sviluppatore è già al corrente di questo tipo di errore, verrà sistemato al più presto.');
        }elseif (preg_match('/ERROR(.*)audio conversion failed/', $message)){
            //Logger::setLog($this->id,'Errore di conversione audio, codec non riconosciuto.');
            $output= Translate::doInternal('Errore di conversione audio, codec non riconosciuto, questo errore è già stato segnalato al coder dell\'applicazione');
        }elseif (preg_match('/ERROR(.*)giving up after 10 retries/', $message)){
           // Logger::setLog($this->id,'giving up after 10 retries');
            $output= Translate::doInternal('Qualcosa su youtube non funziona in questo video. non riesco a scaricarlo neanche dopo 10 tentativi, riprova più tardi');
        }


        elseif (preg_match('/ExtractorError(.*)/', $message, $output)){
            Logger::setLog($this->id, $output[1]);
            $output= Translate::doInternal('Errore generico , riprova');
        }elseif (preg_match('/ERROR: (.*)/', $message, $output)) {
            Logger::setLog($this->id, $output[1]);
            $output= Translate::doInternal('Errore generico , riprova');
        }elseif (preg_match('/EOFError: (.*)/', $message, $output)) {
            Logger::setLog($this->id, $output[1]);
            $output= Translate::doInternal('Errore su proxy generico , riprova');
        }elseif (preg_match('/TypeError:(.*)/', $message, $output)){
            Logger::setLog($this->id, $output[1]);
            $output= Translate::doInternal('Errore generico , riprova');
        }elseif (preg_match('/ValueError:(.*)/', $message, $output)){
            Logger::setLog($this->id, $output[1]);
            $output= Translate::doInternal('Errore generico , riprova');
        }elseif (preg_match('/\[download\](.*)does not pass filter (.*), skipping ../', $message)){
            $output= Translate::doInternal('Video non scaricabile, questo video è una live oppure supera la durata consentita di 3 ore');
        }
        return $output;
    }

1 Ответ

1 голос
/ 01 октября 2019

Используйте одно регулярное выражение, которое соответствует всем вашим сообщениям об ошибках и помещает часть, которую вы хотите условно, в группу захвата. Затем вы можете использовать ассоциативный массив, чтобы сопоставить их с переводом.

$messages = [
    "please sign in to view this video" => 'Video protetto da password',
    "video is protected by a password" => 'Video protetto da password',
    "playback on other websites has been disabled" => 'Video non scaricabile, è stata imposta la visualizzazione solo sul sito di youtube',
    ...
];
$regexp = '/ERROR:.*(' . implode('|', array_map('preg_quote', array_keys($messages))) . ')/i';
if (preg_match($regexp, $message, $matches) {
    $output = Translate::doInternal($messages[strtolower($matches[1])]);
}
...