Permitir que múltiples instalaciones de MCEBuddy compartan la cola de conversión

Tengo varios sistemas con MCEBuddy instalado (actualmente un PC principal y un servidor DVR, pero podrían ser más si se implementa). Me gustaría ver la opción de compartir la carga de trabajo entre sistemas, de modo que los sistemas que no tienen cola en ese momento puedan tomar parte de la cola de otra instalación de MCEBuddy.
Me doy cuenta de que esto podría requerir algunos ajustes, pero si una instalación copia y transfiere el trabajo a otra, debería evitar algunos problemas de permisos. Esto DEBERÍA requerir que ambas instalaciones estén autorizadas para trabajar entre sí (quizás un “emparejamiento”, para usar la jerga de Bluetooth), y el archivo completado tendría que ser transferido de vuelta al sistema original y colocado según la configuración de ese sistema.
Obviamente, no debería eliminarse de la cola hasta que se complete y regrese, y los elementos que están siendo procesados por otro sistema deberían pausarse en la cola y no iniciarse hasta X tiempo después de que el sistema auxiliar se desconecte o se active manualmente. Tal vez incluso un mínimo de cola antes de que se permita la descarga de trabajo…
Sin embargo, dada la personalización del sistema MCEBuddy, creo que podrías tener una instalación secundaria que procese el archivo según la configuración del sistema originador, usando el sistema secundario. Recomendaría que la configuración de hardware sea específica de cada sistema, ya que no todos están construidos con las mismas especificaciones, pero tener la opción de que mi PC principal descargue parte de la cola del sistema DVR ayudaría…
Debería haber botones en el panel de estado de MCEBuddy que digan “Permitir asistencia de cola”. Esto solo estaría activo cuando la cola de un sistema esté vacía.
Básicamente, busco una forma de hacer clic en un botón y permitir que un sistema secundario realice la transcodificación según las instrucciones del sistema original, ayudando a aliviar una carga pesada del DVR y compensar las limitaciones de sistemas más débiles/antiguos al permitir que otros sistemas ayuden…
Actualmente, los archivos tienen que moverse fuera del sistema originador y transferirse a un segundo sistema para asumir la carga; esto es bastante ineficiente y añade capas adicionales de riesgo de corrupción.

Escribí un script por lotes para delegar a otro servidor o servidores. No es tan fluido como una solución integrada, pero creo que está más cerca que algunos de los otros scripts propuestos. Funciona usando una computadora con MCEBuddy como administrador de cola, que cede a otros servidores según corresponda.

Esencialmente, hace lo siguiente:

  • Verifica si el servidor 1 ha alcanzado el número umbral de conversiones simultáneas que configuraste para activar la delegación a otro servidor.
  • Verifica si el servidor 2 responde y acepta conversiones.
  • Verifica si el servidor 2 está en o por debajo del umbral que configuraste para cuántas conversiones debe tener en cola (y/o si su instancia de MCEbuddy está inactiva, si esa es la condición que estableciste).
  • Si es así, mueve el archivo a la carpeta que definiste para ese servidor y elimínalo de la cola del servidor 1.
  • Si no, entonces procede al servidor 3, servidor 4, etc. hasta encontrar un servidor disponible.
  • Si termina la lista y ningún otro servidor lo acepta, entonces el servidor 1 procesa el archivo como de costumbre.

Se aplican las siguientes suposiciones:

  • instalaste mcebuddy en el directorio predeterminado en la computadora principal
  • usas el puerto predeterminado para interactuar con el servidor
  • copias el código de abajo y lo guardas como un archivo .bat después de personalizar las primeras variables
  • agregas una entrada “PreMetaCustomCommandPath=” al perfil de conversión para apuntar a este archivo .bat. (Esto se ejecuta por perfil.)

Se aplican las siguientes limitaciones (así que tienes que configurar estas cosas tú mismo):

  • indicar al servidor 2 qué directorio monitorear
  • indicar al servidor 2 cómo procesar el archivo o dónde colocarlo
  • indicar al servidor 2 qué hacer con el archivo original cuando termine
  • cambiar un servidor mcebuddy “pausado”, “programado” o “detenido” a “iniciado”
  • permitir al servidor 2 acceder al archivo, o al servidor 1 acceder al directorio monitoreado por el servidor 2
  • recuperar archivos no procesados si un servidor secundario se detiene después de la delegación
  • evitar el firewall de Windows si aún no lo has configurado
  • dejar un registro bonito para MCEbuddy. MCEBuddy en el servidor 1 ve cada archivo transferido como una conversión fallida.

Otras notas:

  • Puedes definir tantos servidores como desees en las variables iniciales (establece el servidor, la ruta y la longitud mínima de cola para cada uno) y el resto del código lo manejará desde ahí.
  • Está configurado para crear algunos archivos de texto en tu ruta de monitoreo raíz. Estos son solo porque no soy muy bueno con los scripts por lotes. Si alguien puede mejorar mi código, ¡por favor hazlo! Puedo imaginar algunas cosas que podrían estar codificadas más eficientemente, pero aún no estoy lo suficientemente familiarizado.

Esto es lo que tengo en mi \config\profiles.conf bajo el perfil que estoy usando. El script por lotes depende de que al menos los primeros cinco CustomCommandParameters estén como los he ingresado aquí. Las otras tres líneas puedes personalizarlas:

PreMetaCustomCommandPath=C:\\Shared\\MediaInfo\\Copy.bat
PreMetaCustomCommandParameters="%sourcefile%" "%relativesourcepath%" "%originalfilename%" "%originalext%" "%originalfilepath%"
PreMetaCustomCommandHangPeriod=600
PreMetaCustomCommandCritical=false

El período de espera es más de lo necesario, pero debe ser lo suficientemente largo como para permitir copiar o mover archivos si se mueven a una unidad, recurso compartido, computadora, etc. diferente.

Y aquí está el script real:

@echo off
@setlocal enableextensions enabledelayedexpansion

rem *******************************
rem **** Variables personalizables ***
rem *******************************

rem ****** Debe llenar en orden; no omita un número ******
rem ****** Cada servidor definido también debe tener un monitorpath#= y minQueue#= definido abajo ******
set server1=10.1.10.141
set server2=10.1.10.108
set server3=
set server4=

rem ****** El servidor de archivos puede ser el mismo que la máquina MCEBuddy. Solo se usa por defecto para definir monitorpath abajo. 
rem ****** Si insertas rutas absolutas en monitorpath, fileserver puede ignorarse o dejarse indefinido. ******

set fileserver=10.1.10.108

rem ****** Establece lo que desees. Estos deben definirse como se accede desde el servidor 1, ya que es donde se ejecuta el script.
rem ****** Configura el/los otro(s) servidor(es) para que monitoree cada uno de estos lugares correspondientes al servidor#.
rem ****** No uses barras al final.
rem ****** Puse los míos dentro de la carpeta original y configuré el servidor principal para ignorar "distributed\\server*" y sus subcarpetas, pero puedes definirlos cada uno independientemente, siempre que cada servidor pueda acceder a su carpeta.

set "monitorpath1=\\\\%fileserver%\\F\\Multimedia\\Video"
set "monitorpath2=%monitorpath1%\\distributed\\server2"
set "monitorpath3=%monitorpath1%\\distributed\\server3"
set "monitorpath4=%monitorpath1%\\distributed\\server4"

rem ****** Establece a 0 para omitir ese servidor; establece a 1 para usar solo cuando esté inactivo; o establece cualquier otro número.
rem ****** El servidor 1 procesará todo hasta que se alcance este número de conversiones simultáneas, luego comenzará a pasar al siguiente servidor hasta que también alcance este número, y así sucesivamente. 
rem ****** El exceso se queda con el servidor 1 hasta que otro servidor caiga por debajo de su umbral.

set minQueue1=10
set minQueue2=2
set minQueue3=2
set minQueue4=2

rem *******************************
rem ******* Variables fijas; generalmente no necesitan ajuste *******
rem *******************************

set relativesourcepath=%2
set relativesourcepath=%relativesourcepath:"=%
set filename=%3.%4
set filename=%filename:"=%
set absolutesourcepath=%5
set absolutesourcepath=%absolutesourcepath:"=%

set servernumber=1
set fail=0
rem ****** Buscar el tamaño de la cola de cada servidor ******
:queueLookup
"C:\\Program Files\\MCEBuddy2x\\mcebuddy.usercli.exe" --command=query --action=queuelength --server=!server%servernumber%! >"%monitorpath1%\\queue!servernumber!.txt"
findstr /C:"queue = " "%monitorpath1%\\queue!servernumber!.txt">"%monitorpath1%\\queue!servernumber!a.txt"
move /y "%monitorpath1%\\queue!servernumber!a.txt" "%monitorpath1%\\queue!servernumber!.txt"
set /p queue!servernumber!=<"%monitorpath1%\\queue!servernumber!.txt"
set "queue!servernumber!=!queue%servernumber%:~-1!
if "!queue%servernumber%!"=="~-1" (
set queue!servernumber!=
set /a fail=fail+1
if !fail! EQU 3 goto:skip
SET /A rdm=%RANDOM% * 5 / 32768 + 1
timeout !rdm!
goto:queueLookup
)
:skip
set fail=0
set /a servernumber=servernumber+1
if defined server!servernumber! (
goto:queueLookup
) else (
set servernumber=1
goto:queueCompare
)

rem ****** Verificar si cada servidor está "iniciado" y comparar la longitud de la cola con el umbral definido. ******
rem ****** Si el servidor secundario está "detenido", "pausado" o "programado", se omitirá. ******
rem ****** Transferir el archivo al primer servidor donde se cumplan las condiciones y activar el reescaneo de ese servidor. ******
:queueCompare
if !servernumber!==1 (
if !queue%servernumber%! LEQ !minQueue%servernumber%! (
if !minQueue%servernumber%! GEQ 1 goto:ending
)
)
set /a servernumber=servernumber+1
if defined server!servernumber! (
goto:nextserver
) else (
goto:ending
)
:nextserver
"C:\\Program Files\\MCEBuddy2x\\mcebuddy.usercli.exe" --command=query --action=enginestate --server=!server%servernumber%!>"%monitorpath1%\\status!servernumber!.txt"
set "Server!servernumber!Status="
findstr /C:"started" "%monitorpath1%\\status!servernumber!.txt"
if "%ERRORLEVEL%"=="0" set Server!servernumber!Status=1
findstr /C:"progress" "%monitorpath1%\\status!servernumber!.txt"
if "%ERRORLEVEL%"=="0" set Server!servernumber!Status=1
if defined Server!servernumber!Status (
if !minQueue%servernumber%! GTR !queue%servernumber%! (
rem *******también podría decir algo como: if !queue%servernumber%! LEQ !queue1!
md "!monitorpath%servernumber%!\\%relativesourcepath%" 2>nul
move /y %1 "!monitorpath%servernumber%!\\%relativesourcepath%\\%filename%"
"C:\\Program Files\\MCEBuddy2x\\mcebuddy.usercli.exe" --command=engine --action=rescan --server=!server%servernumber%!
goto:ending
) else (
goto:queueCompare
)
)

:ending

Actualizado el 19/3/2019 para corregir algunos errores en el script.