Esta pagina se ve mejor con JavaScript habilitado

Acceso GDrive KODI mediante FTP

 ·  🎃 kr0m

En otras ocasiones ya hemos explicado como acceder al contenido de GDrive desde KODI y como acceder a un servidor FTP también desde este. Pero el problema de acceder a contenido 4K desde el addon de KODI es que este resulta muy lento dando problemas como congelaciones momentáneas o retardos indeseados por otro lado el acceso FTP funciona bien pero requiere de una capacidad de almacenamiento inviable.

En este artículo utilizaremos PlexDrive y la librería pyftpdlib para servir el contenido de GDrive a un KODI instalado en AndroidTV.


PlexDrive:

Debemos tener en cuenta que el acceso a GDrive desde PlexDrive es de solo lectura:

Please note that plexdrive doesn't currently support writes (adding new files or modifications), it only supports reading existing files and deletion.

En mi caso voy a utilizar una jail bajo IOCage desde la que importaré el contenido de GDrive y lo serviré por FTP.

Montamos el sistema de ficheros por FUSE en el padre y se lo pasamos a la jail para no tener que modificar permisos especiales en esta.

Instalamos el software necesario:

pkg install fusefs-lkl

Cargamos el módulo fusefs:

kldload fusefs

Ahora debería existir un dispositivo llamado fuse:

ls -la /dev/fuse

crw-rw-rw-  1 root  operator  0xe3 Nov 30 23:28 /dev/fuse

Configuramos el SO para que cargue el módulo de forma automática en cada arranque:

vi /etc/rc.conf

kld_list="fusefs ..."

Averiguamos el drive-id copiándolo desde la URL del navegador mostrada cuando accedemos a GDrive, en mi caso la URL tiene el siguiente aspecto:

https://drive.google.com/drive/folders/0ANN6pzUlNUgXUk9PVA

El drive-id es: 0ANN6pzUlNUgXUk9PVA

Nos bajamos PlexDrive, podemos ver las versiones disponibles en este enlace de github

Creamos el directorio donde montaremos la unidad de GDrive:

mkdir /mnt/gdrive

Arrancamos manualmente PlexDrive:

/root/plexdrive-freebsd-amd64 mount -o allow_other -v 3 –drive-id=0ANN6pzUlNUgXUk9PVA /mnt/gdrive

1. Please go to https://console.developers.google.com/
2. Create a new project
3. Go to library and activate the Google Drive API
4. Go to credentials and create an OAuth client ID
5. Set the application type to 'other'
6. Specify some name and click create
7. Enter your generated client ID: 

Al acceder a la URL mostrada nos aparecerá la siguiente interfaz donde debemos darle al botón de la derecha “CREAR PROYECTO”:

Indicamos un nombre y le damos a crear:

Ya tenemos el proyecto creado:

Activamos la API de Google drive en el proyecto, para ello accedemos a “API y servicios” -> Biblioteca:

Buscamos “Google drive api” y clickamos sobre él:

Le damos a habilitar:

Nos aparecerá la siguiente ventana desde la que debemos crear las credenciales de acceso:

Le damos a “CREAR CREDENCIALES”:

Seleccionamos “ID de cliente OAuth”:

Nos aparecerá la siguiente ventana donde debemos darle a “CONFIGURAR PANTALLA DE CONSENTIMIENTO”:

En User Type indicamos: Externos y le damos a “CREAR”:

Rellenamos los datos obligarotios del formulario y le damos a “GUARDAR Y CONTINUAR”:


No necesitamos ningún tipo de permiso especial, así que le damos a “GUARDAR Y CONTINUAR”:

Agregamos un usuario, le damos a “ADD USER”:

Indicamos el usuario y le damos a “AGREGAR”:

Debería de aparecer en la lista, le damos a “GUARDAR Y CONTINUAR”:

Aparecerá un resumen, le damos a “VOLVER AL PANEL”:


Nos llevará a la “Pantalla de consentimiento de OAuth”, desde aquí accedemos a la sección “Credenciales”:

Le damos a “CREAR CREDENCIALES” de nuevo:

Seleccionamos “ID de cliente OAuth”:

En tipo de aplicación selccionamos “App de escritorio”, le damos un nombre y clickamos sobre “CREAR”:

Nos mostrará la siguiente información:

Podemos ver el cliente OAuth:

Seguimos con la consola de PlexDrive:

1. Please go to https://console.developers.google.com/
2. Create a new project
3. Go to library and activate the Google Drive API
4. Go to credentials and create an OAuth client ID
5. Set the application type to 'other'
6. Specify some name and click create
7. Enter your generated client ID: XXXXXXXXXXXXXXXXXXXXXXX
8. Enter your generated client secret: YYYYYYYYYYYYYYYYYYY
Go to the following link in your browser https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=ZZZZZZZZZZZ-270hoqea0pinv0nc3sbpfkuja68alask.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=state-token

Accedemos a la URL que nos indica PlexDrive mediante el usuario anteriormente autorizado:

Aparecerá el siguiente mensaje donde le damos a continuar:

Le volvemos a dar a continuar:

Nos mostrará un código:

En la consola pegamos dicho código:

Paste the authorization code: XXXXXXXXXXXXXXXXXXXX

Le damos a Ctrl+C y demonizamos el montaje de la unidad de GDrive:

vi /usr/local/etc/rc.d/gdrive

#! /bin/sh
#
# $FreeBSD$
#

# PROVIDE: gdrive
# REQUIRE: DAEMON
# KEYWORD: shutdown 

. /etc/rc.subr

name="gdrive"
rcvar="${name}_enable"
extra_commands="status"

start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"

gdrive_start(){
    echo "Clearing cache files: ${name}"
    rm /root/.plexdrive/cache.bolt
    echo "Starting service: ${name}"
    /usr/sbin/daemon -S -p /var/run/${name}.pid -T gdrive -u root /root/plexdrive-freebsd-amd64 mount -o allow_other -v 3 --drive-id=0ANN6pzUlNUgXUk9PVA /mnt/gdrive
}

gdrive_stop(){
    if [ -f /var/run/${name}.pid ]; then
        echo "Stopping service: ${name}"
        kill -s INT $(cat /var/run/${name}.pid)
        sleep 3
    else
        echo "It appears ${name} is not running."
    fi
}

gdrive_status(){
    if [ -f /var/run/${name}.pid ]; then
        echo "${name} running with PID: $(cat /var/run/${name}.pid)"
    else
        echo "It appears ${name} is not running."
    fi
}


load_rc_config ${name}
run_rc_command "$1"

Asignamos los permisos necesarios:

chmod 555 /usr/local/etc/rc.d/gdrive
chown root:wheel /usr/local/etc/rc.d/gdrive

Habilitamos el servicio y lo arrancamos:

sysrc gdrive_enable="yes"
service gdrive start


Ahora importaremos el directorio /mnt/gdrive del padre a la jail.

Creamos el directorio en la jail:

iocage console GDrive
mkdir /mnt/gdrive
exit

Importamos el directorio mediante el comando fstab de IOCage:

iocage fstab -a GDrive “/mnt/gdrive /mnt/gdrive nullfs rw 0 0”

Successfully added mount to GDrive's fstab

Ahora accedemos a la jail y montamos el servidor FTP, instalamos la librería necesaria para ello:

pip install pyftpdlib

Demonizamos el servicio FTP:

vi /usr/local/etc/rc.d/pyftpdlib

#! /bin/sh
#
# $FreeBSD$
#

# PROVIDE: pyftpdlib
# REQUIRE: DAEMON
# KEYWORD: shutdown 

. /etc/rc.subr

name="pyftpdlib"
rcvar="${name}_enable"
extra_commands="status"

start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"

pyftpdlib_start(){
    echo "Starting service: ${name}"
    chdir /mnt/gdrive
    /usr/sbin/daemon -S -p /var/run/${name}.pid -T gdrive -u kr0m /usr/local/bin/python -m pyftpdlib -p 2121 -u USERNAME -P PASSWORD -i 192.168.69.14
}

pyftpdlib_stop(){
    if [ -f /var/run/${name}.pid ]; then
        echo "Stopping service: ${name}"
        kill -s INT $(cat /var/run/${name}.pid)
        sleep 3
    else
        echo "It appears ${name} is not running."
    fi
}

pyftpdlib_status(){
    if [ -f /var/run/${name}.pid ]; then
        echo "${name} running with PID: $(cat /var/run/${name}.pid)"
    else
        echo "It appears ${name} is not running."
    fi
}


load_rc_config ${name}
run_rc_command "$1"

Asignamos los permisos necesarios:

chmod 555 /usr/local/etc/rc.d/pyftpdlib
chown root:wheel /usr/local/etc/rc.d/pyftpdlib

Habilitamos el servicio y lo arrancamos:

sysrc pyftpdlib_enable="yes"
service pyftpdlib start

Comprobamos que el servidor FTP esté activo:

sockstat -46 -l -s|grep 2121

kr0m     python3.8  18969 4  tcp4   192.168.69.14:2121    *:*                                LISTEN

Ahora tan solo debemos importar el contenido en KODI tal y como se indica en este artículo anterior


Token expirado:

Google genera los tokens de apps no publicadas en modo “Testing”:

  - A Google Cloud Platform project with an OAuth consent screen configured for an external user type and a publishing status of "Testing" is issued a refresh token expiring in 7 days.

Que traducido sería algo así:

Un proyecto de Google Cloud Platform con una pantalla de consentimiento de OAuth configurada para un tipo de usuario externo y un estado de publicación de "Prueba" recibe un token de actualización que vence en 7 días.

Esto provoca el siguiente error en PlexDrive cada 7 días:

Response: {
  "error": "invalid_grant",
  "error_description": "Token has been expired or revoked."
}

Publicando la app esta limitación desaparecería, pero para publicar una app se requieren muchos pasos adicionales como configuración de DNS con entradas específicas de Google y demás.

Una maner sencilla pero manual de resolverlo es entrando cada semana y regenarando el token del usuario, para ello eccedemos a la sección de credenciales del proyecto:
https://console.developers.google.com/apis/credentials

Le damos a editar al id del cliente anteriormente creado:

Le damos a “REESTABLECER SECRETO”:

Confirmamos que deseamos reestablecer el secreto:

Ahora debemos resetear PlexDrive desde cero, en mi caso primero paro la jail que sirve el contenido:

iocage stop GDrive

Paro el servicio:

service gdrive stop

Elimino la configuración de PlexDrive:

rm -rf /root/.plexdrive/

Arranco PlexDrive manualmente donde nos pedirá los datos de acceso de nuevo:

/root/plexdrive-freebsd-amd64 mount -o allow_other -v 3 –drive-id=0ANN6pzUlNUgXUk9PVA /mnt/gdrive

1. Please go to https://console.developers.google.com/
2. Create a new project
3. Go to library and activate the Google Drive API
4. Go to credentials and create an OAuth client ID
5. Set the application type to 'other'
6. Specify some name and click create
7. Enter your generated client ID: XXXXXXXXXXXXXXXXXXXXX
8. Enter your generated client secret: YYYYYYYYYYYYYYYYYYYY

Go to the following link in your browser https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=ZZZZZZZZZZZZ-270hoqea0pinv0nc3sbpfkuja68alask.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=state-token
Paste the authorization code: 4/1AX4XfWgwVi61FfxtHN0WpBUh_b3UvGhXfWscjb_B-oNQyl4zVniUtdqbQQg

Cuando haya conectado correctamente lo paramos:

Ctrl+C

Arrancamos el servicio:

service gdrive start

Finalmente arrancamos la jail:

iocage start GDrive

Si te ha gustado el artículo puedes invitarme a un RedBull aquí