Interfejs YouTube Data API dla języka JavaScript 3.0 : pierwsze kroki

Ten artykuł został napisany i przesłany przez zewnętrznego dewelopera. Zespół YouTube ds. interfejsów API i narzędzi dziękuje Martinowi Legrisowi za poświęcony czas i umiejętność.


Martin Legris
Marzec 2008

Wprowadzenie

W tym samouczku pokażę, jak za pomocą zaledwie 10 wierszy kodu AS3 pobrać najpopularniejsze filmy w YouTube z ostatnich day, week, month lub all_time. Możesz korzystać ze standardowych plików danych:

  • Najczęściej oglądane
  • Najnowsze
  • Najczęściej komentowane
  • Z największą liczbą linków
  • Najwięcej odpowiedzi
  • Ostatnio polecane
  • Najwyżej oceniane
  • Najpopularniejsze zakładki
  • Filmy na telefony komórkowe

Biblioteka użyta w tym przykładzie jest ściśle typowana, co oznacza, że po otrzymaniu danych możesz korzystać z funkcji autouzupełniania w IDE, takich jak FlashDevelop, Flex IDE, Eclipse w/FDT, IntelliJ Idea i inne.

Ważne informacje

Zanim zaczniemy, oto lista zasobów dostępnych dla Ciebie – dewelopera AS3 zainteresowanego korzystaniem z danych z interfejsu YouTube API.

Więcej informacji

Przesyłanie pierwszej prośby

Poniższy kod jest dość dobrze skomentowany. Zanim jednak zagłębię się w jej funkcję, opiszę ją nieco. Punktem początkowym wszystkich żądań jest klasa o nazwie YouTubeClient. Te zajęcia to pojedyncze zajęcia, do których możesz uzyskać dostęp, wykonując te czynności:

// first you import it
import ca.newcommerce.youtube.webservice.YouTubeClient;

// then you get a reference to it
var client:YouTubeClient = YouTubeClient.getInstance();

Teraz możemy wysłać prośbę:

client.getStandardFeed(YouTubeClient.STD_TOP_RATED, 
                                 YouTubeClient.TIME_MONTH,
                                 1, 
                                 10);

Pytałem o najwyżej oceniane filmy z ostatniego miesiąca. Wyniki od 1 do 10 (pamiętaj, że na jedno połączenie może przypadać maksymalnie 50 wyników). To proste.

Obsługa wyników

Jak mogę uzyskać dostęp do tych wyników? Model usług internetowych typu REST jest asynchroniczny, dlatego do obsługi wyników łatwiej jest używać zdarzeń, zamiast wstrzymywać kod podczas pobierania wyników. W takim przypadku musimy zadeklarować detektor zdarzeń StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED. Nasza funkcja będzie wywoływana za każdym razem, gdy YouTubeClient otrzyma odpowiedź dotyczącą standardowego pliku danych.

client.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, 
                        doVideosReceived);

Funkcja, która zostanie wywołana, to doVideosReceived. Będzie potrzebować 1 parametru, zmiennej typu StandardVideoFeedEvent. Jest to zgodne ze standardem AS3. Z przyjemnością to zrobimy i sprawdzimy kilka kwestii dotyczących otrzymanych filmów. Śledzenie do standardowego wyjścia:

  • tytuł filmu,
  • adres URL pliku SWF, w którym chcesz umieścić film;
  • liczbę wyświetleń,
  • liczbę komentarzy,
  • czas trwania filmu,
  • i nazwisko autora.
function doVideosReceived(evt:StandardVideoFeedEvent):void
{
	// get a reference to the feed containing the videos
	var feed:VideoFeed = evt.feed;
	
	// variable to hold each video retreived on the feed
	var video:VideoData;
	
	// iterate through the availabe results
	while(video = feed.next())
	{
		  // trace a newline followed by the video title
		  trace("\nvideo title:"+video.title);
		  
		  // trace the url to use to embed the flash player with this video playing in it..
		  trace("player url:"+video.swfUrl);
		  
		  // the view count
		  trace("viewCount:"+video.viewCount);
		  
		  // the comment count
		  trace("commentCount:"+video.commentCount);
		  
		  // the duration
		  trace("duration:"+video.duration);
		  
		  // the author
		  trace("author:"+video.authors.first().name);
	}
}

Kilka uwag o bibliotece i plikach danych

Niemal wszystkie zdarzenia mają właściwość .feed. ProfileEvent to jedyna usługa, która zamiast właściwości .profile ma właściwość .profile, ponieważ zwracany jest tylko 1 rekord.

Istnieje wiele typów plików danych. Wszystkie implementują te metody:

  • first() – pobierz pierwszy rekord i wskaż go
  • next() – pobieranie następnego dostępnego rekordu
  • last() – pobieranie ostatniego rekordu i wskazanie go
  • previous() – pobierz poprzedni rekord z kanału.
  • getAt() – uzyskanie wyniku w określonej pozycji
  • count() – liczba wyników dostępnych dla tego pliku danych, która nie jest taka sama jak totalResults

Gdy dotrzesz do końca wyników, next() zwraca wartość null. To samo dotyczy poprzedniego. Gdy dojdziesz do pierwszego wyniku, następne wywołanie funkcji previous() zwróci null.

Pamiętaj, że dane w plikach danych (np. kategorie) są umieszczane w elemencie Iterators, więc możesz używać tych samych funkcji do przeglądania dostępnych kategorii.

Pełny kod źródłowy

Poniżej znajdziesz pełny kod źródłowy tego przykładu. Możesz pobrać plik ZIP zawierający wszystko, czego potrzebujesz do uruchomienia przykładu w Flash CS3. Najlepiej jednak zaktualizować bibliotekę, ponieważ mogły zostać w niej poprawione błędy lub dodane nowe funkcje. Bibliotekę możesz pobrać tutaj.

package
{
    // first import dependencies (You can be more specific than this if you want)
    import ca.newcommerce.youtube.data.*;
    import ca.newcommerce.youtube.events.*;
    import ca.newcommerce.youtube.feeds.*;
    import ca.newcommerce.youtube.iterators.*;
    import ca.newcommerce.youtube.webservice.YouTubeClient;

    public class ytTest()
    {
        // some class variables
        protected var _ws:YouTubeClient;
        protected var _requestId:Number;

        public function ytTest()
        {
            // now inside of an init function
            _ws = YouTubeClient.getInstance();

            // register to list to the events you are interested in
            _ws.addEventListener(StandardVideoFeedEvent.STANDARD_VIDEO_DATA_RECEIVED, doVideosReceived);

            // do your call.. get the Top Rated videos for the last month
            // results 1 to 10; it returns a requestId
            _requestId = _ws.getStandardFeed(YouTubeClient.STD_TOP_RATED,
                                                YouTubeClient.TIME_MONTH, 
                                                1,
                                                10);
        }

        protected function doVideosReceived(evt:StandardVideoFeedEvent):void
        {

            // get a reference to the feed containing the videos
            var feed:VideoFeed = evt.feed;

            // variable to hold each video retrieved on the feed
            var video:VideoData;

            while(video = feed.next())
            {
                // trace a newline followed by the video title
                trace("\nvideo title:"+video.title);

                // trace the swf URL (used for embedding)
                trace("player url:"+video.swfUrl);

                // the view count
                trace("viewCount:"+video.viewCount);

                // the comment count
                trace("commentCount:"+video.commentCount);

                // the duration
                trace("duration:"+video.duration);

                // the author
                trace("author:"+video.authors.first().name);
             }

        }

    }

}

Podsumowanie

Ten artykuł to zaledwie wierzchołek góry lodowej, ale pozwoli Ci się zorientować, jak łatwo można wysyłać zapytania do interfejsu YouTube Data API za pomocą tej biblioteki. Ponieważ poświęciłem czas na wpisanie wszystkich danych, łatwo jest sprawdzić, jakie informacje są dostępne w każdej odpowiedzi w pliku danych. Nie obsługuje jeszcze nowej funkcji zapisywania i przesyłania, ale jeśli chcesz dodać coś do biblioteki, odwiedź stronę projektu.

Biogram autora


AUTHORNAME

Martin Legris ma 12-letnie doświadczenie w aktywnej pracy nad oprogramowaniem. Obecnie koncentruje się głównie na badaniu interfejsu użytkownika, a jego ulubionym narzędziem jest Flash z kodem Action. Zajrzyj na jego bloga blog.martinlegris.com i zapoznaj się ze stroną (może być nieaktualna) pod adresem www.newcommerce.ca.

Licencja Creative Commons
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa 3.0 (USA).