Permettre à plusieurs installations de MCEBuddy de partager la file d'attente de conversion

J’ai plusieurs systèmes MCEBuddy (actuellement un PC principal et un serveur DVR, mais peut-être plus si vous implémentez cela). J’aimerais voir une option pour partager la charge entre les systèmes, afin qu’un système non actuellement en file d’attente puisse prendre une partie de la file d’un autre MCEBuddy.

Je réalise que cela pourrait nécessiter des ajustements, mais si une installation copie et transfère le fichier vers une autre, cela contournerait certains problèmes de permissions. Cela DEVRAIT exiger que les deux installations soient autorisées à travailler ensemble (peut-être un « appariement » pour utiliser le langage Bluetooth), et le fichier terminé devrait être renvoyé vers le système d’origine et placé selon la configuration initiale.

Évidemment, il ne devrait pas être retiré de la file tant qu’il n’est pas terminé et renvoyé. Les éléments traités par un autre système devraient être mis en pause dans la file et non démarrés avant un certain temps après la déconnexion du système auxiliaire, ou une activation manuelle. Peut-être même un seuil minimum de file avant que le délestage ne soit autorisé…

Cependant, étant donné la personnalisation du système MCEBuddy, je pense qu’une installation secondaire pourrait traiter le fichier selon les paramètres de l’origine, en utilisant le système secondaire. Je recommanderais que les paramètres matériels soient spécifiques à chaque système, car tous ne sont pas construits de la même manière, mais permettre à mon PC principal de délester une partie de la file du système DVR serait utile…

Il faudrait des boutons sur le panneau de statut MCEBuddy pour « Autoriser l’assistance de file ». Cela ne serait actif que lorsque la file d’un système est vide.

En gros, je cherche un moyen de cliquer sur un bouton et permettre à un système secondaire de faire le transcodage selon les instructions du système d’origine, aidant à gérer une lourde charge DVR et compensant les limitations d’un système plus faible ou plus ancien en permettant à d’autres systèmes d’aider…

Actuellement, les fichiers doivent être déplacés de l’origine vers un second système pour prendre la relève, ce qui est plutôt inefficace et ajoute des couches supplémentaires de risque de corruption…

J’ai écrit un script batch pour déléguer à un ou plusieurs autres serveurs. Ce n’est pas aussi fluide qu’une solution intégrée, mais je pense que c’est plus proche que certains des autres scripts proposés. Il fonctionne avec un ordinateur utilisant MCEBuddy comme gestionnaire de file d’attente, qui délègue aux autres serveurs selon les besoins.

Essentiellement, il fait ceci :

  • Vérifie si le serveur 1 a atteint le nombre maximum de conversions simultanées que vous avez défini pour déclencher la délégation vers un autre serveur.
  • Vérifie si le serveur 2 répond et accepte les conversions.
  • Vérifie si le serveur 2 est à ou en dessous du seuil que vous avez défini pour le nombre de conversions en file d’attente (et/ou si son instance MCEBuddy est inactive, si c’est la condition que vous avez définie).
  • Si oui, déplace le fichier vers le dossier que vous avez défini pour ce serveur, et le retire de la file d’attente du serveur 1.
  • Si non, passe au serveur 3, serveur 4, etc. jusqu’à ce qu’il trouve un serveur disponible.
  • S’il finit la liste et qu’aucun autre serveur ne l’accepte, alors le serveur 1 traite le fichier comme d’habitude.

Les hypothèses suivantes s’appliquent :

  • vous avez installé mcebuddy dans le répertoire par défaut sur l’ordinateur principal
  • vous utilisez le port par défaut pour interagir avec le serveur
  • vous copiez le code ci-dessous et le sauvegardez en tant que fichier .bat après avoir personnalisé les premières variables
  • vous ajoutez une entrée « PreMetaCustomCommandPath= » au profil de conversion pour pointer vers ce fichier .bat. (Cela s’exécute par profil.)

Les limitations suivantes s’appliquent (et vous devez donc configurer ces éléments vous-même) :

  • dire au serveur 2 quel répertoire surveiller
  • dire au serveur 2 comment traiter le fichier ou où le placer
  • dire au serveur 2 quoi faire avec le fichier original une fois terminé
  • changer un serveur mcebuddy « en pause », « planifié » ou « arrêté » en « démarré »
  • activer l’accès pour que le serveur 2 accède au fichier, ou pour que le serveur 1 accède au répertoire surveillé par le serveur 2
  • récupérer les fichiers non traités si un serveur secondaire est arrêté après la délégation
  • contourner le pare-feu Windows si vous ne l’avez pas déjà configuré
  • laisser un joli journal pour MCEBuddy. MCEBuddy sur le serveur 1 considère chaque fichier transféré comme une conversion échouée.

Autres notes :

  • Vous pouvez définir autant de serveurs que vous voulez dans les variables initiales (définissez le serveur, le chemin et la longueur minimale de file d’attente pour chacun) et le reste du code gérera cela.
  • Il est configuré pour créer quelques fichiers texte dans votre chemin de surveillance racine. Ce n’est que parce que je ne suis pas très bon en script batch. Si quelqu’un peut améliorer mon code, qu’il le fasse ! Je peux imaginer quelques choses qui pourraient être codées plus efficacement, mais je ne suis pas assez familier (encore).

Voici ce que j’ai dans mon \config\profiles.conf sous le profil que j’utilise. Le script batch dépend au moins des cinq premiers CustomCommandParameters tels que je les ai entrés ici. Les trois autres lignes peuvent être personnalisées :

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

Le délai d’attente est plus que nécessaire, mais il doit être suffisamment long pour permettre la copie ou le déplacement de fichiers si vous déplacez vers un autre disque, partage, ordinateur, etc.

Et voici le script réel :

@echo off
@setlocal enableextensions enabledelayedexpansion

rem *******************************
rem **** Variables personnalisables ***
rem *******************************

rem ****** Doit remplir dans l'ordre ; ne pas sauter un numéro ******
rem ****** Chaque serveur défini doit aussi avoir un monitorpath#= et minQueue#= défini ci-dessous ******
set server1=10.1.10.141
set server2=10.1.10.108
set server3=
set server4=

rem ****** Fileserver peut être le même que la machine MCEBuddy. Il est seulement utilisé par défaut pour définir monitorpath ci-dessous. ******
rem ****** Si vous insérez des chemins absolus dans monitorpath, fileserver peut être ignoré ou laissé indéfini. ******

set fileserver=10.1.10.108

rem ****** Définissez comme vous voulez. Ceux-ci doivent être définis comme accessibles depuis le serveur 1, puisque c'est là que le script s'exécute.
rem ****** Configurez les autres serveurs pour surveiller chacun un de ces emplacements correspondant au serveur#.
rem ****** N'utilisez pas de barres obliques à la fin.
rem ****** J'ai mis les miens dans le dossier original et configuré le serveur principal pour ignorer « distributed\server* » et ses sous-dossiers, mais vous pouvez les définir chacun indépendamment, tant que chaque serveur peut accéder à son dossier.

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

rem ****** Définissez à 0 pour sauter ce serveur ; définissez à 1 pour utiliser seulement à l'arrêt ; ou définissez n'importe quel autre nombre.
rem ****** Le serveur 1 traitera tout jusqu'à ce que ce nombre de conversions simultanées soit atteint, puis commencera à passer au serveur suivant jusqu'à ce qu'il atteigne aussi ce nombre, et ainsi de suite.
rem ****** Le débordement reste avec le serveur 1 jusqu'à ce qu'un autre serveur tombe en dessous de son seuil.

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

rem *******************************
rem ******* Variables fixes ; généralement pas besoin d'ajustement *******
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 ****** Rechercher la taille de la file d'attente de chaque serveur ******
: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 ****** Vérifier si chaque serveur est « started » et comparer la longueur de la file d'attente au seuil défini. ******
rem ****** Si le serveur secondaire est « stopped », « paused » ou « scheduled », il sera ignoré. ******
rem ****** Transférer le fichier au premier serveur où les conditions sont remplies et déclencher un nouveau scan de ce serveur. ******
: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 *******pourrait aussi dire quelque chose comme : 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

Mis à jour le 19/03/2019 pour corriger certains bogues dans le script.