Ik heb meerdere MCEBuddy-systemen geïnstalleerd (momenteel een hoofd-pc en een dvr-server, maar mogelijk meer als je het implementeert). Ik zou graag de optie zien om de werklast tussen systemen te delen, zodat systemen die momenteel niets in de wachtrij hebben, taken kunnen overnemen van een andere MCEBuddy-installatie.
Ik besef dat dit enig werk met zich meebrengt, maar als één installatie het bestand kopieert en overdraagt aan een andere installatie, zou dit een aantal permissieproblemen kunnen omzeilen. Dit zou MOETEN vereisen dat beide installaties zijn geautoriseerd om met elkaar samen te werken (misschien een koppeling – om bluetooth-termen te gebruiken), en het voltooide bestand zou terug moeten worden gezet naar het oorspronkelijke systeem en daar moeten worden geplaatst volgens de instellingen van dat systeem.
Het item zou uiteraard pas uit de wachtrij mogen verdwijnen nadat het is voltooid en teruggestuurd, en items die door een ander systeem worden verwerkt, zouden in de wachtrij gepauzeerd moeten worden en niet gestart mogen worden totdat X tijd is verstreken nadat het ondersteunende systeem de verbinding heeft verbroken, of totdat het handmatig wordt geactiveerd. Misschien zelfs een minimum wachtrijlengte voordat uitbesteding mogelijk wordt…
Gezien de aanpasbaarheid van het MCEBuddy-systeem, zou je echter een secundaire installatie het bestand kunnen laten verwerken volgens de instellingen van de oorspronkelijke installatie, op het systeem van de secundaire installatie. Ik zou aanbevelen dat hardware-instellingen systeemspecifiek blijven, aangezien niet alle systemen dezelfde specificaties hebben, maar het zou helpen als mijn hoofd-pc de mogelijkheid krijgt om een deel van de achterstand in de wachtrij van het dvr-systeem over te nemen.
Er zouden knoppen in het MCEBuddy-statuspaneel moeten zijn die “Wachtrijhulp toestaan” heten. Deze zouden alleen actief mogen zijn wanneer de eigen wachtrij van een systeem leeg is.
Kort gezegd zoek ik een manier om op een knop te drukken en een secundair systeem te laten meewerken aan de transcodering volgens de instructies van het oorspronkelijke systeem, zodat een zware dvr-belasting kan worden verlicht en beperkingen van zwakkere/oudere systemen kunnen worden gecompenseerd door extra systemen te laten assisteren.
Zoals het nu is, moeten de bestanden handmatig van het oorspronkelijke systeem worden verplaatst naar een tweede systeem om de lading over te nemen; dit is vrij inefficiënt en voegt extra risico’s op corruptie toe…
I wrote a batch script to offload to another server or servers. It’s not as smooth as an integrated solution would be, but I think it’s closer than some of the other proposed scripts. It functions using one computer with MCEBuddy as the queue manager which hands off to other servers as appropriate.
Essentially, it does the following:
- Check if server 1 has reached the threshold number of concurrent conversions you set to trigger offloading to another server.
- Check if server 2 is responding and welcoming conversions.
- Check if server 2 is at or below the threshold you set for how many conversions it should have queued up (and/or if its instance of MCEbuddy is idle, if that’s the condition you set).
- If so, move the file to the folder you defined for that server, and drop from server 1’s queue.
- If not, then proceed to server 3, server 4, etc. until it finds an available server.
- If it finishes the list and no other server will accept it, then server 1 processes the file as usual.
The following assumptions apply:
- you installed mcebuddy in the default directory on the main computer
- you use the default port to interact with the server
- you copy the code below and save it as a .bat file after customizing the initial few variables
- you add a “PreMetaCustomCommandPath=” entry to the conversion profile to point at this .bat file. (This runs on a per-profile basis.)
The following limitations apply (and so you have to configure these things yourself):
- tell server 2 what directory to monitor
- tell server 2 how to process the file or where to put it
- tell server 2 what to do with the original file when finished
- change a “paused”, “scheduled” or “stopped” mcebuddy server to “started”
- enable access for server 2 to access the file, or for server 1 to access the directory monitored by server 2
- retrieve unprocessed files if a secondary server is stopped after hand-off
- get around windows firewall if you haven’t already configured that
- leave a pretty log for MCEbuddy. MCEBuddy on server 1 sees each transferred file as a failed conversion.
Other notes:
- You can define as many servers as you want in the initial variables (set the server, path, and minimum queue length for each) and the rest of the code will handle it from there.
- It’s set to create a few text files in your root monitoring path. These are just because I’m not very good at batch scripting. If anyone can improve my code, please do! I can imagine a few things that could be more efficiently coded, but I’m not familiar enough (yet).
This is what I have in my \config\profiles.conf under the profile I’m using. The batch script relies on at least the first five CustomCommandParameters to be as I’ve entered here. The other three lines you can customize:
PreMetaCustomCommandPath=C:\Shared\MediaInfo\Copy.bat
PreMetaCustomCommandParameters="%sourcefile%" "%relativesourcepath%" "%originalfilename%" "%originalext%" "%originalfilepath%"
PreMetaCustomCommandHangPeriod=600
PreMetaCustomCommandCritical=false
The hang period is more than needed, but it needs to be long enough to allow copying or moving of files if moving to a different drive, share, computer, etc.
And here’s the actual script:
@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
Updated 3/19/2019 to fix some bugs in the script.