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:
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: