Preluarea celor mai recente clipuri din canale multiple Youtube

Vreau sa preiau mai multe clipuri de pe fiecare canal in parte, codul pe care l-am facut eu afiseaza doar un rezultat.

$r = 5;
$k = 'AIzaSyDagVozR7hPivfZ1YSAYhdO4q3O2p3UMCg';

$canale = array(
	"UCgpy7yxv_7JbR26McdS1uQA",
	"UCrHZJ6fddxeK2wwPIh5-O4Q",
	"UCYUI-AaHyYslLLWAss4EiAA",
);

foreach ($canale as $user) {
$results[] = json_decode(file_get_contents("https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=".$user."&maxResults=".$r."&order=date&key=".$k."&fields=items(id)"), true);

}

foreach ($results as $id) {
	echo $id['items']['0']['id']['videoId']."\n";
}

iti arata o inregistrare pt ca asta ii zici sa faca. Pune un print_r in loc de echo si vezi cum arata array-ul. Si pe baza lui il parcurgi


Anyway


foreach ($results as $id)
{
    /*echo '<pre>';
    print_r($id);
    echo '</pre>';*/
    foreach ($id['items'] as $elem)
    {
        /*echo"<pre>";
        print_r($elem['id']);
        echo "</pre>";*/
        foreach ($elem['id'] as $videoclip)
        {
            //echo $videoclip . "---" . "\n";
            echo preg_replace("/youtube#video/", " ", $videoclip); 
        }
    }
}

Se poate gasi insa o solutie mai buna la cele 2 foreach-uri imbricate. Variabila $result ar trebui definita inainte de primul foreach.
Poti decomenta print_r - urile intermediare.

LE: echo preg_replace("/youtube#video/", " ", $videoclip) iti scoate “youtube#video” si o sa iti afiseze id-urile

1 Like

Am facut asa:

$limit = 2;
$sql = $db->query("select vid from youcat limit ".$limit);

$res = 5;
$key = 'AIzaSyDagVozR7hPivfZ1YSAYhdO4q3O2p3UMCg'; 
$results = null;

foreach ($sql as $user) {
	$results[] = json_decode(file_get_contents("https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=".$user['vid']."&maxResults={$res}&order=date&key={$key}&fields=items(id)"), true);
}


foreach ($results as $id) {
    foreach ($id['items'] as $elem) {
        foreach ($elem as $videoclip) {
            echo $videoclip['videoId']."\n";
        }
    }
}

Daca stiti o metoda mai simpla, va rog sa postati.

Recomand cu mare caldura sa nu se foloseasca preg_replace acolo unde e suficient un str_replace. Am scris un script rapid pt masurare: https://gist.github.com/georgiana-gligor/37c84bc0a21d3bbea7957d08d03317a2

Iar rezultatele confirma:

➜  performance php71 preg_vs_str_replace.php
preg_replace took 0.002091
str_replace took 0.000831
3 Likes

Merci pt tip :slight_smile:
Voi folosi str_replace

Ti-am rescris codul putin mai frumos.
Incearca sa nu mai pui cheia ta de acces la APIuri pe diverse forumuri :slight_smile: Codul il gasesti aici: https://gist.github.com/georgiana-gligor/37c84bc0a21d3bbea7957d08d03317a2#file-most_recent-php

Observatiile:

  1. Foloseste conceptul de “o responsabilitate per rand de cod”, observa cum am rescris one-liner-ul de adus date in asa fel incat fiecare rand de cod sa aiba o singura responsabilitate
  2. Am folosit ArrayObject pentru stocarea rezultatelor, deoarece are iterator si nu incarca memoria; iti va fi foarte util atunci cand vei avea sute de lucruri in acel array dpdv al eficientei
  3. Nu amesteca denumirea variabilelor in romana ($videoclip) si engleza; be consistent (recomand engleza)
  4. Nu folosi prescurtari la denumirea variabilelor (deci nu $elem)
  5. Incearca sa denumesti variabilele in functie de scopul lor, nu $id sau $elem; aici nu am intervenit pe cod, dar te rog sa o faci tu
  6. ideal ar fi sa folosesti un cache odata ce ai parcurs un canal, sa nu accesezi APIul youtube din nou pt acelasi canal daca vine alt user sa solicite acelasi lucru
  7. file_get_contents nu e potrivit pentru scraping/accesare de API-uri pentru ca nu poti pasa parametri de header, etc; incearca sa te uiti la clienti HTTP precum Guzzle, Httpful sau Requests
6 Likes