Komplexes Script ...es geht voran ... eine Sache fehlt mir noch

Servus und Hallo,

Folgende Idee möchte ich gern umsetzen. Allerdings hab ich im Moment nicht den Überblick ob das überhaupt funktioneiren würde bzw. mAirlist das überhaupt kann.

Ausgangslage:
Server, auf dem Mairlist als Automation läuft mit automatischem Schedule, inkl. Nachrichten usw. Auspielen wird mAirlist über 4 Shoutcast Server in 4 Qualitäten.
Zudem laufen auf dem Server weiter Shoutcast Instanzen, im folgenden als SC_in1, SC_in2 und SC_in3 bezeichnet, die Streams von außen entgegen nehmen.

Ziel:
mAirlist soll automatisch die Playlist spielen, sobald auf SC_in1/2/3 ein Stream kommt soll dieser on Top in der Playlist landen und sofort abgespielt werden. Solange der Stream läuft sollen Elemente, die per Fixzeiten in der Playlist sind, ignoriert werden. Dabei sollen die Streams priorisiert sein, heißt SC_in1 und SC_in2 gleiche Prio und “überschreiben” SC_in3 bzw sich gegenseitig sobald einer online geht. SC_in3 wird nur geladen wenn SC_in1 und SC_in2 offline sind. Die Abfrage ob einer der Streams online ist soll kontinuierlich erfolgen. Eine Idee wäre die /7.html des SC Servers auszulesen und zu beobachten ob einer der Streams online ist. Sobald alle drei offline sind soll mAirlist wieder in der Playlist weitermachen wobei automatisch ab den nächsten Nachrichten die auf der 0 fixtimed sind die korrekte Stundenvorlage für die nächste Stunde geholt werden soll.

Die grundsätzliche Frage die sich hier stellt kann mAirlist in einem Script per Dauerschleife html Seiten auswerten und lässt sich oben geplantes Scenario realisieren. Kann sein das ich auch nur auf dem Schlauch stehe heißt ich bräuchte mal nen schubs in die richtige Richtung

Gruß René

So hab mal bissel gebastelt und es mittlerweile geschafft das mAirlist erkennt ob der ankommende stream onlinne ist oder nicht. Die Instanz des Streamservers läuft auf dem selben Rechner. Die Umschaltung auf assist + assist next lässt sich damit auch steuern. auch das rückschalten auf Automation würde funktionieren.

Nur wie lade ich den Stream in die Playlist, so daß der als nächstes Element dran ist. Heißt Ablauf soll dann so erfolgen

  1. Stream geht online
  2. wird von mAirlist erkannt (funktioniert)
  3. Stream wird so in die playlist geladen das er als nächste dran ist (geht noch nicht)
  4. Funktion AUTOMATION 1 OFF + PLAYLIST 1 NEXT wird ausgeführt (funktioniert)
  5. Stream geht offline
  6. wird von mAirlist erkannt (funktionbiert)
  7. Funktion AUTOMATION 1 ON + PLAYLIST 1 NEXT wird ausgeführt (funktioniert)

hier im Forum habe ich die Aussage gefunden, dass das Stream laden in die Playlist nicht direkt funktioniert. Das bezog sich auf die Version 2.x. In V4.4.3 kann man ja über “Einfügen -> Stream unendlich” einen Stream direkt über die markierte Position einfügen. In der mAirlistScript.chm finde ich nur die Funktion Insert File und Insert Directory. Leider hat die Suche hier im Forum auch nichts ergeben.

Über einen Scriptansatz würde ich mich freuen

Gruß René

Hi Rene’

interessiert mich sehr, was Du da vorhast. Habe mal nachgeschaut unter

Systemsteuerung > Aktionen > Hinzufügen > Stream > Stream abspielen

Ich weiß nicht ob das das ist was Du suchst. Aber 'n Hinweis war’s mir wert.

Hallo Bernie,

erst mal Danke für den Hinweis, schaun wir mal ob mach das von einem Script aus steuern kann.

Hier mal für dein Interesse worauf das ganze hinaus laufen soll.
Wir sind ein Internetradio deren Moderatoren wie üblich weit verstreut sind. mAirlist soll auf dem Streamserver als “AutoDJ” laufen, wobei ich bei mAirlist eher wirklich eher an Sendeautomation denke weil mAirlist halt wesentlich bessere Playlisten bauen kann mit dem internen Scheduler. Das klingt eher nach Radio als z.b. der sc_trans im shuffle mode. Nun kommt das script ins Spiel. Wenn sich ein Moderator auf den Stream schalten will soll mAirlist die Automation stoppen und den Stream abspielen. Dabei wird es mehrere In Ports geben, 2 für normale Moderatoren mit gleicher Priorität an denen sich die Moderatoren auf dem Stream abwechseln. Ein weiterer soll für Liveübertragungen von Veranstaltungen genutzt werden. Dieser hat dann niedrigere Prio somit kann der live Feed schon laufen während eine normale moderierte Sendung läuft und der Moderator heitzt die Hörer vor fürs Live Event und sagt am Schluß und nun gehts Live nach XYZ in die Disko ABC. Wenn der Moderator dann seinen Stream abschaltet soll der Live Feed geladen und abgespielt werden. Zu guter letzt wenn alle ankommenden Stream offline sind bzw der letzte Offline geht soll mAirlist wieder auf Automation gehen und und somit das automatische Programm fortsetzen mit der Playlist die dann dran ist.
Für genau diese Funktionen gibt es ein Programm namens StreamControl von einem Dirk H. welches allerdings nur in Verbindung mit Winamp arbeitet. Und genau dieses Konstruckt ist recht buggy, damit gabs schon sooft Ärger das ich zum einen sage StreamControl ist das Geld ned wert was dafür verlangt wird und zum anderen nun dabei bin diese Gebilde durch mAirlist zu ersetzen.

Ich hoffe das war/ist verständlich :slight_smile:

Gruß René

p.s. ich bin mittlerweile an einem Würgaround an dem mAirlist nur zum Teil beteiligt ist. Wenn es mir gelingt das reine Streamhandling dem sc_trans zu überlassen, sofern das sauber spielt, habe ich das Script für mAirlist quasi fertig. Ich habe es bereits geschafft mit mAirlist zu erkennen ob ein Shoutcast Server eine Source hat oder nicht um damit die Automation zu stoppen und bei disconnect wieder zu starten. Die Stundenvorlagen fürs Clockwheel, Event gesteuert sind ebenfalls fertig bzw kein Problem. Beim Script muss ich irgendwie noch schaffen den Fehler abzufangen der entsteht wenn mAirlist gestartet wird und die streamserver noch nicht laufen. Dann schlägt nämlich HTTPget fehl und das script wird nicht geladen.

Also zu einfügen eines Playlistenelementes finden sich reichlich Script Beispiele hier im Forum.
https://www.mairlist.com/forum/index.php/topic,7219.msg50078.html#msg50078

Dort wird zwar nur eine Datei eingefügt, aber das sollte mit Streams ähnlich laufen.
Hast Du eigentlich schon die Scripting Help?
http://download.mairlist.com/mAirList/v4.3/scriptinghelp/
Sollte auf die 4.4 auch passen.

Hast Du eigentlich schon die Scripting Help? http://download.mairlist.com/mAirList/v4.3/scriptinghelp/ Sollte auf die 4.4 auch passen.

ja habe ich, allerdings ist dort nur etwas drin um eine File einzufügen. Soweit ich das verstehe geht das nicht für einen Stream. Was das Programmieren angeht komme ich so langsam wieder in Schwung, ist schon über 20 Jahre her das ich das gelernt habe und Pascal Script ist doch schon vom Befehlssatz etwas eingeschränkt wenn man es mit Turbo Pascal vergleicht. im Moment denke ich das ich das über die Action lösen werde. Ich nutze ja schon in meinem Script EXECUTE COMMAND für das steuern der Playlist. Habs halt nur noch nicht getestet, das wird wohl erst zum Wochenende etwas werden

Gruß René

Es gibt in den Commands, die man z.B. per Event auslösen kann, die Möglichkeit einen Stream einzufügen. Daher müsste eigentlich auch eine Möglichkeit bestehen, dass über ein Script zu lösen.
Leider gibt es das mairlist Wiki nicht mehr, da standen eine große Menge Script schnipsel drin.

Am einfachsten ist es, man speichert das fertig konfigurierte Stream-Element in einer Playlist (.mlp-Format!) und fügt diese dann ein:

var
  pl: IPlaylist;

begin
  pl := Factory.CreatePlaylist;
  pl.LoadFromFile('c:\irgendwo\stream.mlp');
  CurrentPlaylist.InsertList(CurrentPlaylist.GetNextIndex, pl, true);
end.

hmmm das mit der playlist muss ich mir mal ansehen, wie gesagt ich taste mich da grade bissel an die Befehle ran die mAirlist bieteet und habe auch schon die ersten Erfolge. Erste erfolgreiche Lösung für einen uplink Stream (sollen am Ende 3 sein von denen 2 die gleiche Prio haben und einer niedriger). “STREAM 1” ist die Fernsteuer ID eine erweiterten Buttons der als Action Stream abspielen bei ON Event drin hat. Hat auch einen Vorteil, wenn jemand per VNC auf den Server geht sieht er sofort über welchen Stream etwas reinkommt.
Das killen und restarten des Streamservers ist nur dafür da den Puffer zu leeren. Ohne diese Aktion kommt bei jedes mal beim neu connect noch ein Rest des vorher abgeschalteten Streams
Hier mal mein Script, gerne auch zur Weiterverwendung aber auch zu Verbesserung, im Moment sehe ich noch eine mögliche Gefahrenquelle für die reibungslose Funktion. Und zwar meine ich damit ein Worst Case Scenario folgender Art. Ein Titel ist gerade am Ende und löst den nächsten aus und das könnte bereits der geladene Stream sein, dann würde der NEXT Befehl im Script den Stream wieder abschalten. In diesem Scenario ist Gefahr auch real da letztendlich bei Automation Nachrichten mit Fixzeit eingebunden werden und das trifft genau in dem zeitraum ein in dem auch die Sendungen beginnen. Dafür muss ich mir noch eine Routine basteln die Prüft ob der Stream auch wirklich läuft und den ggf wieder nachlädt falls nicht. Allerdings muss das intelligent prüfen damit bei direkter Übergabe an einen anderen Modi auf dem zweiten Uplink kein Ping Pong der Streams passiert. Hatte auch schon den Gedanken den Stream in einen separaten Player zu laden um den vom Playlisthandlng abzukoppeln. Am Ende soll mal eine wirklich vernünftige Lösung für ein Webradio entstehen um die Hörer von den Shuffle-Dudel-Dödel Playlisten zu befreien die von SHOUTcast & Co verwendet werden

[code]var
SERVA: String;

procedure OnLoad;

begin
EnableTimer(100);
SERVA := ‘0’;
end;

procedure OnTimer;
var
SC1: TStringList;
begin
SC1 := TStringList.Create;
try
SC1.CommaText := HTTPGet(‘http://localhost:7100/7.html’);
if (SC1[3] = ‘1’) AND (SERVA = ‘0’) then begin
SERVA := ‘1’;
ExecuteCommand(‘STREAM1 ON’);
Sleep(1000);
ExecuteCommand(‘PLAYLIST 1 NEXT’);
Sleep(500);
ExecuteCommand(‘AUTOMATION 1 OFF’);
end
else if (SC1[3] = ‘0’) AND (SERVA = ‘1’) then begin
SERVA := ‘0’;
ExecuteCommand(‘STREAM1 OFF’);
ExecuteCommand(‘PLAYLIST 1 NEXT’);
ExecuteCommand(‘AUTOMATION 1 ON’);
ShellExecute(‘c:\windows\system32\taskkill’,’/F /IM sc_serv71.exe’);
Sleep(1000);
ShellExecute(‘c:\scserv\sc_serv71.exe’,‘c:\scserv\sc_serv71.ini’);
end;
except
begin
SystemLog(‘Shoutcast Server Offline’);
end;
finally
SC1.FREE;
end;
end;
begin
end.[/code]

Der Sleep vor NEXT sorgt dafür das zum einen auch wirklich der Stream in der Playlist steht bevor NEXT ausgelöst wird, der Sleep vor Automation OFF dafür das der Stream bereits in Player läuft bevor mAirlist auf Assist geht um zu verhindern das ein Playlistelement vor dem Stream im Player landet. Die Umschaltung auf Assist ist nur um die Zeitgesteuerte Elemente wie ANchrichten und Jingles zu unterbinden.

Ich versuche das mit Liquidsoap zu lösen, bin da aber auch noch nicht wirklich weit gekommen.
Liquidsoap nimmt die Streams entgegenen und agiert als quasi eigenständiger Stream server mit 3 Mounts.
Unterste Prio, bekommt die Autorotation, die Moderatoren Mounts jeweils höhere, (gleiche Prio geht nicht).

Ausgangsseitig sollen dann 3 Icecast Mounts und ein Shoutcast 1.9 gefüttert werden. Wobei einer der Icecast Mounts noch eine Transcodierung benötigt, die auch Liquidsoap übernehmen soll.

Schöner Nebeneffekt, sowohl zwischen den Studios, als auch zur oder von der Autorotation zum Studio kann jeweils eine Blende gefahren werden.
Geht alles super, nur die Weiterleitung der Titelinformationen bekomme ich nicht hin.

@ shorty bei uns läuft da noch der sc_trans dazwischen, glücklicherweise habe ich noch einen mp3 unlock code wobei der eigentlich wenn das mit mairlist klappt nur noch als backup gebraucht wird falls mairlist mal abschmiert und zum encodieren eines aac streams.

offtopic
Heute ist es mir gar gelungen dem Interimsserver der nur mit sc_trans läuft Benehmen bei zubringen. Bisher war da das Problem das der während einer höher priorisierten paylsit oder livestreams Nachrichten und und Jingles “gesammelt” hat und wenn dann die Standard Playlist wieder anlief erstmal 10 Jingles und 2 - 3 mal die Nachrichten gespielt hat. Wenn ich das Log ansehe scheints jetzt zu klappen richtig weiß ich es erst wenn ein Modi online war und nach 2 Stunden wieder runter geht. Wenn dann nur 1x News laufen hab ich gewonnen :slight_smile:
/offtopic

Gruß René

Sodale eine Frage hätte ich noch.

Ich bin gerada dabei das Script so zu ändern das ein einzelner Player eine 2. Playlist benutzt über welche die Streams geladen werden. Das ganze lässt sich ja wie schon mal oben im Script geschen per erweitertem Button realisieren. Wenn ich jedoch bisher das hier im Forum zu scripten geschriebene richtig interpretiere steht hinter jedem Button, Befehl oder was auch immer ein entsprechender Scripbefehl.

Ich suche hier den Scriptbefehl der hinter dem Erweiterten Button mit der Action “Play Stream” bzw hinter der 'Action “Play Stream” steckt. Wenn ich das mit dem Button löse macht mAirlist ja genau was ich will, den Stream als nächstes zu spielendes Element in die Playlist zu laden. Beim Button kann man auch sagen in welche Playlist. Ich würde gern diese Funktion genauso nutzen nur ohne einen Button auf dem Bildschirm zu haben. Wenn das tatsächlich nur über den Button lösbar ist kommt hier die nächste Frage. Kann ich einen Button so auf dem Bildschirm darstellen das er sichtbar ist , den Statuswechsel anzeigt aber nur auf den Fernsteuerbefehl reagiert und nicht auf den Mausklick?

Gruß René