[PYTHON] Mettre en ligne des vidéos à l'aide de l'API YouTube

Aperçu

Cet article met en ligne des vidéos à l'aide de l'API YouTube. Le langage est Python3. Vous pouvez procéder selon le document officiel ci-dessous, mais j'ai ajouté quelques points auxquels j'étais accro.

YouTube API-Upload Video

environnement

En principe, on suppose que le projet a été créé dans GCP.

Préparation préalable

Installation de google-api-python-client

Installez la bibliothèque pour utiliser l'API de Google.

python


$ pip install google-api-python-client

Enregistrement de l'application avec GCP

1. Création des informations d'approbation

Ouvrez le lien ci-dessous et créez vos informations d'identification à partir de la console GCP. Cette fois, nous utiliserons OAuth 2.0. Informations d'identification de la console GCP

(1) Accédez à Créer des informations d'identification> ID client OAuth (sélectionnez le projet en haut à gauche) スクリーンショット 2020-01-21 23.30.36.png

(2) Sélectionnez "Autre". Le nom est créé en entrant une valeur スクリーンショット 2020-01-21 23.31.32.png

(3) L'ID client et le secret client peuvent être obtenus スクリーンショット 2020-01-21 23.32.38.png

De plus, si l'écran de consentement OAuth n'a pas été créé, créez-le. スクリーンショット 2020-01-22 0.13.48.png

Remplissez le nom de l'application et les champs de courrier de support et appuyez sur le bouton de création en bas de l'écran. スクリーンショット 2020-01-22 0.14.13.png

2. Activez l'API YouTube

Ouvrez le lien ci-dessous et recherchez l'API de données YouTube dans la console GCP. Depuis 2020.1, il s'agit de "YouTube Data API v3". Lorsque vous l'ouvrez, il y a un bouton d'activation, alors activez-le. Bibliothèque d'API de la console GCP

スクリーンショット 2020-01-21 23.43.01.png

Création de la source pour le téléchargement

Structure des dossiers

Dossier de travail


$ tree
.
├── movies
│   └── sample001.MP4  #Vidéo à télécharger
├── client_secrets.json
└── upload_video.py

La source

Il existe deux sources, JSON et Python pour les informations d'identification.

Informations d'authentification

Créez client_secrets.json. Pour client_id et client_secret, définissez les valeurs de l'ID client et du secret client créés dans" 1. Création des informations d'autorisation ".

client_secrets.json


{
  "web": {
    "client_id": "[[INSERT CLIENT ID HERE]]",
    "client_secret": "[[INSERT CLIENT SECRET HERE]]",
    "redirect_uris": [],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}

Python

Fondamentalement, vous pouvez utiliser la source de Official, mais si elle est écrite dans le système Python2 et que c'est Python3 tel quel Ça ne marche pas. Donc, je vais le réécrire un peu pour qu'il fonctionne avec Python3. Il y a deux points de réécriture comme suit. ・ Migrer de httplib vers http.client -Récriture du relevé d'impression (En passant, changez le retrait à 4 octets)

upload_video.py(Les commentaires officiels ont été supprimés en raison du manque d'espace)


import http.client  #httplib est Python3 est http.Migrer vers le client
import httplib2
import os
import random
import sys
import time

from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow


httplib2.RETRIES = 1
MAX_RETRIES = 10
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error,
                        IOError,
                        http.client.NotConnected,
                        http.client.IncompleteRead,
                        http.client.ImproperConnectionState,
                        http.client.CannotSendRequest,
                        http.client.CannotSendHeader,
                        http.client.ResponseNotReady,
                        http.client.BadStatusLine)
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
CLIENT_SECRETS_FILE = "client_secrets.json"
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.developers.google.com/

For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
                                   CLIENT_SECRETS_FILE))

YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"


VALID_PRIVACY_STATUSES = ("public", "private", "unlisted")


def get_authenticated_service(args):
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
                                   scope=YOUTUBE_UPLOAD_SCOPE,
                                   message=MISSING_CLIENT_SECRETS_MESSAGE)

    storage = Storage("%s-oauth2.json" % sys.argv[0])
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        credentials = run_flow(flow, storage, args)

    return build(YOUTUBE_API_SERVICE_NAME,
                 YOUTUBE_API_VERSION,
                 http=credentials.authorize(httplib2.Http()))


def initialize_upload(youtube, options):
    tags = None
    if options.keywords:
        tags = options.keywords.split(",")

    body = dict(
        snippet=dict(
            title=options.title,
            description=options.description,
            tags=tags,
            categoryId=options.category
        ),
        status=dict(
            privacyStatus=options.privacyStatus
        )
    )

    insert_request = youtube.videos().insert(
        part=",".join(body.keys()),
        body=body,
        media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True)
    )

    resumable_upload(insert_request)


def resumable_upload(insert_request):
    response = None
    error = None
    retry = 0
    while response is None:
        try:
            print("Uploading file...")  #déclaration d'impression
            status, response = insert_request.next_chunk()
            if response is not None:
                if 'id' in response:
                    print("Video id '%s' was successfully uploaded." % response['id'])
                else:
                    exit("The upload failed with an unexpected response: %s" % response)
        except HttpError as 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 as 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)


if __name__ == '__main__':
    argparser.add_argument("--file", required=True, help="Video file to upload")
    argparser.add_argument("--title", help="Video title", default="Test Title")
    argparser.add_argument("--description",
                           help="Video description",
                           default="Test Description")
    argparser.add_argument("--category", default="22",
                           help="Numeric video category. " +
                                "See https://developers.google.com/youtube/v3/docs/videoCategories/list")
    argparser.add_argument("--keywords", help="Video keywords, comma separated",
                           default="")
    argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES,
                           default=VALID_PRIVACY_STATUSES[0],
                           help="Video privacy status.")
    args = argparser.parse_args()

    if not os.path.exists(args.file):
        exit("Please specify a valid file using the --file= parameter.")

    youtube = get_authenticated_service(args)
    try:
        initialize_upload(youtube, args)
    except HttpError as e:
        print("An HTTP error %d occurred:\n%s" % (e.resp.status, e.content))

Un petit commentaire de source

--Dans l'API de données YouTube, le contenu défini dans l'extrait de code est transmis à l'API. ʻLe corps de initialize_upload` fait un dict de la valeur à passer comme extrait de code.

Effectuer le téléchargement

Depuis la ligne de commande, exécutez comme suit. Puisqu'il existe de nombreux arguments, il peut être plus facile d'utiliser un script shell si vous souhaitez l'exécuter plusieurs fois.

Effectuer le téléchargement vidéo


$ python upload_video.py --file="./movies/sample001.MP4" \
                       --title="Sample Movie" \
                       --description="This is a sample movie." \
                       --category="22" \
                       --privacyStatus="private"

La signification des arguments est la suivante.

--file: chemin de la vidéo à télécharger --title: titre de la vidéo après le téléchargement --description: Description de la vidéo --catégorie: Catégorie. La valeur par défaut est 22 --privacyStatus: paramètres de publication vidéo. Publier en privé si privé

Les éléments et les significations qui peuvent être spécifiés sous forme d'extrait sont décrits ci-dessous.

YouTube Data API Videos [YouTube Data API Videos: insert] (https://developers.google.com/youtube/v3/docs/videos/insert?hl=ja)

Lorsque vous l'exécutez pour la première fois, l'écran passera au navigateur et demandera la sélection du compte Google et l'autorisation de gestion YouTube, veuillez donc l'autoriser en fonction de l'écran. スクリーンショット 2020-01-22 1.06.45.png

Si vous voyez un écran comme celui ci-dessous dans Chrome, affichez les détails et accédez à la page non sécurisée en bas à gauche

スクリーンショット 2020-01-22 1.07.11.png

Autoriser la gestion vidéo. (Bien qu'il puisse être affiché sur un autre écran, il est toujours autorisé.) スクリーンショット 2020-01-22 1.07.22.png

Selon la taille de la vidéo, le téléchargement sera terminé comme suit après un certain temps.

Résultat d'exécution


Uploading file...
Video id '[video id]' was successfully uploaded.

Vous pouvez également confirmer que la vidéo a été publiée à partir de l'écran YouTube.

Ce à quoi j'étais accro: les restrictions d'utilisation de l'API

À l'origine, je voulais utiliser l'API pour télécharger un grand nombre de vidéos dans un lot, mais lorsque j'ai écrit et exécuté un programme qui exécute l'API à plusieurs reprises, l'erreur suivante s'est produite.

Uploading file...
An HTTP error 403 occurred:
b'{\n "error": {\n  "errors": [\n   {\n    "domain": "youtube.quota",\n    "reason": "quotaExceeded",\n    "message": "The request cannot be completed because you have exceeded your \\u003ca href=\\"/youtube/v3/getting-started#quota\\"\\u003equota\\u003c/a\\u003e."\n   }\n  ],\n  "code": 403,\n  "message": "The request cannot be completed because you have exceeded your \\u003ca href=\\"/youtube/v3/getting-started#quota\\"\\u003equota\\u003c/a\\u003e."\n }\n}\n'

Selon l'enquête, l'API est limitée à 10 000 par jour et on dit qu'environ 1 600 unités seront utilisées pour télécharger des vidéos. Donc, il semble que vous puissiez télécharger des vidéos sur YouTube via l'API environ 6 vidéos / jour ...

Erreurs API de données YouTube Présentation de l'utilisation du quota d'API de données YouTube

Une application est nécessaire pour soulever ce problème, mais je l'ai abandonnée parce que c'était juste pour un usage personnel. Au moins j'aurais pu faire ce que je voulais faire si c'était 30 pièces / jour, mais si c'était 6 pièces, le travail manuel serait peut-être plus rapide ...

Cela peut être utile si vous souhaitez télécharger des vidéos dans votre application.

référence

(Officielle) API de données YouTube

Recommended Posts

Mettre en ligne des vidéos à l'aide de l'API YouTube
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé d'utiliser l'API de données YOUTUBE V3
Obtenez des données Youtube en Python à l'aide de l'API Youtube Data
Comment télécharger des vidéos YouTube à l'aide de pytube3
[Python] Obtenez tous les commentaires à l'aide de Youtube Data Api
Transcription de vidéos YouTube à l'aide de Cloud Speech-to-Text de GCP
Téléchargement anonyme d'images à l'aide de l'API Imgur (à l'aide de Python)
Importez un fichier JPG à l'aide de l'API Google Drive en Python
Tester l'API CloudStack à l'aide du simulateur
Reconnaissance de l'âge à l'aide de l'API de Pepper
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API PeeringDB 2.0
Utilisez configparser lors de l'utilisation de l'API
Jouez avec l'API de données YouTube v3 à l'aide du client Python de l'API Google
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
Essayez d'utiliser l'API Admin de la passerelle Janus
Obtenir des données Salesforce à l'aide de l'API REST
Contre-mesures contre le proxy lors de l'utilisation de l'API WEB
Acquisition de données à l'aide de l'API googlemap de python
Détection de logo à l'aide de l'API de détection d'objets TensorFlow
[Python3] Google translate google translation sans utiliser l'API
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
Mémo d'acquisition de données à l'aide de l'API Backlog
Essayez d'utiliser l'API d'action de Python argparse
Créez une API en utilisant hug avec mod_wsgi
Reconnaissance faciale à l'aide de l'API de Pepper
Créer une API CRUD à l'aide de l'API rapide
Exécutez Ansible à partir de Python à l'aide de l'API
J'ai essayé d'utiliser l'API checkio
Identifiez la chaîne YouTube de la vidéo Hikakin à partir d'images miniatures à l'aide de CNN