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

+12
1.02K
Писалось когда то для проекта но непонадобилось. Класс для выковыривания всех видео определённого youtube пользователя
Кому надо пользуйтесь кто сможет улучшить свистните
  1.  
  2. <?php
  3. class Youtube
  4. {
  5. function LoadPages($username)
  6. {
  7. $html = Core::Get("http://www.youtube.com/user/".$username."/videos");
  8. preg_match_all('#<a href="/user/'.$username.'/videos\?sort=dd(.*)"class="yt-uix-button#Uis', $html, $html2);
  9.  
  10. unset($html2[1][0]);
  11.  
  12. $end = end($html2[1]);
  13. $pages = str_replace("&view=0&page=","",$end);
  14. $pages++;
  15. $videos = array();
  16. for($i=1;$i<$pages;$i++)
  17. {
  18. $videos = array_merge($videos, Youtube::Parce($username, 'http://www.youtube.com/user/'.$username.'/videos?sort=dd&view=0&page='.$i));
  19. }
  20. return $videos;
  21. }
  22.  
  23. function Parce($username,$url)
  24. {
  25.  
  26. echo 'CHECK USERNAME '.$username."\n";
  27.  
  28. $dom = new DOMDocument;
  29. $html = Core::Get($url);
  30. @$dom->loadHTML($html);
  31.  
  32. $href = $dom->getElementsByTagName('a');
  33.  
  34. $output = array();
  35. foreach ($href as $link)
  36. {
  37. $src = $link->getAttribute('href');
  38. if(preg_match("/watch/i", $src))
  39. {
  40. $output[] = mb_substr($src,0,20);
  41. }
  42. }
  43. //Следующая »
  44.  
  45.  
  46. $output = array_unique($output);
  47.  
  48. $videos = array();
  49. foreach ($output as $video)
  50. {
  51. //$video_ = mb_substr($video,0,20);
  52. $page = Core::Get("http://www.youtube.com".$video);
  53. @$dom->loadHTML($page);
  54. @$user= $dom->getElementById("watch-uploader-info")->getElementsByTagName('a')->item(0)->nodeValue;
  55. $date = $dom->getElementById("eow-date")->nodeValue;
  56. // echo $date;
  57. preg_match_all('#<title>(.*)</title>#Uis', $page, $title_raw);
  58. $title = $title_raw[1][0];
  59. $title = str_replace(" - YouTube","", $title);
  60. $title = str_replace(" ","", $title);
  61. $title = str_replace(" ","", $title);
  62. $title = str_replace("\n","",$title);
  63.  
  64. echo 'CHECK LINK http://www.youtube.com'.$video."\n";
  65. if($username == $user)
  66. {
  67. $video_arr = array(
  68. "link"=>"http://www.youtube.com".$video,
  69. "title"=> $title,
  70. "video_id" => str_replace("/watch?v=", "", $video),
  71. "time" => strtotime($date),
  72. );
  73. array_push($videos,$video_arr);
  74. }
  75. }
  76. return $videos;
  77. }
  78. }
  79. ?>
  80.  
Core::Get заменить на get_file_contents();

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

[link] => www.youtube.com/watch?v=yTThPJ9R9Qw
[title] => video 2011 12 16 20 39 08
[video_id] => yTThPJ9R9Qw
[time] => 1323979200
+5
Fuze Fuze 12 лет назад #
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 это зло...

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

Еще от автора

Редирект при логине
Меня жутко бесит на сайтах, когда ходишь по нему, не замечаешь что залогинен, а потом надо зайти в раздел который только для пользователей.
Автоповорот изображений 1.10+
Итак, для тех у кого нормальные фотоаппараты и тысячи фоток на сайте.
Компонент AjaxChat для 1.10.3+
Лёгкое обновление компонента AjaxChat 0.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.