Omówienie interfejsu YouTube Data API

Wprowadzenie

Ten dokument jest przeznaczony dla programistów, którzy chcą tworzyć aplikacje wchodzące w interakcje z YouTube. Wyjaśnia podstawowe pojęcia związane z YouTube i samym interfejsem API. Zawiera też omówienie różnych funkcji obsługiwanych przez interfejs API.

Zanim rozpoczniesz

  1. Aby uzyskać dostęp do konsoli Google Cloud, poprosić o klucz interfejsu API i zarejestrować aplikację, musisz mieć konto Google.

  2. Utwórz projekt w Konsoli Google Developers i uzyskaj dane logowania do autoryzacji, aby aplikacja mogła przesyłać żądania do interfejsu API.

  3. Po utworzeniu projektu upewnij się, że YouTube Data API jest jedną z usług, do których zarejestrowana jest Twoja aplikacja:

    1. Otwórz konsolę Google Cloud i wybierz projekt, który został właśnie zarejestrowany.
    2. Otwórz stronę włączonych interfejsów API. Sprawdź, czy interfejs YouTube Data API znajduje się na liście włączonych interfejsów API. Jeśli nie, otwórz bibliotekę interfejsów API i włącz interfejs API.
  4. Jeśli Twoja aplikacja ma wykorzystywać którąś z metod API, które wymagają autoryzacji użytkownika, przeczytaj przewodnik dotyczący autoryzacji, aby dowiedzieć się, w jaki sposób zaimplementować protokół OAuth 2.0.

  5. Wybierz bibliotekę klienta, aby ułatwić sobie implementację interfejsu API.

  6. zapoznać się z podstawowymi pojęciami dotyczącymi formatu danych JSON (JavaScript Object Notation), JSON to popularny, niezależny od języka format danych, który zapewnia prostą tekstową reprezentację dowolnych struktur danych. Więcej informacji znajdziesz na stronie json.org.

Zasoby i typy zasobów

Zasób to pojedyncza jednostka danych z unikalnym identyfikatorem. W tabeli poniżej opisujemy różne typy zasobów, z którymi możesz wchodzić w interakcje za pomocą interfejsu API.

Zasoby
activity Zawiera informacje o działaniu, które konkretny użytkownik wykonał w witrynie YouTube. Działania użytkowników, które są zgłaszane w kartach aktywności, obejmują m.in. ocenianie filmu, udostępnianie filmu, oznaczanie filmu jako ulubionego i publikowanie biuletynu kanału.
channel Zawiera informacje o pojedynczym kanale w YouTube.
channelBanner Identyfikuje adres URL, którego należy użyć, aby ustawić nowo przesłany obraz jako obraz banera kanału.
channelSection Zawiera informacje o zestawie filmów, które kanał wybrał do udostępniania. Sekcja może na przykład zawierać najnowsze filmy, najpopularniejsze filmy lub filmy z co najmniej 1 playlisty.
guideCategory Określa kategorię, z którą YouTube kojarzy kanały na podstawie ich treści lub innych wskaźników, takich jak popularność. Kategorie przewodnika mają na celu uporządkowanie kanałów w sposób, który ułatwi użytkownikom YouTube znajdowanie treści, których szukają. Kanały mogą być powiązane z co najmniej 1 kategorią przewodnika, ale nie ma gwarancji, że będą w jakiejkolwiek kategorii.
i18nLanguage Określa język aplikacji obsługiwany przez witrynę YouTube. Język aplikacji może być też nazywany językiem interfejsu.
i18nRegion Identyfikuje obszar geograficzny, który użytkownik YouTube może wybrać jako preferowany region treści. Region treści może być też nazywany ustawieniami regionalnymi treści.
playlist Reprezentuje pojedynczą playlistę w YouTube. Playlista to zbiór filmów, które można oglądać po kolei i udostępniać innym użytkownikom.
playlistItem Określa zasób, taki jak film, który jest częścią playlisty. Zasób playlistItem zawiera też informacje o tym, jak dany zasób jest używany na playliście.
search result Zawiera informacje o filmie na YouTube, kanale lub playliście, które pasują do parametrów wyszukiwania określonych w żądaniu do interfejsu API. Wynik wyszukiwania wskazuje na jednoznacznie identyfikowalny zasób, np. film, ale nie ma własnych trwałych danych.
subscription Zawiera informacje o subskrypcji użytkownika YouTube. Subskrypcja powiadamia użytkownika, gdy do kanału zostaną dodane nowe filmy lub gdy inny użytkownik wykona jedno z kilku działań na YouTube, takich jak przesłanie filmu, ocenienie filmu lub skomentowanie filmu.
thumbnail Identyfikuje miniatury powiązane z zasobem.
video Reprezentuje pojedynczy film na YouTube.
videoCategory Identyfikuje kategorię, która została lub może zostać powiązana z przesłanymi filmami.
watermark Określa obraz wyświetlany podczas odtwarzania filmów z określonego kanału. Właściciel kanału może też określić kanał docelowy, do którego prowadzi link ze znaku wodnego, a także czas, kiedy znak wodny ma się pojawiać podczas odtwarzania filmu, i czas, przez jaki ma być widoczny.

Pamiętaj, że w wielu przypadkach zasób zawiera odwołania do innych zasobów. Na przykład właściwość snippet.resourceId.videoId zasobu playlistItem identyfikuje zasób wideo, który z kolei zawiera pełne informacje o filmie. Inny przykład: wynik wyszukiwania zawiera właściwość videoId, playlistId lub channelId, która identyfikuje konkretny zasób filmu, playlisty lub kanału.

Obsługiwane operacje

Poniższa tabela zawiera najpopularniejsze metody obsługiwane przez interfejs API. Niektóre zasoby obsługują też inne metody, które wykonują funkcje bardziej specyficzne dla tych zasobów. Na przykład metoda videos.rate wiąże ocenę użytkownika z filmem, a metoda thumbnails.set przesyła miniaturę filmu do YouTube i wiąże ją z filmem.

Operacje
list Pobiera (GET) listę zawierającą zero lub więcej zasobów.
insert Tworzy (POST) nowy zasób.
update Modyfikuje (PUT) istniejący zasób, aby odzwierciedlał dane w Twojej prośbie.
delete Usuwa (DELETE) konkretny zasób.

Interfejs API obsługuje obecnie metody wyświetlania wszystkich obsługiwanych typów zasobów, a także operacje zapisu w przypadku wielu zasobów.

W tabeli poniżej znajdziesz operacje obsługiwane w przypadku różnych typów zasobów. Operacje wstawiania, aktualizowania lub usuwania zasobów zawsze wymagają autoryzacji użytkownika. W niektórych przypadkach metody list obsługują zarówno żądania autoryzowane, jak i nieautoryzowane. Żądania nieautoryzowane pobierają tylko dane publiczne, natomiast żądania autoryzowane mogą też pobierać informacje o aktualnie uwierzytelnionym użytkowniku lub jego prywatne dane.

Obsługiwane operacje
list insert update delete
activity
caption
channel
channelBanner
channelSection
comment
commentThread
guideCategory
i18nLanguage
i18nRegion
playlist
playlistItem
search result
subscription
thumbnail
video
videoCategory
watermark

Wykorzystanie limitu

YouTube Data API korzysta z limitów, aby zapewnić, że deweloperzy używają usługi zgodnie z przeznaczeniem i nie tworzą aplikacji, które nieuczciwie obniżają jakość usługi lub ograniczają dostęp do niej innym użytkownikom. Wszystkie żądania do interfejsu API, w tym nieprawidłowe, kosztują co najmniej 1 punkt limitu. Limit dostępny dla aplikacji znajdziesz w API Console.

Projekty, które umożliwiają korzystanie z interfejsu YouTube Data API, mają domyślny limit 100 wywołań search.list,100 wywołań videos.insert i 10 tys. jednostek dziennie łącznie dla wszystkich pozostałych punktów końcowych. Domyślny limit, który może ulec zmianie, pomaga nam optymalizować przydzielanie limitów i skalować infrastrukturę w sposób, który jest bardziej przydatny dla użytkowników interfejsu API. Wykorzystanie limitu możesz sprawdzić na stronie Limity w konsoli interfejsów API.

Uwaga: jeśli osiągniesz limit, możesz poprosić o jego zwiększenie, wypełniając formularz prośby o zwiększenie limitu dla usług YouTube API.

Obliczanie wykorzystania limitu

Google oblicza wykorzystanie limitu, przypisując koszt do każdego żądania. Różne typy operacji mają różne koszty limitu. Na przykład:

  • Operacja odczytu, która pobiera listę zasobów – kanałów, filmów, playlist – zwykle kosztuje 1 jednostkę.
  • Operacja zapisu, która tworzy, aktualizuje lub usuwa zasób, zwykle kosztuje 50 jednostek.
  • Zapytanie kosztuje 1 jednostkę.
  • Przesłanie filmu kosztuje 1 jednostkę.

Tabela Koszty limitu dla żądań do interfejsu API zawiera koszty limitu dla każdej metody interfejsu API. Mając na uwadze te reguły, możesz oszacować liczbę żądań, które Twoja aplikacja może wysyłać dziennie bez przekraczania limitu.

Zasoby częściowe

Interfejs API umożliwia, a nawet wymaga pobierania częściowych zasobów, dzięki czemu aplikacje unikają przesyłania, analizowania i przechowywania niepotrzebnych danych. Dzięki temu interfejs API wydajniej wykorzystuje zasoby sieciowe, CPU i pamięć.

Interfejs API obsługuje 2 parametry żądania, które zostały opisane w następnych sekcjach. Umożliwiają one identyfikowanie właściwości zasobów, które powinny być uwzględniane w odpowiedziach interfejsu API.

  • Parametr part identyfikuje grupy właściwości, które powinny zostać zwrócone w przypadku zasobu.
  • Parametr fields filtruje odpowiedź interfejsu API, aby zwracać tylko określone właściwości w żądanych częściach zasobu.

Jak używać parametru part

Parametr part jest wymagany w każdym żądaniu do interfejsu API, które pobiera lub zwraca zasób. Parametr identyfikuje co najmniej 1 właściwość zasobu najwyższego poziomu (niezagnieżdżoną), która powinna być uwzględniona w odpowiedzi interfejsu API. Na przykład zasób video składa się z tych części:

  • snippet
  • contentDetails
  • fileDetails
  • player
  • processingDetails
  • recordingDetails
  • statistics
  • status
  • suggestions
  • topicDetails

Wszystkie te części są obiektami zawierającymi zagnieżdżone właściwości. Możesz traktować te obiekty jako grupy pól metadanych, które serwer interfejsu API może (lub nie) pobrać. Dlatego parametr part wymaga wybrania komponentów zasobów, których aplikacja faktycznie używa. To wymaganie ma 2 główne cele:

  • Zmniejsza to czas oczekiwania, ponieważ serwer interfejsu API nie musi poświęcać czasu na pobieranie pól metadanych, których aplikacja nie używa.
  • Zmniejsza wykorzystanie przepustowości, ograniczając (lub eliminując) ilość niepotrzebnych danych, które aplikacja może pobierać.

Z czasem, gdy do zasobów będą dodawane kolejne części, korzyści będą tylko rosły, ponieważ aplikacja nie będzie wysyłać żądań o nowo wprowadzone właściwości, których nie obsługuje.

Jak używać parametru fields

Parametr fields filtruje odpowiedź interfejsu API, która zawiera tylko części zasobu określone w wartości parametru part, dzięki czemu odpowiedź zawiera tylko określony zestaw pól. Parametr fields umożliwia usuwanie zagnieżdżonych właściwości z odpowiedzi interfejsu API, co pozwala jeszcze bardziej zmniejszyć wykorzystanie przepustowości. (Parametru part nie można używać do filtrowania właściwości zagnieżdżonych z odpowiedzi).

Te reguły wyjaśniają obsługiwaną składnię wartości parametru fields, która jest oparta na składni XPath:

  • Użyj listy oddzielonej przecinkami (fields=a,b), aby wybrać wiele pól.
  • Użyj gwiazdki (fields=*) jako symbolu wieloznacznego, aby zidentyfikować wszystkie pola.
  • Użyj nawiasów (fields=a(b,c)), aby określić grupę właściwości zagnieżdżonych, które zostaną uwzględnione w odpowiedzi interfejsu API.
  • Aby określić zagnieżdżoną właściwość, użyj ukośnika (fields=a/b).

W praktyce te reguły często umożliwiają pobranie tej samej odpowiedzi interfejsu API za pomocą kilku różnych wartości parametru fields. Jeśli na przykład chcesz pobrać identyfikator, tytuł i pozycję elementu playlisty dla każdego elementu na playliście, możesz użyć dowolnej z tych wartości:

  • fields=items/id,playlistItems/snippet/title,playlistItems/snippet/position
  • fields=items(id,snippet/title,snippet/position)
  • fields=items(id,snippet(title,position))

Uwaga: tak jak każda wartość parametru zapytania, wartość parametru fields musi być zakodowana na potrzeby adresu URL. W przykładach w tym dokumencie kodowanie zostało pominięte, aby ułatwić ich czytanie.

Przykładowe żądania częściowe

Poniższe przykłady pokazują, jak za pomocą parametrów part i fields możesz zadbać o to, aby odpowiedzi interfejsu API zawierały tylko dane używane przez Twoją aplikację:

  1. Przykład 1 zwraca zasób wideo, który zawiera 4 części oraz właściwości kind i etag.
  2. Przykład 2 zwraca zasób filmu, który zawiera 2 części oraz właściwości kind i etag.
  3. Przykład 3 zwraca zasób wideo, który zawiera 2 części, ale nie obejmuje właściwości kind i etag.
  4. Przykład 4 zwraca zasób filmu, który zawiera 2 części, ale nie zawiera właściwości kind i etag ani niektórych właściwości zagnieżdżonych w obiekcie snippet zasobu.
Przykład 1
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,contentDetails,statistics,status
Description: This example retrieves a video resource and identifies several resource parts that should be included in the API response. API response:
{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "contentDetails": { "duration": "PT15M51S", "aspectRatio": "RATIO_16_9" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" }, "status": { "uploadStatus": "STATUS_PROCESSED", "privacyStatus": "PRIVACY_PUBLIC" } } ] }
Przykład 2
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics
Description: This example modifies the part parameter value so that the contentDetails and status properties are not included in the response. API response:
{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }
Przykład 3
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics&fields=items(id,snippet,statistics)
Description: This example adds the fields parameter to remove all kind and etag properties from the API response. API response:
{ "videos": [ { "id": "7lCDEYXw3mM", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }
Przykład 4
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&fields=items(id,snippet(channelId,title,categoryId),statistics)&part=snippet,statistics
Description: This example modifies the fields parameter from example 3 so that in the API response, each video resource's snippet object only includes the channelId, title, and categoryId properties. API response:
{ "videos": [ { "id": "7lCDEYXw3mM", "snippet": { "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }

Optymalizacja skuteczności

Korzystanie z tagów ETag

ETags, które są standardową częścią protokołu HTTP, umożliwiają aplikacjom odwoływanie się do konkretnej wersji określonego zasobu interfejsu API. Zasobem może być cały plik danych lub element w tym pliku. Ta funkcja obsługuje te przypadki użycia:

  • Buforowanie i pobieranie warunkowe – aplikacja może buforować zasoby interfejsu API i ich tagi ETag. Gdy aplikacja ponownie żąda zapisanego zasobu, określa powiązany z nim tag ETag. Jeśli zasób uległ zmianie, interfejs API zwraca zmodyfikowany zasób i tag ETag powiązany z tą wersją zasobu. Jeśli zasób nie uległ zmianie, interfejs API zwraca odpowiedź HTTP 304 (Not Modified), która wskazuje, że zasób nie uległ zmianie. Dzięki temu aplikacja może zmniejszyć opóźnienia i wykorzystanie przepustowości.

    Biblioteki klienta interfejsów API Google różnią się pod względem obsługi tagów ETag. Na przykład biblioteka klienta JavaScript obsługuje tagi ETag za pomocą listy dozwolonych nagłówków żądań, która zawiera If-Match i If-None-Match. Biała lista umożliwia normalne buforowanie w przeglądarce, dzięki czemu, jeśli tag ETag zasobu nie uległ zmianie, można go pobrać z pamięci podręcznej przeglądarki. Z kolei klient Obj-C nie obsługuje tagów ETag.

  • Ochrona przed przypadkowym zastąpieniem zmian – tagi ETag pomagają zapobiegać przypadkowemu zastępowaniu zmian wprowadzonych przez różnych klientów interfejsu API. Podczas aktualizowania lub usuwania zasobu aplikacja może określić jego tag ETag. Jeśli ETag nie pasuje do najnowszej wersji tego zasobu, żądanie do interfejsu API się nie powiedzie.

Używanie tagów ETag w aplikacji przynosi kilka korzyści:

  • Odpowiedź interfejsu API szybciej odpowiada na żądania dotyczące zasobów przechowywanych w pamięci podręcznej, które nie uległy zmianie, co zmniejsza opóźnienia i zużycie przepustowości.
  • Aplikacja nie nadpisze przypadkowo zmian w zasobie, które zostały wprowadzone przez innego klienta interfejsu API.

Google APIs Client Library for JavaScript obsługuje nagłówki żądań HTTP If-Match i If-None-Match, dzięki czemu tagi ETag mogą działać w kontekście normalnego zapisywania w pamięci podręcznej przeglądarki.

Korzystanie z gzip

Możesz też zmniejszyć przepustowość potrzebną do obsługi odpowiedzi interfejsu API, włączając kompresję gzip. Dekompresja odpowiedzi interfejsu API wymaga dodatkowego czasu pracy procesora, jednak korzyść w postaci mniejszego zużycia zasobów sieciowych zwykle przeważa nad tym kosztem.

Aby odebrać odpowiedź zakodowaną w formacie gzip, musisz wykonać 2 czynności:

  • Ustaw nagłówek żądania HTTP Accept-Encoding na gzip.
  • Zmodyfikuj klienta użytkownika, aby zawierał ciąg znaków gzip.

Poniższe przykładowe nagłówki HTTP pokazują, jak spełnić te wymagania, aby włączyć kompresję gzip:

Accept-Encoding: gzip
User-Agent: my program (gzip)