~/copiona /Interfaz shell tu mejor amiga [Barca PIP Streaming]

shell skills for fun and piracy

Streaming de videos subtitulados via cytu.be

cytu.be permite ingresar una url y reproducir una video con sus subtítulos en streaming a varias personas de forma sync:

Transmitir de esta forma tiene algunos requerimientos:

  1. El video tiene que estar en .mp4
  2. Los subtítulos tienen que estar en .vtt y codigicación UTF-8 (para que salgan bien los tíldes)
  3. Crear un json con la información (para que cytube busque el video junto con el subtítulo)

Vamos paso a paso:

1 - Video

Para esta parte es necesario tener ffmpeg instalado en tu máquina si tenés la pelicula/documental en .mkv u otro formato con estas -flags lo convertis a .mp4:

a) Si el video contiene subtítulos, convertis el .mkv a .mp4 y los subtítulos de -map 0s los extraes en peli.vtt

ffmpeg -i peli.mkv -c:v copy -c:a libopus -ac 2 -b:a 128k peli.mp4 -map 0:s peli.vtt

b) Si tu video no contiene subtítulos incrustados podés hacer:

ffmpeg -i peli.mkv -c:v copy -c:a copy peli.mp4

2 - .srt a .vtt

for sub in *.srt; do ffmpeg -i $sub $sub.vtt; done (con esto pasamos todos los subtítulos que tengamos en el directorio que estamos paradzs a .vtt)

si nos aparece un error como este:

[srt @ 0x55da4235bf80] Invalid UTF-8 in decoded subtitles text; maybe missing -sub_charenc option
Error while decoding stream #0:0: Invalid data found when processing input

quiere decir que nuestro subtitulo.srt esta en una codificacion diferente a UTF-8, para cambiar la codificación, podemos abrir el subtitulo con Gedit (editor de texto) y guardarlo como UTF-8 en el box de codificación.

3 - crear el json con pyton by @unperson

Para esto vamos a usar el script que hizo @unperson en pyton, primero editaremos la linea 7 que dice (URL=””)con la url donde estará hosteado el video y los subtítulos. Luego podemos guardar este código con un nombre por ejemplo convertjson.py

#!/usr/bin/env python3
import sys
from subprocess import check_output
import json
from os import path, listdir
from urllib.parse import quote
URL="https://example.com"
file = sys.argv[1]
dirname, filename = path.split(file)
root, extension = path.splitext(filename)
ffprobe = check_output([*"ffprobe -v quiet -show_format -of json".split(' '), file])
fformat = json.loads(ffprobe)['format']
out = {
    'title': root,
    "duration": float(fformat['duration']),
    "live": False,
    "sources": [
        {
          "url": URL + quote(file),
          "contentType": "video/" + extension[1:],
          "quality": 1080
        }
    ],
}
textTracks = []
for file in listdir('./' + dirname):
    if file.startswith(root + '.') and file.endswith(".vtt"):
        lang = file[len(root + '.'):-len(".vtt")]
        textTracks.append({
            'url': URL + quote(path.join(dirname, file)),
            'contentType': "text/vtt",
            'name': "Subtitles " + lang
        })
if textTracks: out['textTracks'] = textTracks
json.dump(out, sys.stdout, indent=2)

Lo ponemos en el mismo directorio que tengamos la película/documental en .mp4 y los subtítulos .vtt luego:

python convertjson.py peli.mp4

y nos genera algo como esto:

{
  "title": "peli",
  "duration": 4773.333,
  "live": false,
  "sources": [
    {
      "url": "https://url-host/peli.mp4",
      "contentType": "video/mp4",
      "quality": 1080
    }
  ],
  "textTracks": [
    {
      "url": "https://url-host/peli.vtt",
      "contentType": "text/vtt",
      "name": "Subtitles "
    }
  ]
}

Luego vamos a cytu.be y con una cuenta creada podemos agregar el json al pulsar [+] cytu.be

agradecimientos a la barca streaming, @unperson && @void que me ayudaron con esto <3

GO PIRATE!

~librenauta