Codebeispiele mAirListScript

danke :slight_smile:

Guten Morgen zusammen,

ich bräucht ein wenig Hilfe

[code]procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem; Duration: int64; PlayerControl: IPlayerControl);
begin
ShellExecuteHidden(‘c:\radio-dir\weblog\upload.exe’, ‘’);
if
(PlaybackControl(0).GetPlayer(0).GetPosition(5000) or
(PlaybackControl(0).GetPlayer(1).GetPosition(5000)
then begin
HTTPGet(‘http://www.ryan-encore.de/showlog/update.php’);
end;
end;

begin
end.[/code]

und zwar möchte ich das

HTTPGet('http://www.ryan-encore.de/showlog/update.php');

erst nach einer Wartezeit von 3-5Sekunden nach PlayerStart ausgeführt bzw. abgerufen wird.
Habe auch schon Sleep(3000); versucht, aber dies wurde ignoriert (vermutlich ein denkfehler von mir)

mAirList 4.2 beta Build 1651

Grundsätzlich so:

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem; Duration: int64; PlayerControl: IPlayerControl);
begin
  ShellExecuteHidden('c:\radio-dir\weblog\upload.exe', '');
  Sleep(5000);
  HTTPGet('http://www.ryan-encore.de/showlog/update.php');
end;

begin
end.

Zu beachten ist, dass das ShellExecuteHidden das Programm im Hintergrund startet, das Script läuft also sofort weiter während der Upload noch läuft.

Du musst also entweder das Sleep entsprechend verlängern (wenn du abschätzen kannst, wie lange der Upload dauert). Oder aber Upload und HTTP-Aufruf zusammen in eine Batchdatei packen und diese mit cmd.exe starten:

ShellExecuteHidden('cmd.exe', 'c:\woauchimmer\upload.bat');

In der Batchdatei dann erst die upload.exe starten und danach den HTTP-Aufruf durchführen, z.B. mit cURL:

c:\radio-dir\weblog\upload.exe
c:\pfad\zu\curl.exe http://www.ryan-encore.de/showlog/update.php

cURL bekommst du z.B. hier: http://www.paehl.com/open_source/?CURL_7.28.0

Hab jetzt

[code]procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem; Duration: int64; PlayerControl: IPlayerControl);
begin
ShellExecute(‘C:\radio-dir\weblog\upload.exe’, ‘’);
Sleep(5000);
HTTPGet(‘http://www.ryan-encore.de/showlog/update.php’);
end;

begin
end.[/code]
nochmals ausgetestet. Aber nun gibt mir das Systemprotokoll einen Runtime error “List index out of bounds(4)”

mAirList 4.2 beta - Build 1652

Bugreport häng ich mal mit dran.


bugreport_201211051553.txt (60.1 KB)

Ein manuell über das Menü erzeugter Bugreport hilft hier nicht weiter. Deswegen sagt mAirList auch “Nutzen Sie diese Funktion nur, wenn Sie von Support dazu aufgefordert werden” :slight_smile:

Ich seh aber schon das Problem, glaube ich: Welche mAirList-Version ist das? Eine 4er, oder? Der OnPlayerStart-Prozedurkopf ist aber der alte von mAirList 3.x. Der sollte jetzt so aussehen:

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);

Sorry, das hab ich übersehen mit dem Bugreport.

EDIT:
Danke für die Hilfe, aber ich habs erstmal aufgegeben.

EDIT:
Ich kanns doch nicht lassen.

[code]procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);
begin
ShellExecute(‘cmd.exe’, ‘c:\radio-dir\weblog\dbupdate.bat’);
end;

begin
end.[/code]
So schauts nu aus. Jetzt wird ein cmd-fenster geöffnet wo mir der Pfad “C:\radio-dir\playlists\manuell>” angezeigt wird.
Ich versteh langsam die Welt nicht mehr.

Wenn ich die dbupdate.bat manuell ausführe, funkzt es problemlos.

Zumindestens gibt mAirList keine Fehlermeldung mehr im Systemprotokoll aus.

Habe dieses Script zum Veränderen von verschieden Dingen beim Encoder Connect:

procedure OnExecuteCommand(COMMAND: string);
begin
if Command = 'ENCODER CONNECT' then
begin
Execute Command('ON AIR');
Execute Command('ENCODER LINE ON');
end
else if Command = 'ENCODER DISCONNECT' then
begin
Execute Command('OFF AIR');
Execute Command('ENCODER LINE OFF');
end;
end;
begin
end.

Funktioniert leider aber nicht im Betrieb von mAirlist. Vielen Dank für eure Mithilfe.
lg Henrik

mal ne allgemeine Bemerkung…
Ich hab mich grad durch die 22 Seiten geackert auf der Suche nach was Brauchbarem. Was für ein Trip…
Und ich frag mich warum es kein Extra Unterforum SCRIPTE gibt wie im englischsprachigen Forum, wo jede Anfrage oder jedes Problem einen eigenen Thread bekommt.
Soweit ich weiß kann man in einem SMF Themen markieren, die zB. nutzbare Scripte enthalten.

Gibt es irgendwo ein Tut zum Scripts bauen oder zumindest eine Befehls-Library?

Habe ich letzte Woche auch schon gefragt (im englischen Forum) - Torben will welche für die aktuellen mAirlist Versionen zusammenstellen, für mAirlist 4.3 gibt es zumindest eine Schnittstellen-Liste: http://download.mairlist.com/mAirList/v4.3/scriptinghelp/

LG

McCavity

Mehr als eine “Liste” wird es für die neueren Versionen auch nicht geben.

Bitte daran denken: Die Script-Schnittstellen sind ein 1:1-Abbild der internen APIs, und die sind eben nicht so dokumentiert, wie man das bei einer “öffentlichen” API sonst tun würde.

Viele Dinge sind - dank aussagekräftiger Funktions- und Parameter-Namen - selbsterklärend. Beim Rest einfach fragen.

Für v5.0: http://download.mairlist.com/mAirList/v5.0/scriptinghelp/

Die wichtige(?) Frage vorweg: @Torben: wäre es nicht sinnvoll, auch im deutschen Teil des Forums einen “Scripts” Bereich anzulegen, analog dem englischen Teil des Forums? Dann könnte man diesen Teil aus dem “Allgemeinen Support Forum” ausgliedern…?

Nun noch auf deutsch, was ich schon im englischen Teil als eigenen Faden hinterlegt habe:

Hallo, alle,

wie Ihr vielleicht mitbekommen habt, habe ich in den letzten Tagen, seit ich meinen Behringer CMD MM-1 Controller gekauft habe, versucht, ein Script zu schreiben, um diesen Controller in mAirlist besser nutzen zu können. Heute (genauer gesagt: gestern Abend, Anm.d.A. ;-)) habe ich dabei eine erste Stufe erreicht: Das Script läßt sich jetzt in mAirlist als Benachrichtigungsscript einbinden, das beim Start selbsttätig die Playerstatus abfragt und demzufolge die Status der Schalter am Controller richtig setzt. Wer das Script nutzen oder anpassen möchte, tue sich keinen Zwang an. Ich habe das Script auf GitHub veröffentlicht: https://github.com/McCavity/Behringer_CMD_MM-1 - es steht unter Apache 2.0 Lizenz, es darf daher frei benutzt, verändert und weitergegeben werden - ich würde mich nur darüber freuen, wenn man mich als Autor oder Beitragender irgendwo erwähnt, wenn man es ganz oder teilweise weiterveröffentlicht.

Das Script ist an meine mAirlist Umgebung angepaßt und macht daher die folgenden Annahmen: es gibt zwei Playlisten, die erste hat zwei Player (1-1 und 1-2) und die zweite einen Player (2-1). Diese drei Player sind mit den ersten drei Fadern des MM-1 verknüpft: Kanal 1: 1-1, Kanal 2: 1-2, Kanal 3: 2-1. Ich verwende die “CUE” Schalter des MM-1 für START/PAUSE Befehle. Die zwei “Side buttons” (In DJ-Programmen üblicherweise dazu genutzt, den Player der linken oder rechten Seite des Cross Faders (welchen ich in mAirlist nicht nutze) zuzuweisen) oberhalb der “CUE” Schalter (mit den Beschriftungen “1” und “2”) nutze ich für PFL (Schalter 1) und Schalter 2 innerhalb des PFL Modes für End Monitor. Während ein Player läuft schalte ich die LED im CUE Schalter auf “blinkend”, gleiches gilt für den Schalter “2”, der anfängt zu blinken, sobald der zugehörige Player EOF erreicht.

Eines fehlt jedoch noch: Ich nutze ja den MM-1 auch für Voicetracking. Daher nutze ich im VT-Mode eine andere Belegung der Schalter. Dies bekomme ich im Script aber noch nicht mit, momentan funktioniert es nur im Assist- oder Automations-Modus.

@Torben: gibt es da eine Möglichkeit wie “onVoicetrack…” oder ähnlich, mit der ich herausfinden kann, wann mAirlist den Voicetrack Recorder / Editor öffnet, bzw. verläßt? F+r die Automation habe ich “OnAutomationOn” und “OnAutomationOff” gefunden, aber Voicetracking nichts vergleichbares…?

Als Referenz hier noch mein Teil der remote.ini, der die Zuweisungen für den MM-1 enthält:

[Remote2] Type=MIDI Enabled=on Device=1 Message0=0094307F Action0=NOVT PLAYER 1-1 START/PAUSE;VT PLAYER A START Message1=0094317F Action1=NOVT PLAYER 1-2 START/PAUSE; VT PLAYER B START Message2=0094127F Action2=NOVT PLAYLIST 1 EXTRAPFL ON/OFF; VT RECORD START Message3=0094207F Action3=VT RECORD STOP Message4=0094117F Action4=NOVT CARTWALL NEXT SET; VT SAVE Message5=0094107F Action5=NOVT CARTWALL PREVIOUS SET; VT RECORD CANCEL Message6=00B4B080 Action6=NOVT PLAYER 1-1 VOLUME $DATA2/100; VT PLAYER A VOLUME $DATA2/127 Message7=00B4B180 Action7=NOVT PLAYER 1-2 VOLUME $DATA2/100; VT PLAYER B VOLUME $DATA2/127 Message8=00B4B280 Action8=NOVT PLAYER 2-1 VOLUME $DATA2/100 Message9=0094327F Action9=PLAYER 2-1 START/PAUSE Message10=00B40341 Action10=PLAYLIST 1 CURSOR DOWN Message11=00B4033F Action11=PLAYLIST 1 CURSOR UP Message12=0094037F Action12=PLAYLIST 1 RECYCLE Message13=0094137F Action13=PLAYER 1-1 PFL ON/OFF Message14=0094147F Action14=PFL END MON Message15=0094177F Action15=PLAYER 1-2 PFL ON/OFF Message16=0094187F Action16=PFL END MON Message17=00941B7F Action17=PLAYER 2-1 PFL ON/OFF Message18=00941C7F Action18=PFL END MON

Wenn Ihr irgendwelche Vorschlähe habt, immer her damit - ich hoffe, daß das Script irgendjemandem nützen möge. Aber bevor Ihr auf mich einschlagt, denkt bitte daran: ich habe in den letzten 20 Jahren kein Pascal angefaßt. (Ich denke, die letzte Version, die ich in der Hand hatte, war Turbo Pascal 5.5 für MS-DOS ;-))

Deshalb ein kurzer Disclaimer: Ich stelle das Script so, wie es ist, zur Verfügung, ohne jegliche ausdrückliche oder implizierte Garantie oder eine Aussage über die Nutzbarkeit zu irgendeinem bestimmten Zwecke. Benutzung auf eigene Gefahr, ich übernehme keine Verantwortung für irgendwelche Schäden gleich welcher Art, die durch die Benutzung des Scriptes entstehen könnten.

Eines noch: ein dickes fettes Dankeschön an Torben für seine geduldige Unterstützung, an Thomas “Kloppi” Kloppholz für sein LC-1 Script, welches mich auf die Idee zu meinem eigenen Script brachte und mir als Ausgangspunkt diente (ich habe mir einigen Code von dort kopiert und ihn daher im Dateikopf erwähnt) und ebenso ein riesieges Dankeschön an alle anderen, die mit ihren Beiträgen hier im Forum mir halfen, eine ganze Reihe von Problemen, auf die ich während der Programmierung stieß, zu lösen, ohne extra nochmal nachfragen zu müssen :slight_smile:

LG,

McCavity

P.S.: Ich habe noch ein seltsames Verhalten, das möglicherweise mit dem Script / Controller zusammenhängt: dann und wann hängt ein gerade abgespielter track für eine Weile in einer sehr kurzen (<1 Sek.) Schleife, bis er dann nach einigen Sekunden weitermacht… ich untersuche das noch, Fakt ist aber, daß im Systemlog nichts auffälliges erscheint… Ich melde mich da nochmal, wenn ich einen Weg gefunden habe, das Problem zuverlässig nachzustellen.

Saubere Arbeit!

Ich war mal so frei, dir ein v5-Upgrade in deinen Account zu stellen, damit du das Script auch mit der neuen Version testen kannst. Viel Spaß damit :slight_smile:

Script-Benachrichtigungen OnVTOn/OnVTOff gibt es noch nicht, die kann ich aber recht leicht nachrüsten. Mache ich dann in v5.1 :wink:

Meinst du, dass sich ein eigener Script-Bereich im deutschen Forum lohnen würde? So groß ist das Aufkommen ja bislang nicht. Ich lasse mich aber gerne vom Gegenteil überzeugen.

Oh! Da danke ich doch mal sehr herzlich und werde es direkt mal testen - ich hoffe, ich komme gleich heute abend dazu :slight_smile:

Auf die VT-Benachrichtigungen warte ich dann erstmal und mache mir in der Zwischenzeit Gedanken, wie ich beim Wechsel zwischen den Modi am besten den “Alt-Status” sichere - oder ob ich eine Abfrage hinbekomme, die beim Wechsel des Modus die beteiligten Komponenten abfragt und daraufhin die LEDs entsprechend setzt. Das kann ich ja bei Assist / Auto ausprobieren, dann muß ich es auf VT nur noch anpassen.

Ob sich ein Script Bereich für das deutsche Forum lohnt - keine Ahnung… ich habe auch kein Problem damit, englisch zu schreiben, ich wollte nur höflich sein und meinen Landsleuten in Muttersprache schreiben. Aber wie gesagt: ich habe auch kein Problem damit, das ganze Debugging in Englisch zu machen und dann halt bei größeren Releases hier einen deutschen Artikel zu schreiben ^^

LG

McCavity

Ich fände es toll, wenn es einen Script-Thread im deutschen Teil des Forums gäbe.
Ich zum Beispiel habe zwar noch mein Schulenglisch einigermaßen drauf, aber wenn es dann um spezifische Dinge geht, tue ich mich als Script-Neuling schon sehr schwer.

So, ich habe dann mal ein eigenes Unterforum angelegt. Viel Spaß!

Super! Tolle Sache! Vielen Dank! :smiley: :smiley: :smiley:

Danke Torben!

Guten Abend die Herren,
ich habe ganz am Anfang ein Script endeckt, dass den aktuellen Titel + die nächsten 3 Titel in einer Html oder PHP datei ausgibt.

[code]
procedure OnPlayerStart(PlayerControl: IPlayerControl; item: IPlaylistItem);
var sl: TStringList;
idx, i: Integer;
pi: IPlaylistItem;
begin
idx := CurrentPlaylist.IndexOf(item);
if idx = -1 then begin
SystemLog(‘Das war kein Element aus unserer Playlist …’);
exit;
end;

sl := TStringList.Create;
sl.Add(’<?php’);
i := 0;
while (idx < CurrentPlaylist.GetCount) and (i < 5) do begin
pi := CurrentPlaylist.GetItem(idx);
sl.Add(’$playa’ +(IntToStr(i)) + ‘="’ + pi.GetArtist + ‘";’);
sl.Add(’$playb’ +(IntToStr(i)) + ‘="’ + pi.GetTitle + ‘";’);
sl.Add(’$playc’ +(IntToStr(i)) + ‘="’ + FormatDateTime(‘hh:mm:ss’, (pi.GetDuration/10000000)/(246060)) + ‘";’);
sl.Add(’$playd’ +(IntToStr(i)) + ‘="’ + FormatDateTime(‘hh:mm:ss’, pi.GetStartTime)+ ‘";’);
i := i + 1;
idx := idx + 1;
end;
sl.Add(’?>’);
sl.SaveToFile(‘c:\play.txt’);
sl.Free;
end;

begin
end.[/code]

Das war noch zur Zeiten der 2er Version.
Ich nutzte die 4.4…ist es mit wenig Arbeit möglich dieses Script wieder anzupassen ?

Vielen Dank für die HIlfe.
Grüße Chris