Получайте ссылки на видео с канала Youtube, извлекайте идентификаторы видео из URL и сохраняйте их в массиве - PullRequest
2 голосов
/ 17 мая 2010

Это мой первый вопрос на этом сайте. Я новичок в php, но я последовал совету и получил мои руки как можно более грязными с ним. К сожалению, сейчас я немного озадачен этим простым приложением Youtube, которое я пытаюсь создать.

Я знаю, что есть несколько связанных вопросов, но я еще не нашел исчерпывающего решения моей проблемы.

В любом случае, я пытаюсь получить URL-адреса видео в канале YouTube, извлечь идентификатор видео и создать массив, который я затем смогу передать функции javascript для некоторых интересных вещей на стороне клиента.

Вот мой код. Я почти уверен, что моя проблема связана с массивами против строк и переменных внутри и вне методов. В любом случае, моя функция array_map не работает, а функция showFullFeed () возвращает только одно значение вместо массива ссылок.

Любая помощь очень ценится. Приветствия

 </p>

<p>class ChannelFeed {</p>

<p>function __construct($username)
{
 $this->username=$username;
 $this->feedUrl=$url='<a href="http://gdata.youtube.com/feeds/api/users/" rel="nofollow noreferrer">http://gdata.youtube.com/feeds/api/users/</a>'.$username.'/favorites';
 $this->feed=simplexml_load_file($url);
}</p>

<p>public function getYTid() {</p>

<p>$ytURL = $this->feed->entry->link['href'];</p>

<p>$ytvIDlen = 11; // This is the length of YouTube's video IDs</p>

<p>// The ID string starts after "v=", which is usually right after 
  // "youtube.com/watch?" in the URL
  $idStarts = strpos($ytURL, "?v=");</p>

<p>// In case the "v=" is NOT right after the "?" (not likely, but I like to keep my 
  // bases covered), it will be after an "&":
  if($idStarts === FALSE)
   $idStarts = strpos($ytURL, "&v=");
  // If still FALSE, URL doesn't have a vid ID
  if($idStarts === FALSE)
   die("YouTube video ID not found. Please double-check your URL.");</p>

<p>// Offset the start location to match the beginning of the ID string
  $idStarts +=3;</p>

<p>// Get the ID string and return it
  $ytvID = substr($ytURL, $idStarts, $ytvIDlen);<br>
 return $ytvID;<br>
}
public function showFullFeed()
{ 
 foreach($this->feed->entry as $video){
 return $vidarray[] = $video->link['href'];
 }
}
 };
$youtube = new ChannelFeed('username');
$vids = $youtube->showFullFeed();
$vidIDs = array_map(getYTid(),$vids);</p>

<p>?>

Ответы [ 3 ]

6 голосов
/ 03 октября 2011

Это работает. Не я изменил поток с избранного на видео, которые были загружены каналом, поэтому вы можете изменить это обратно.

Во-первых, код для функций youtube, я поместил его в отдельный php-файл и импортировал его, просто чтобы привести в порядок вещи.

<?php
  class ChannelFeed
  {
    function __construct( $username )
    {
        $this->username=$username;
        $this->feedUrl=$url='http://gdata.youtube.com/feeds/api/users/'.$username.'/uploads';
        $this->feed=simplexml_load_file($url);
    }

    public function showFullFeed()
    { 
        $vidarray = array();

        foreach($this->feed->entry as $video)
        {
            $vidURL = (string)$video->link['href'];
            $vidarray[] = $vidURL;
        }

        return $vidarray;
}
}

function getYouTubeID($vidURL)
{
    $ytvIDlen = 11; // This is the length of YouTube's video IDs

    // The ID string starts after "v=", which is usually right after 
    // "youtube.com/watch?" in the URL
    $idStarts = strpos($vidURL, "?v=");

    // In case the "v=" is NOT right after the "?" (not likely, but I like to keep my 
    // bases covered), it will be after an "&":
    if($idStarts === FALSE)
        $idStarts = strpos($vidURL, "&v=");

    // If still FALSE, URL doesn't have a vid ID
    if($idStarts === FALSE)
        die("YouTube video ID not found. Please double-check your URL.");

    // Offset the start location to match the beginning of the ID string
    $idStarts +=3;

    // Get the ID string and return it
    $ytvID = substr($vidURL, $idStarts, $ytvIDlen);    

    return $ytvID;   
}
?>

Следующий код в главном файле, который вызывает его

require_once('youtube_channelfeed.php');

$youtube = new ChannelFeed('username');
$vids = $youtube->showFullFeed();
$vidIDs = array_map("getYouTubeID",$vids);

Получает идентификаторы и сохраняет их в массиве, используя функцию карты массива.

Спасибо за публикацию кода, я искал что-то, чтобы сделать то, что он делает, так что это мне очень помогло.

1 голос
/ 22 апреля 2011

Даер просто заменит

public function showFullFeed()
{ 
 foreach($this->feed->entry as $video){
 return $vidarray[] = $video->link['href'];
 }
}

до

public function showFullFeed()
{ 
 foreach($this->feed->entry as $video){
  $vidarray[] = $video->link['href'];
 }
      return $vidarray ;
}
0 голосов
/ 17 мая 2010

Возможно, есть другие проблемы, но вы не предоставляете array_map действительный обратный вызов . Кроме того, ваша функция обратного вызова должна получить хотя бы один аргумент.

...