Como subir vídeos usando la api de peertube

Con el siguiente script se puede hacer:

#!/usr/bin/env python3
# Testeado contra peertube 4.x.x

import time
import json
from pprint import pprint
from mimetypes import guess_type

import requests
import click
from requests.structures import CaseInsensitiveDict


@click.group(no_args_is_help=True)
def cli():
pass


@cli.command("list-licenses")
@click.option(
"--host",
"-h",
default="https://fediverse.tv",
help="Dirección del servidor de peertube",
)
def list_licenses(host):
try:
api = host + "/api/v1"
licenses = requests.get(api + "/videos/licences").json()
pprint(licenses)
except Exception as e:
print("Ha ocurrido un error: {e}", e)


@cli.command("list-languages")
@click.option(
"--host",
"-h",
default="https://fediverse.tv",
help="Dirección del servidor de peertube",
)
def list_languages(host):
try:
api = host + "/api/v1"
licenses = requests.get(api + "/videos/languages").json()
pprint(licenses)
except Exception as e:
print("Ha ocurrido un error: {e}", e)


@cli.command("list-categories")
@click.option(
"--host",
"-h",
default="https://fediverse.tv",
help="Dirección del servidor de peertube",
)
def list_categories(host):
try:
api = host + "/api/v1"
licenses = requests.get(api + "/videos/categories").json()
pprint(licenses)
except Exception as e:
print("Ha ocurrido un error: {e}", e)


@cli.command("list-privacy")
@click.option(
"--host",
"-h",
default="https://fediverse.tv",
help="Dirección del servidor de peertube",
)
def list_categories(host):
try:
api = host + "/api/v1"
licenses = requests.get(api + "/videos/privacies").json()
pprint(licenses)
except Exception as e:
print("Ha ocurrido un error: {e}", e)


@cli.command("upload-video")
@click.option(
"--host",
"-h",
default="https://fediverse.tv",
help="Dirección del servidor de peertube",
)
@click.option("--username", "-u", help="Usuario para hacer login", required=True)
@click.option("--password", "-p", help="Contraseña para hacer login", required=True)
@click.option("--video-name", "-v", help="Nombre del vídeo", required=True)
@click.option("--channel", "-c", help="Canal al que subir el vídeo", required=True)
@click.option("--license-id", "-l", help="Licencia del vídeo")
@click.option("--description", "-d", help="Descripción del vídeo")
@click.option(
"--nsfw", is_flag=True, default=False, help="Activar si es un vídeo sensible"
)
@click.option("--tag", "-t", multiple=True, help="Tag a categorizar el vídeo")
@click.option("--privacy-id", "-P", default=1, help="Tipo de privacidad del vídeo")
@click.option("--language-id", "-L", help="Lenguaje del vídeo")
@click.option("--video-path", "-V", help="Ruta del vídeo", required=True)
@click.option("--category-id", "-C", help="Categoría del vídeo")
def upload_video(
host,
username,
password,
video_name,
channel,
license_id,
description,
nsfw,
tag,
privacy_id,
language_id,
video_path,
category_id,
):
api = host + "/api/v1"

try:
# Conseguir el token de usuarie
client_tokens = requests.get(api + "/oauth-clients/local").json()
# Conseguir el token de acceso personal
data = {
"client_id": client_tokens["client_id"],
"client_secret": client_tokens["client_secret"],
"grant_type": "password",
"response_type": "code",
"username": username,
"password": password,
}
access_token = requests.post(api + "/users/token", data=data).json()[
"access_token"
]
# Definir el token de acceso personal para subir el vídeo
headers = CaseInsensitiveDict()
headers["Authorization"] = "Bearer " + access_token
# Conseguir el ID del canal
channel_id = requests.get(api + "/video-channels/" + channel).json()["id"]
# Definir las características del video
data = {
"name": video_name,
"channelId": channel_id,
"category": category_id,
"licence": license_id,
"language": language_id,
"description": description,
"nsfw": nsfw,
"tags": tag,
"privacy": privacy_id,
"waitTranscoding": True,
"commentsEnabled": True,
"downloadEnabled": True,
}
file_mime_type = guess_type(video_path)[0]
with open(video_path, "rb") as f:
upload_video = requests.post(
api + "/videos/upload",
data=data,
headers=headers,
files={"videofile": (data["name"], f, file_mime_type)},
)
pprint(upload_video.json())
except Exception as e:
print("Ha ocurrido un error: {e}", e)


if __name__ == "__main__":
cli()

Para usarlo, hay que  copiarlo en un directorio, crear un virtualenv y descargar sus dependencias:

virtualenv venv
source venv/bin/activate
pip install requests click

Se pueden ver todos los parámetros que aceptan cada orden usando el parámetro help. Una cosa a tener en cuenta es que por defecto apunta a fediverse.tv, pero se puede cambiar con el parámetro –host.

El script, además de permitir subir vídeos, tiene utilidades para conseguir la información necesaria para poder modificar los parámetros del vídeo, como por ejemplo el lenguaje o la licencia. Se podría usar de la siguiente forma:

python uploadPeertubeVideo.py list-categories
python uploadPeertubeVideo.py list-languages
python uploadPeertubeVideo.py list-licenses
python uploadPeertubeVideo.py list-privacy

Estas órdenes nos darán los IDs de cada sección y podremos usarlas al subir vídeo, aunque no son obligatorias, como se verá en el ejemplo. Para usarlas, consultar la ayuda:

python uploadPeertubeVideo.py upload-video -u user -p password -v nombreVideo -c canal -V rutaVideo

 

Etiquetado:
FediverseTV