Разработчикам на заметку

537
Писалось когда то для проекта но непонадобилось. Класс для выковыривания всех видео определённого youtube пользователя
Кому надо пользуйтесь кто сможет улучшить свистните
Код PHP:
<?php
class Youtube
{
  function LoadPages($username)
  {
    $html = Core::Get("http://www.youtube.com/user/".$username."/videos");
    preg_match_all('#<a href="/user/'.$username.'/videos\?sort=dd(.*)"class="yt-uix-button#Uis', $html, $html2);

    unset($html2[1][0]);

    $end = end($html2[1]);
    $pages = str_replace("&view=0&page=","",$end);
    $pages++;
    $videos = array();
    for($i=1;$i<$pages;$i++)
    {
      $videos = array_merge($videos, Youtube::Parce($username, 'http://www.youtube.com/user/'.$username.'/videos?sort=dd&view=0&page='.$i));  
    }
    return $videos;
  }
  
  function Parce($username,$url)
  {

    echo 'CHECK USERNAME '.$username."\n";

    $dom = new DOMDocument;
    $html = Core::Get($url);
    @$dom->loadHTML($html);

    $href = $dom->getElementsByTagName('a');
    
    $output = array();
    foreach ($href as $link) 
    {
      $src = $link->getAttribute('href');
      if(preg_match("/watch/i", $src))
      {
	$output[] = mb_substr($src,0,20);
      }
    }
    //Следующая »

    
    $output = array_unique($output);

    $videos = array();
    foreach ($output as $video)
    {
      //$video_ = mb_substr($video,0,20);
      $page = Core::Get("http://www.youtube.com".$video);
      @$dom->loadHTML($page);
      @$user= $dom->getElementById("watch-uploader-info")->getElementsByTagName('a')->item(0)->nodeValue;
      $date = $dom->getElementById("eow-date")->nodeValue;
//      echo $date;
      preg_match_all('#<title>(.*)</title>#Uis', $page, $title_raw);
      $title = $title_raw[1][0];
      $title = str_replace("      - YouTube","", $title);
      $title = str_replace("        ","", $title);
      $title = str_replace("  ","", $title);
      $title = str_replace("\n","",$title);

      echo 'CHECK LINK http://www.youtube.com'.$video."\n";
      if($username == $user)
      {
	$video_arr = array(
	  "link"=>"http://www.youtube.com".$video, 
	  "title"=> $title,
	  "video_id" => str_replace("/watch?v=", "", $video),
	  "time" => strtotime($date),
	  );
	 array_push($videos,$video_arr);
      }
    }
    return $videos;
  }
}
?>
Core::Get заменить на get_file_contents();

Возвращает нумерованный массив формата

[link] => http://www.youtube.com/watch?v=yTThPJ9R9Qw
[title] => video 2011 12 16 20 39 08
[video_id] => yTThPJ9R9Qw
[time] => 1323979200
Карта пользователей версия 0.6.beta3 | Карта пользователей версия 0.6.beta4
Комментарии (1)
Fuze 1 апреля 2012 в 20:12 +5
1. Вставляйте кат наконец то в своих постах
2. Как это относится к InstantCMS?

Ну и по теме:
Получать данные лучше всего при помощи CURL.
У youtube есть прекрасный api, прочитав который можно не извращаться с парсением html, а получать нужные данные в удобном формате (json или xml) сразу.

Например так (на примере моего компонента):

Код PHP:
$xml = $inCurl->get($this->search_api.'videos/'.$youtube_id.'?'.http_build_query($url_params));
И все. В массиве $xml сразу будут все данные по роликам без всяких прегматчей и реплейсов. Вообще парсить html это зло...

Возникнет желание задать вопрос, велкам с конкретикой в ЛС.