Mehrere MCEBuddy-Installationen erlauben die gemeinsame Nutzung der Conversion Que

Ich habe mehrere MCEBuddy-Installationen (derzeit ein Haupt-PC und ein DVR-Server, aber vielleicht noch mehr, falls du sie implementierst). Ich möchte eine Option sehen, die es ermöglicht, die Arbeitslast zwischen den Systemen zu teilen, sodass Systeme, die derzeit keine Aufträge in der Warteschlange haben, Aufträge von einer anderen MCEBuddy-Installation übernehmen können.
Ich erkenne an, dass dies einige Umstrukturierungen erfordern könnte, aber wenn eine Installation die Datei kopiert und an eine andere überträgt, sollte dies einige Berechtigungsprobleme umgehen. Dafür SOLLTEN beide Installationen autorisiert sein, miteinander zu arbeiten (vielleicht ein „Pairing“ – um Bluetooth-Sprache zu verwenden), und die fertige Datei müsste zurück an das ursprüngliche System übertragen und dort entsprechend der Konfiguration des Ursprungssystems platziert werden.
Offensichtlich sollte der Auftrag erst aus der Warteschlange entfernt werden, wenn er abgeschlossen und zurückgegeben wurde, und Aufträge, die von einem anderen System bearbeitet werden, sollten in der Warteschlange pausiert und nicht gestartet werden, bis X Zeit nach dem Trennen des unterstützenden Systems vergangen ist oder sie manuell aktiviert werden. Vielleicht sogar ein Minimum an Aufträgen in der Warteschlange, bevor das Auslagern freigeschaltet wird…
Dennoch, angesichts der Anpassbarkeit des MCEBuddy-Systems, denke ich, dass eine sekundäre Installation die Datei gemäß den Einstellungen des Ursprungssystems verarbeiten könnte, unter Verwendung der Hardware des sekundären Systems. Ich würde empfehlen, dass Hardware-Einstellungenspezifisch für jedes System sind, da nicht alle Systeme gleich spezifiziert sind, aber die Option für meinen Haupt-PC, einige Aufträge aus der Warteschlange des DVR-Systems zu übernehmen, würde helfen…
Auf dem MCEBuddy-Statuspanel müsste es Schaltflächen geben, die „Warteschlangen-Unterstützung erlauben“. Diese wären nur aktiv, wenn die eigene Warteschlange eines Systems leer ist.
Grundsätzlich suche ich nach einer Möglichkeit, auf einen Knopf zu klicken und ein sekundäres System die Transkodierung gemäß den Anweisungen des Ursprungssystems durchführen zu lassen, um eine hohe DVR-Last abzufedern und durch zusätzliche Systeme die Einschränkungen schwächerer/älterer Systeme auszugleichen.
Wie es derzeit ist, müssen die Dateien vom Ursprungssystem manuell auf ein zweites System verschoben werden, um die Last zu übernehmen – das ist ziemlich ineffizient und führt zu zusätzlichen Fehlerquellen…

Ich habe ein Batch-Skript geschrieben, um die Verarbeitung auf einen oder mehrere andere Server auszulagern. Es ist nicht so reibungslos wie eine integrierte Lösung, aber ich denke, es ist näher dran als einige der anderen vorgeschlagenen Skripte. Es funktioniert mit einem Computer mit MCEBuddy als Queue-Manager, der bei Bedarf an andere Server weitergibt.

Im Wesentlichen macht es Folgendes:

  • Prüfen, ob Server 1 die von dir festgelegte Grenze gleichzeitiger Konvertierungen erreicht hat, um eine Auslagerung an einen anderen Server auszulösen.
  • Prüfen, ob Server 2 antwortet und Konvertierungen annimmt.
  • Prüfen, ob Server 2 die von dir festgelegte Grenze für die Anzahl der in der Warteschlange stehenden Konvertierungen nicht überschreitet (und/oder ob seine MCEBuddy-Instanz im Leerlauf ist, falls du das so festgelegt hast).
  • Wenn ja, verschiebe die Datei in den für diesen Server definierten Ordner und entferne sie aus der Warteschlange von Server 1.
  • Wenn nicht, gehe zu Server 3, Server 4 us., bis ein verfügbarer Server gefunden wird.
  • Wenn die Liste durchlaufen ist und kein anderer Server die Datei annimmt, verarbeitet Server 1 die Datei wie gewohnt.

Folgende Annahmen gelten:

  • MCEBuddy wurde im Standardverzeichnis auf dem Hauptcomputer installiert
  • Der Standardport wird für die Kommunikation mit dem Server verwendet
  • Du kopierst den unten stehenden Code und speicherst ihn als .bat-Datei, nachdem du die ersten Variablen angepasst hast
  • Du fügst einen Eintrag „PreMetaCustomCommandPath=“ zum Konvertierungsprofil hinzu, der auf diese .bat-Datei zeigt. (Dies läuft pro Profil.)

Folgende Einschränkungen gelten (und müssen daher selbst konfiguriert werden):

  • Server 2 muss mitgeteilt werden, welches Verzeichnis er überwachen soll
  • Server 2 muss wissen, wie er die Datei verarbeitet oder wohin er sie verschiebt
  • Server 2 muss wissen, was mit der Originaldatei nach Fertigstellung geschehen soll
  • Einen „pausierten“, „geplanten“ oder „gestoppten“ MCEBuddy-Server auf „gestartet“ ändern
  • Server 2 muss Zugriff auf die Datei erhalten oder Server 1 muss Zugriff auf das von Server 2 überwachte Verzeichnis haben
  • Unverarbeitete Dateien abrufen, falls ein sekundärer Server nach der Weitergabe gestoppt wird
  • Windows-Firewall umgehen, falls noch nicht konfiguriert
  • Kein hübsches Log für MCEBuddy hinterlassen. MCEBuddy auf Server 1 sieht jede übertragene Datei als fehlgeschlagene Konvertierung.

Weitere Hinweise:

  • Du kannst beliebig viele Server in den Anfangsvariablen definieren (Server, Pfad und minimale Warteschlangenlänge pro Server festlegen), der Rest des Codes übernimmt den Rest.
  • Es erstellt einige Textdateien im überwachten Stammverzeichnis. Das liegt daran, dass ich nicht besonders gut in Batch-Scripting bin. Wenn jemand meinen Code verbessern kann – bitte! Ich kann mir einige effizientere Lösungen vorstellen, bin aber (noch) nicht vertraut genug.

Das steht bei mir in der \config\profiles.conf unter dem verwendeten Profil. Das Batch-Skript erwartet, dass die ersten fünf CustomCommandParameters so eingegeben sind. Die anderen drei Zeilen kannst du anpassen:

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

Die Hang-Periode ist länger als nötig, muss aber groß genug sein, um das Kopieren oder Verschieben von Dateien auf ein anderes Laufwerk, eine Freigabe, einen anderen Computer usw. zu ermöglichen.

Und hier das eigentliche Skript:

@echo off
@setlocal enableextensions enabledelayedexpansion

rem *******************************
rem **** Customizable variables ***
rem *******************************

rem ****** Must fill in order; don't skip a number ******
rem ****** Each defined server must also have a defined monitorpath#= and minQueue#= below
set server1=10.1.10.141
set server2=10.1.10.108
set server3=
set server4=

rem ****** Fileserver can be same as MCEBuddy machine. It's only used by default to define monitorpath below. 
rem ****** If you insert absolute paths in monitorpath, fileserver can be ignored or left undefined. ******

set fileserver=10.1.10.108

rem ****** Set to whatever you'd like. These should be defined as accessed from server 1, since that is where the script is running.
rem ****** Configure the other server(s) to each monitor one of these locations corresponding to the server#.
rem ****** Don't use slashes at the end.
rem ****** I put mine inside the original folder and set the primary server to ignore "distributed\server*" and its subfolders, but you can define them each independently, as long as each server can access its folder.

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

rem ****** Set to 0 to skip that server; set to 1 to use only when idle; or set any other number.
rem ****** Server 1 will process all until this number of concurrent conversions is met, then start passing to next server until it too reaches this number, and so on. 
rem ****** Overflow stays with server 1 until another server falls below its threshold.

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

rem *******************************
rem ******* Fixed variables; generally don't need adjusting *******
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 ****** Look up size of queue of each server ******
: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 ****** Check if each server is "started" and compare queue length to defined threshold. ******
rem ****** If secondary server is "stopped", "paused", or "scheduled" it will be skipped. ******
rem ****** Transfer file to first server where conditions are met and trigger rescan of that server. ******
: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 *******could also say something like: 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

Aktualisiert am 19.03.2019, um einige Fehler im Skript zu beheben.