Remarque:L'API YouTube Content ID est destinée aux partenaires de contenu YouTube. Elle n'est pas accessible à tous les développeurs ni à tous les utilisateurs YouTube. Si l'API YouTube Content ID n'apparaît pas dans la console Google APIs, consultez le Centre d'aide YouTube pour en savoir plus sur le Programme Partenaire YouTube.
Ce guide explique comment les partenaires de contenu YouTube peuvent migrer des flux de contenu XML vers l'API YouTube Content ID pour intégrer du contenu dans le système de gestion des droits de YouTube.
Présentation
Pour bénéficier du système de gestion des droits Content ID de YouTube, vous devez fournir à YouTube des métadonnées, des informations sur la propriété, les paramètres des règles et des supports de référence pour vos éléments.
YouTube propose de nombreuses options pour envoyer les données sur vos éléments. Les partenaires qui mettent régulièrement en ligne de nombreux contenus utilisent souvent une méthode d'importation groupée, en spécifiant les informations sur leurs éléments à l'aide du flux DDEX de YouTube ou d'un modèle de feuille de calcul fourni par YouTube. Vous pouvez également utiliser l'API YouTube Content ID pour contrôler plus précisément le processus de mise en ligne.
À l'aide de l'API, vous créez des éléments et d'autres ressources un par un, contrairement au traitement par lot des feuilles de calcul et flux XML. L'approche individuelle de l'API permet d'accélérer les importations et de les rendre plus fiables. Vous gérez le processus de mise en ligne de manière transactionnelle, en surveillant l'efficacité des actions individuelles et en réagissant immédiatement à tout problème qui survient. Au lieu d'utiliser un job par lot de post-traitement, vous pouvez mettre à jour votre système de gestion de contenu avec les ID générés par YouTube dès qu'ils sont disponibles.
Ce document explique comment utiliser l'API YouTube Content ID pour définir vos éléments dans le système de gestion des droits de YouTube. Il part du principe que vous définissez actuellement vos éléments à l'aide du flux DDEX YouTube et explique comment recréer les fonctionnalités du flux de contenu XML à l'aide de l'API. Plus précisément, elle utilise un exemple de flux de contenu XML et identifie les commandes de l'API qui produisent le même résultat, à l'aide de la bibliothèque cliente Python.
Envoyer des données sur les éléments à YouTube
Le résultat de l'utilisation du flux de contenu XML ou de l'API Content ID est le même: vous créez (ou mettez à jour) des ressources de gestion des droits YouTube dans votre compte partenaire. Dans certains cas, vous pouvez également créer (ou mettre à jour) des vidéos YouTube.
Le flux de contenu XML et l'API abordent la tâche différemment. Le flux de contenu XML vous permet de créer un fichier unique contenant toutes les informations sur les ressources et les relations entre elles. YouTube utilise le flux comme plan pour créer les ressources réelles lors du processus de mise en ligne groupée. À l'aide de l'API, vous créez les ressources une par une, plutôt que par lot. Vous pouvez surveiller la progression et le succès de chaque ressource et appel d'API.
Lorsque vous créez des ressources directement à l'aide de méthodes d'API, vous devez effectuer explicitement certaines actions qui sont gérées en arrière-plan par le processus d'importation groupée de YouTube. Vous devez notamment importer vos fichiers multimédias et résoudre les problèmes éventuels (en réessayant d'effectuer certaines actions ou en signalant des erreurs). Vous devez également effectuer les actions dans le bon ordre. Par exemple, vous ne pouvez pas revendiquer une vidéo tant qu'elle n'a pas été créée.
Chacun des éléments racine dans le format de flux de contenu XML YouTube correspond à une ressource (ou propriété de ressource) que vous créez à l'aide des API YouTube.
Éléments XML et ressources d'API correspondantes | |
---|---|
<asset> |
asset |
<file> |
videos.fileDetails (depuis l'API YouTube Data) outhumbnail (depuis l'API YouTube Data) oureference |
<ownership> |
ownership |
<rights_admin> |
assetMatchPolicy (pour les règles de correspondance)claims.policy (pour les règles d'utilisation) |
<rights_policy> |
policy |
<video> |
videos (de l'API YouTube Data) |
<video_breaks> |
videoAdvertisingOption.adbreaks[ ] |
<ad_policy> |
videoAdvertisingOption |
<claim> |
claim |
<playlist> |
playlist (de l'API YouTube Data) |
<relationship> |
Multiples |
Remarque:Pour le moment, l'API YouTube Content ID n'est pas compatible avec les fichiers de sous-titres, les bandes-annonces et les fichiers de pochette d'album.
Le traitement des éléments <relationship>
illustre bien la différence entre le flux XML et l'API.
-
Un élément XML
<relationship>
indique qu'il existe une relation entre les éléments<item>
et<related_item>
, mais la nature de cette relation n'est pas explicite. Le processus de mise en ligne sur YouTube déduit le lien approprié entre les types d'éléments. Par exemple, si un élément est associé à une vidéo, cela signifie que YouTube doit utiliser le fichier vidéo comme référence pour l'élément, tandis qu'une relation entre une règle relative aux annonces et une vidéo définit la règle applicable à la vidéo. -
Avec l'API YouTube Content ID, vous utilisez des ressources d'API spécifiques qui définissent explicitement la relation appropriée. Pour utiliser une vidéo comme référence pour un asset, vous devez créer une ressource
reference
. Pour définir les règles relatives aux annonces pour une vidéo, vous devez créer une ressourcevideoAdvertisingOptions
. Pour que vous puissiez définir les propriétés de l'élément, celui-ci doit exister.
Importer des données d'éléments via un script
Pour importer des données d'éléments à l'aide des API, vous devez écrire un script capable d'envoyer des requêtes API, d'importer des fichiers et de créer des ressources de gestion des droits YouTube. Cette section propose un tutoriel pour écrire le script.
Voici les principales étapes:
- Créez un script de base qui utilise les API YouTube.
- Ajoutez du code permettant d'importer des fichiers multimédias.
- Ajoutez du code qui crée des ressources de gestion des droits.
- Opérationnalisez votre script pour qu'il fonctionne avec votre système de diffusion de contenu.
Un exemple de code est fourni à la fin du document (à l'exception de l'étape 4). Bien que le code soit écrit en Python, des bibliothèques clientes sont également disponibles pour d'autres langages de programmation courants.
Étape 1: Effectuer des appels d'API
Le tutoriel Envoyer une première requête explique comment écrire un script de base qui envoie des requêtes YouTube Content API. L'exemple de script de ce tutoriel authentifie l'utilisateur, autorise l'utilisation des requêtes API et construit des ressources pour interagir avec l'API YouTube Content ID.
Il servira de base pour le script utilisé dans cet exemple. Toutefois, comme indiqué ci-dessus, cet exemple explique comment créer et revendiquer des vidéos YouTube, et vous devez utiliser l'API YouTube Data pour mettre en ligne des vidéos YouTube. Pour que le script du tutoriel puisse également accéder à l'API YouTube Data, procédez comme suit:
-
Autorisez l'accès à la fonctionnalité d'importation dans l'API YouTube Data en ajoutant son URI au paramètre
scope
dans l'appelflow_from_clientsecrets
(à l'étape 2 du tutoriel).FLOW = flow_from_clientsecrets( 'client_secrets.json ', scope='https://www.googleapis.com/auth/youtubepartner https://www.googleapis.com/auth/youtube.upload', message= 'error message')
-
Créez une ressource pour interagir avec l'API YouTube Data (à l'étape 3 du tutoriel).
service = build("youtubePartner", "v1", http=http, static_discovery=False) dataApi = build("youtube", "v3", http=http)
Étape 2: Importez des fichiers vidéo
L'étape suivante consiste à ajouter une fonction permettant d'importer des fichiers vidéo. Pour une fiabilité maximale, utilisez un protocole d'importation avec reprise. Ce protocole vous permet de reprendre une opération d'importation après une interruption du réseau ou une autre défaillance de transmission. Vous gagnez ainsi du temps et économisez de la bande passante en cas de défaillance du réseau.
Le guide Mettre en ligne une vidéo de la documentation de l'API YouTube Data fournit un exemple de script de mise en ligne, upload_video.py
. Mettez à jour le script de base de l'étape 1 en ajoutant la fonction resumable_upload
à partir de upload_video.py
. Vous devez également ajouter les instructions import
et les définitions de variable dont dépend la fonction.
Étape 3: Créez des ressources de gestion des droits YouTube
Une fois la structure de base en place, vous êtes prêt à ajouter le code qui crée les éléments YouTube, les vidéos et les ressources associées.
L'ordre dans lequel vous créez les ressources est important. Par exemple, vous devez créer un élément et mettre en ligne une vidéo avant de pouvoir revendiquer la vidéo pour l'élément.
Voici l'ordre général des opérations pour les éléments de type film, télévision, clip musical et vidéo Web:
- Créer la ressource de composant (
assets.insert
) - Modifier la propriété (
ownership.update
) et la règle de correspondance de l'élément (assetMatchPolicy.update
) - Créer la ressource vidéo (
videos.insert
), définir ses métadonnées et importer le fichier multimédia - Mettre à jour les règles relatives aux annonces de la vidéo (
videoAdvertisingOptions.update
) - Revendiquer la vidéo au nom de l'élément (
claims.insert
) - Créer une référence pour l'élément utilisant la vidéo revendiquée (
references.insert
)
Les opérations pour les enregistrements audio et les éléments de référence uniquement s'effectuent dans le même ordre, sauf les étapes 3 à 5:
- Créer la ressource de composant (
assets.insert
) - Modifier la propriété (
ownership.update
) et la règle de correspondance de l'élément (assetMatchPolicy.update
) - Créez une référence pour l'asset (
references.insert
) et importez le fichier multimédia.
Le reste de cette section fournit des informations détaillées sur chacune de ces étapes, en comparant l'exemple de flux XML au code correspondant dans l'exemple de script.
Étape 3.1: Créez un asset
Le premier appel est la méthode assets.insert
de l'API. Il correspond à la partie du flux XML suivante:
<asset type="web"> <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title> <description>See a preview of the Google I/O presentation.</description> </asset>
Pour spécifier ces valeurs dans une ressource asset
, vous devez définir les valeurs de propriété suivantes:
{ "type": "web", "metadata": { "title": "Broadcast Yourself!: Using the YouTube Live APIs to stream to the world", "description": "See a preview of the Google I/O presentation." } }
Extrayez la propriété id
de la ressource renvoyée par l'API. Cette propriété identifie l'ID d'élément attribué par YouTube pour identifier l'élément de façon unique. Cette valeur est requise dans plusieurs appels d'API ultérieurs. Elle est identifiée comme assetId
plus loin dans cette documentation.
Étape 3.2: Modifiez la propriété de l'élément
Une fois que vous avez créé un asset, vous en définissez la propriété à l'aide de la méthode ownership.update
de l'API. Cette étape correspond à la partie du flux XML suivante:
<ownership/> <relationship> <item path="/feed/asset[1]"/> <related_item path="/feed/ownership[1]"/> </relationship>
Le fichier XML utilise une balise <ownership>
vide, ce qui indique que vous êtes le propriétaire du contenu dans le monde entier.
Votre requête API définira le paramètre de requête assetId
sur l'identifiant assetId obtenu à l'étape 1. Elle spécifiera également une ressource ownership
avec les valeurs de propriété indiquées ci-dessous:
assetId
(paramètre de requête): définissez la valeur assetId obtenue à l'étape 1.general[0].ratio
:100
general[0].owner
: "your_content_owner_name
"general[0].type
: "exclude
"general[0].territories
:[]
{ "general": [ "ratio": 100, "owner": "your_content_owner_name", "type": "exclude", "territories": [] ] }
Ces propriétés indiquent que le propriétaire de contenu spécifié (vous devez remplacer la valeur your_content_owner_name par le véritable nom de celui-ci) détient 100% (general[0].ratio
) du contenu dans l'ensemble du contenu. En fait, cette ressource ownership
indique que le propriétaire est propriétaire du contenu partout, à l'exception de (general[0].type
) la liste de territoires fournie (general[0].territories
). Cependant, comme la valeur de cette propriété est une liste vide, aucun territoire n'est exclu.
Étape 3.3: Définir la règle de correspondance de l'élément
Le système de gestion des droits de YouTube propose deux méthodes pour associer une règle de correspondance à un élément ou une règle d'utilisation à une vidéo revendiquée:
-
Utilisez une règle enregistrée précédemment. Avec cette méthode, vous utilisez l'API pour récupérer vos règles enregistrées, rechercher celle que vous souhaitez utiliser, puis spécifier son identifiant unique lorsque vous définissez la règle de correspondance d'un élément ou que vous créez une revendication.
-
Définissez une ressource
policy
lors de la création de l'élément ou de la revendication. Dans ce cas, la ressource de règle n'est pas enregistrée et ne peut donc pas être appliquée à d'autres éléments ou revendications.
Nous vous recommandons d'utiliser la première approche, qui repose sur des règles enregistrées. Cette approche présente un avantage important : si vous mettez à jour une règle enregistrée, la modification s'applique automatiquement à l'ensemble des éléments et des revendications qui l'utilisent.
Toutefois, les exemples de code de ce document utilisent la seconde approche pour définir la règle de correspondance du nouvel élément, à l'aide de la méthode assetMatchPolicy.update
de l'API. (Ce document utilise également la seconde approche pour définir la règle d'utilisation, qui est définie lorsque la vidéo est revendiquée.) Le document utilise la seconde approche, car les noms des règles enregistrées peuvent varier d'un partenaire à l'autre. Cette approche garantit que le même code fonctionnera pour tous les utilisateurs.
Cette étape correspond à la partie du flux XML suivante:
<rights_policy> <name>Monetize developer videos</name> </rights_policy> <rights_admin owner="True" type="match"/> <relationship> <item path="/feed/rights_admin[1]"/> <item path="/feed/rights_policy[1]"/> <related_item path="/feed/asset[1]"/> </relationship>
Votre requête API définit le paramètre assetId
sur la valeur assetId
obtenue à l'étape 1. Il envoie également une ressource assetMatchPolicy
qui définit les valeurs de propriété listées ci-dessous:
{ "rules": [ { "action": "monetize", "conditions": { "requiredTerritories": { "type": "exclude", "territories": [] } } } ] }
L'exemple ci-dessous montre comment la ressource assetMatchPolicy
serait créée si vous définissiez une règle enregistrée comme règle de correspondance d'un élément. Votre code doit remplacer la chaîne PolicyID
par l'ID qui identifie de manière unique votre règle enregistrée.
{ "policyId": "PolicyID" }
Remarque:Le flux XML, comme la page Règles du Gestionnaire de contenu YouTube, spécifie les règles par leur nom. Pour récupérer l'ID d'une règle enregistrée, utilisez la méthode policies.list
. Les ID de règles varient d'un partenaire à l'autre, même pour les règles par défaut.
Étape 3.4: Créez une ressource vidéo et importez le fichier multimédia
Vous importez votre vidéo à l'aide de la méthode videos.insert
de l'API Data. Le guide sur les importations avec reprise identifie les appels HTTP que vous devez effectuer pour mettre en ligne des vidéos à l'aide d'un processus d'importation avec reprise. Plusieurs de nos bibliothèques clientes de l'API sont également compatibles avec les importations avec reprise. L'exemple de code ci-dessous utilise un processus d'importation avec reprise à l'aide de la bibliothèque cliente Python des API Google.
Cette étape correspond à la partie du flux XML suivante:
<video> <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title> <description>See a preview of the Google I/O presentation.</description> <genre>Entertainment</genre> <keyword>”Google I/O” “YouTube Live APIs”</keyword> <public>True</public> </video> <file type="video"> <filename>GOOG_IO_Broadcast_Yourself.mov</filename> </file> <relationship> <item path="/feed/file[1]"/> <related_item path="/feed/video[1]"/> </relationship>
Si vous écrivez du code personnalisé pour effectuer les appels d'API, vous envoyez une requête initiale qui crée la ressource video
et renvoie une URL d'importation, puis vous envoyez une seconde requête pour importer les données du fichier binaire vidéo vers cette URL. Si vous utilisez la bibliothèque cliente Python (comme dans l'exemple), vous envoyez la ressource video
et les données du fichier binaire vidéo dans la même requête.
Pour créer la vidéo décrite dans l'exemple XML, votre requête API définit la valeur du paramètre part
sur snippet,status
, et la ressource video
dans le corps de la requête définit les propriétés suivantes. La valeur snippet.categoryId
(24
) correspond à la catégorie Entertainment
, qui est la catégorie associée à la vidéo dans le flux XML. Les catégories de vidéos sont décrites plus en détail dans les annexes.
{ "snippet": { "title": "Broadcast Yourself!: Using the YouTube Live APIs to stream to the world", "description": "See a preview of the Google I/O presentation.", "tags": ["Google I/O", "YouTube Live APIs"], "categoryId": 24 }, "status": { "privacyStatus": "private" } }
Remarque:Nous vous recommandons de définir l'état de confidentialité d'une vidéo sur private
lorsque vous la mettez en ligne, puis de définir l'état sur public
plus tard. Si vous préférez importer la vidéo en tant que vidéo publique, définissez la propriété status.privacyStatus
sur public
.
Extrayez la propriété id
de la ressource renvoyée par l'API. Cette propriété identifie l'ID vidéo attribué par YouTube pour identifier la vidéo de façon unique. Cette valeur est requise dans plusieurs appels d'API ultérieurs. Elle est identifiée comme videoId
plus loin dans cette documentation.
Étape 3.5: Interrogez l'API Data pour déterminer quand la vidéo a été traitée
Certaines actions, comme la création d'une référence, nécessitent que YouTube ait fini de traiter votre vidéo. L'étape suivante du script consiste donc à s'assurer que la mise en ligne de la vidéo est terminée.
Pour vérifier l'état de l'importation, appelez la méthode videos.list
de l'API Data et définissez les paramètres de requête suivants:
L'API renvoie une liste de ressources video
(contenant exactement une ressource). Vous devez vérifier la valeur de la propriété processingDetails.processingStatus
de cette ressource pour déterminer si YouTube est toujours en train de traiter la vidéo. Une fois le traitement de la vidéo terminé, la valeur de la propriété sera remplacée par une valeur autre que processing
(succeeded
ou failed
, par exemple).
L'exemple de code appelle la méthode videos.list
toutes les 12 secondes pour déterminer si le traitement de la vidéo est terminé. Cette vérification de l'état ne correspond directement à aucun élément du XML. Elle représente une action gérée implicitement par une importation groupée lors du traitement du fichier XML.
Étape 3.6: Définissez les règles relatives aux annonces
Une fois que YouTube a traité la vidéo, vous pouvez mettre à jour les paramètres d'annonces de la ressource video
. Appelez la méthode videoAdvertisingOptions.update
de l'API Content ID pour définir les règles relatives aux annonces de la vidéo. Cette action correspond à la partie du flux XML suivante:
<ad_policy> <instream standard="long" trueview="true"> <prerolls>Allow</prerolls> <postrolls>Allow</postrolls> <midrolls>Deny</midrolls> </instream> <overlay> <adsense_for_video>Allow</adsense_for_video> <invideo>Allow</invideo> </overlay> </ad_policy> <relationship> <item path="/feed/ad_policy[1]"/> <related_item path="/feed/video[1]"/> </relationship>
La règle présentée dans cet exemple permet à YouTube de diffuser TrueView annonces InStream ou annonces en superposition, y compris des annonces "longues" de 30 secondes, au début (pré-roll) ou à la fin (post-roll) de la vidéo.
Pour définir les règles relatives aux annonces, envoyez une requête qui définit le paramètre videoId
sur la videoId
obtenue précédemment. Le corps de la requête est une ressource videoAdvertisingOptions
qui définit les propriétés affichées ci-dessous:
{ "breakPosition": ["preroll", "postroll"], "adFormats": ["long", "trueview_instream", "overlay"] }
Étape 3.7: Revendiquer la vidéo
Au cours de cette étape, vous revendiquez la vidéo que vous avez mise en ligne et définissez ses règles d'utilisation en appelant la méthode claims.insert
de l'API Content ID. Cette étape correspond à la partie du flux XML suivante:
<rights_policy> <rule action="monetize"/> </rights_policy> <rights_admin owner="True" type="match"/> <claim type="audiovisual" asset="/feed/asset[1]" rights_admin="/feed/rights_admin[1]" rights_policy="/feed/rights_policy[1]" video="/feed/video[1]"/>
Comme pour les règles de correspondance de l'élément, l'exemple de script définit une règle unique au lieu d'associer une règle enregistrée à la vidéo. Toutefois, comme indiqué précédemment, nous vous encourageons à utiliser des règles enregistrées lorsque vous définissez des règles d'utilisation et de correspondance.
Dans la ressource claim
que vous envoyez avec votre requête, définissez les propriétés affichées dans la ressource ci-dessous. Notez que les chaînes assetId
et videoId
doivent être remplacées par les valeurs obtenues par le script lors des étapes précédentes.
{ "assetId": assetId, "videoId": videoId, "contentType": "audiovisual", "policy": { "rules": [ { "action": "monetize" } ] } }
Extrayez la propriété id
de la ressource renvoyée par l'API. Cette propriété identifie l'ID de revendication attribué par YouTube pour identifier la revendication de façon unique. Cette valeur est requise pour les appels d'API ultérieurs. Elle est identifiée comme claimId
plus loin dans cette documentation.
Étape 3.8: Créez une référence
Utilisez la méthode references.insert
de l'API Content ID pour créer une référence pour le système Content ID. Vous pouvez créer une référence en utilisant une vidéo revendiquée comme contenu de référence, ou importer un fichier de référence dans le cadre de l'appel d'API. Si vous créez une référence à partir d'une vidéo revendiquée, comme dans l'exemple de script, la revendication doit déjà exister.
Dans votre requête API, définissez le paramètre de requête claimId
sur le claimid
obtenu à l'étape précédente. Envoyez également une ressource reference
qui définit les propriétés ci-dessous:
{ "contentType": "audiovisual" }
Pour créer un élément de référence uniquement (sans vidéo revendiquée), apportez les modifications suivantes à la demande ci-dessus:
- Omettre le paramètre de requête
claimId
- Ajoutez la propriété
assetId
à la ressourcereference
importée. - Importez le fichier de référence en tant que
media_body
de la requête API.
Étape 3.9: Rendez la vidéo publique
Si vous avez suivi les bonnes pratiques et défini l'état de confidentialité sur private
lors de sa création, vous pouvez définir l'état de confidentialité sur public
une fois la mise en ligne effectuée. Utilisez les méthodes videos.list
et videos.update
de l'API YouTube Data pour récupérer et mettre à jour la ressource video
de la vidéo que vous venez de mettre en ligne.
Commencez par appeler la méthode videos.list
de l'API Data avec les paramètres de requête suivants:
part=status
id=videoId
Cette méthode renvoie une liste contenant une ressource, qui décrit la vidéo avec l'élément videoId
spécifié. Remplacez la valeur de la propriété status.privacyStatus
de cette ressource par public
, puis appelez la méthode videos.update de l'API Data. Définissez le paramètre de requête suivant:
part=status
Le corps de la requête correspond à la ressource vidéo modifiée.
Étape 4: Intégrez le système à votre système de diffusion de contenu
L'exemple de code présenté en annexe inclut les métadonnées spécifiques aux ressources directement dans le script. En pratique, vous souhaiterez probablement intégrer le script à votre système de gestion de contenu. Pour un système de diffusion de contenu plus complet, vous pouvez ajouter des étapes telles que:
- Interrogez votre système de gestion de contenu pour identifier les éléments à ajouter ou à mettre à jour.
- Récupérer les métadonnées d'éléments à partir du système de gestion de contenu
- Mettez à jour le système de gestion de contenu en indiquant les ID fournis par YouTube pour les éléments créés, les vidéos, les références et les revendications, ainsi que les codes temporels correspondant à la date de la dernière mise à jour des éléments.
Annexe
Exemple de fichier de flux XML
<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.youtube.com/schemas/cms/2.0" notification_email="[email protected]" channel="your_channel" content_owner="your_name"> <asset type="web"> <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title> <description>See a preview of the Google I/O presentation.</description> </asset> <video> <title>Broadcast Yourself!: Using the YouTube Live APIs to stream to the world</title> <description>See a preview of the Google I/O presentation.</description> <genre>Entertainment</genre> <keyword>”Google I/O” “YouTube Live APIs”</keyword> <public>True</public> </video> <file type="video"> <filename>GOOG_IO_Broadcast_Yourself.mov</filename> </file> <relationship> <item path="/feed/file[1]"/> <related_item path="/feed/video[1]"/> </relationship> <content_rating system="youtube">L0 N0 S0 V0 D0 F0</content_rating> <relationship> <item path="/feed/content_rating[1]"/> <related_item path="/feed/video[1]"/> </relationship> <ownership/> <relationship> <item path="/feed/asset[1]"/> <related_item path="/feed/ownership[1]"/> </relationship> <rights_policy> <name>Monetize developer videos</name> </rights_policy> <rights_admin owner="True" type="match"/> <relationship> <item path="/feed/rights_admin[1]"/> <item path="/feed/rights_policy[1]"/> <related_item path="/feed/asset[1]"/> </relationship> <ad_policy> <instream standard="long" trueview="true"> <prerolls>Allow</prerolls> <postrolls>Allow</postrolls> <midrolls>Deny</midrolls> </instream> <overlay> <adsense_for_video>Allow</adsense_for_video> <invideo>Allow</invideo> </overlay> </ad_policy> <relationship> <item path="/feed/ad_policy[1]"/> <related_item path="/feed/video[1]"/> </relationship> <claim type="audiovisual" asset="/feed/asset[1]" rights_admin="/feed/rights_admin[1]" rights_policy="/feed/rights_policy[1]" video="/feed/video[1]"/> </feed>
Exemple de script
L'exemple de code utilise la bibliothèque cliente Python des API Google.
#!/usr/bin/python2.6 # -*- coding: utf-8 -*- # # Copyright (C) 2012 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Simple command-line sample for YouTube Content ID API. Command-line application that retrieves the information about given content owner. Usage: $ python yt_partner_api.py --file="/path/to/reference/file" You can also get help on all the command-line flags the program understands by running: $ python yt_partner_api.py --help To get detailed log output run: $ python yt_partner_api.py --logging_level=DEBUG \ --file="/path/to/reference/file" """ import gflags import httplib import httplib2 import json import logging import sys import time import os from apiclient.discovery import build from apiclient.errors import HttpError from apiclient.http import MediaFileUpload from oauth2client.file import Storage from oauth2client.client import AccessTokenRefreshError from oauth2client.client import flow_from_clientsecrets from oauth2client.tools import run # Explicitly tell the underlying HTTP transport library not to retry, since # we are handling retry logic ourselves. httplib2.RETRIES = 1 # Maximum number of times to retry before giving up. MAX_RETRIES = 10 # Always retry when these exceptions are raised. RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected, httplib.IncompleteRead, httplib.ImproperConnectionState, httplib.CannotSendRequest, httplib.CannotSendHeader, httplib.ResponseNotReady, httplib.BadStatusLine) # Always retry when an apiclient.errors.HttpError with one of these status # codes is raised. RETRIABLE_STATUS_CODES = [500, 502, 503, 504] #httplib2.debuglevel = 4 FLAGS = gflags.FLAGS # The CLIENT_SECRETS_FILE variable specifies the name of a file that contains # the OAuth 2.0 information for this application, including its client_id and # client_secret. You can acquire an OAuth 2.0 client ID and client secret from # the Google API Console at # https://console.cloud.google.com/. # See the "Registering your application" instructions for an explanation # of how to find these values: # https://developers.google.com/youtube/partner/guides/registering_an_application # For more information about using OAuth2 to access Google APIs, please visit: # https://developers.google.com/accounts/docs/OAuth2 # For more information about the client_secrets.json file format, please visit: # https://developers.google.com/api-client-library/python/guide/aaa_client_secrets CLIENT_SECRETS = 'client_secrets.json' # Helpful message to display if the CLIENT_SECRETS file is missing. MISSING_CLIENT_SECRETS_MESSAGE = """ WARNING: Please configure OAuth 2.0 To make this sample run you will need to populate the client_secrets.json file found at: %s with information from the API Console <https://console.cloud.google.com/ > """ % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS) # Flags definition # # The gflags module makes defining command-line options easy for # applications. Run this program with the '--help' argument to see # all the flags that it understands. gflags.DEFINE_enum('logging_level', 'ERROR', ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], 'Set the level of logging detail.') gflags.DEFINE_string('file', None, 'The video file to upload.') def resumable_upload(insert_request): response = None error = None retry = 0 while response is None: try: print "Uploading file..." status, response = insert_request.next_chunk() if 'id' in response: print "'video id: %s was successfully uploaded." % (response['id']) return response['id'] else: exit("The upload failed with an unexpected response: %s" % response) except HttpError, e: if e.resp.status in RETRIABLE_STATUS_CODES: error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status, e.content) else: raise except RETRIABLE_EXCEPTIONS, e: error = "A retriable error occurred: %s" % e if error is not None: print error retry += 1 if retry > MAX_RETRIES: exit("No longer attempting to retry.") max_sleep = 2 ** retry sleep_seconds = random.random() * max_sleep print "Sleeping %f seconds and then retrying..." % sleep_seconds time.sleep(sleep_seconds) return None def createRequest(service, resource, operation, **kwargs): request = getattr(service, resource)() request = getattr(request, operation)(**kwargs) return request def executeOperation(service, resource, operation, **kwargs): request = getattr(service, resource)() request = getattr(request, operation)(**kwargs) return_value = request.execute() print json.dumps(return_value) return return_value def main(argv): # Let the gflags module process the command-line arguments try: argv = FLAGS(argv) except gflags.FlagsError, e: print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS) sys.exit(1) # Set up a Flow object to be used if we need to authenticate. FLOW = flow_from_clientsecrets(CLIENT_SECRETS, scope='https://www.googleapis.com/auth/youtubepartner https://www.googleapis.com/auth/youtube.upload', message=MISSING_CLIENT_SECRETS_MESSAGE) # Set the logging according to the command-line flag logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level)) # If the Credentials don't exist or are invalid run through the native client # flow. The Storage object will ensure that if successful the good # Credentials will get written back to a file. storage = Storage('yt_partner_api.dat') credentials = storage.get() if credentials is None or credentials.invalid: credentials = run(FLOW, storage) # Create an httplib2.Http object to handle our HTTP requests and authorize it # with our good Credentials. http = httplib2.Http() http = credentials.authorize(http) # Create service and retrieve content owner service. partnerApi = build("youtubePartner", "v1", http=http) dataApi = build("youtube", "v3", http=http) try: title = 'Top Ten Ridiculous test #u', monetize_policy = {'rules': [{'action': 'monetize'}]} # Create the asset kwargs = {} metadata = {'title': title, 'description': 'Wow this is a really long description'} kwargs['body'] = {'metadata': metadata, 'type': 'web'} insert_asset = executeOperation(partnerApi, 'assets', 'insert', **kwargs) asset_id = insert_asset['id'] print 'Asset ID is ' + asset_id # Set asset ownership kwargs = {'assetId': asset_id} ownership = {'ratio': 100, 'owner': 'psomusictest', 'type': 'exclude', 'territories': []} body = {'general': [ownership], 'id': asset_id} kwargs['body'] = body set_ownership = executeOperation(partnerApi, 'ownership', 'update', **kwargs) # Set match policy kwargs = {'assetId': asset_id, 'body': monetize_policy} set_match_policy = executeOperation(partnerApi, 'assetMatchPolicy', 'update', **kwargs) # Insert video using resumable upload snippet = {'title': title, 'description': 'Wow this is a really long description', 'tags': ['fizzle', 'sizzle', 'razzle dazzle'], 'categoryId': '24'} status = {'privacyStatus': 'private'} body = { 'snippet': snippet, 'status': status } kwargs = {'part': 'snippet,status', 'body': body, 'media_body': MediaFileUpload(FLAGS.file, chunksize=-1, resumable=True)} insert_video = createRequest(dataApi, 'videos', 'insert', **kwargs) video_id = resumable_upload(insert_video) if not video_id: print 'video upload failed, so the rest of this exercise is pointless' return # Poll to see when video is processed kwargs = {'id': video_id, 'part': 'processingDetails'} check_video_status = createRequest(dataApi, 'videos', 'list', **kwargs) video_processed = False sleep_seconds = 12 while not video_processed: status = check_video_status.execute() processingDetails = status['items'][0]['processingDetails'] if processingDetails['processingStatus'] != 'processing': print 'hooray, it ' + processingDetails['processingStatus'] video_processed = True elif not 'processingProgress' in processingDetails: time.sleep(sleep_seconds) else: print ('so far, we processed %d/%d parts' % ( processingDetails['processingProgress']['partsProcessed'], processingDetails['processingProgress']['partsTotal'])) time.sleep(sleep_seconds) # Claim the video body = {'assetId': asset_id, 'videoId': video_id, 'policy': monetize_policy, 'contentType': 'audiovisual'} kwargs = {'body': body} claim_video = executeOperation(partnerApi, 'claims', 'insert', **kwargs) claim_id = claim_video['id'] print 'claim ID is ' + claim_id # Create the reference body = {'assetId': asset_id, 'videoId': video_id, 'contentType': 'audiovisual'} kwargs = {'claimId': claim_id, 'body': body} create_reference = executeOperation(partnerApi, 'references', 'insert', **kwargs) # Set ad policy (update video advertising options) ads = {'breakPosition': ['preroll','postroll'], 'adFormats': ['standard_instream','trueview_instream','overlay']} kwargs = {'videoId': video_id, 'body': ads} ads = executeOperation(partnerApi, 'videoAdvertisingOptions', 'update', **kwargs) #9 Update video's privacy status to public kwargs = {'part': 'status', 'id': video_id} video = executeOperation(dataApi, 'videos', 'list', **kwargs) video['items'][0]['status']['privacyStatus'] = 'public' kwargs = {'part': 'status', 'body': video['items'][0]} video = executeOperation(dataApi, 'videos', 'update', **kwargs) except AccessTokenRefreshError: print ("The credentials have been revoked or expired, please re-run" " the application to re-authorize") if __name__ == '__main__': main(sys.argv)
Autres actions de l'API
Récupérer une liste de catégories de vidéos à l'aide de l'API Data
L'exemple de code définit la valeur de la propriété snippet.categoryID
sur 24
, ce qui correspond au genre "Divertissement". Si vous souhaitez que votre script recherche l'ID d'un genre donné (plutôt que de coder en dur les ID de catégories), appelez la méthode videoCategories.list
de l'API Data et définissez les paramètres de requête suivants:
part=snippet
regionCode=US
(vous pouvez définirregionCode
sur une valeur différente afin de récupérer les catégories de vidéos d'un autre pays)
Pour chaque ressource videoCategory
dans la réponse de l'API, vous devez vérifier la valeur de la propriété snippet.title
pour identifier un nom de catégorie, puis extraire la propriété id
de la catégorie souhaitée. Voici à quoi ressemble la ressource videoCategory
pour la catégorie "Divertissement" :
{ "id": "24", "kind": "youtube#videoCategory", "etag": "\"idnvT0N6oxG_2o6LCWUdZsqtqtk/I5rstjIK5PCItZFyWV-uw\"", "snippet": { "channelId": "UCBR8-60-B28hp2BmDPdntcQ", "title": "Entertainment" } }