Codebeispiele mAirListScript

Hallo.

In diesem Thread sollen Codebeispiele für mAirList-Script gesammelt werden, bis es eine Dokumentation gibt. mAirListScript wurde mit den Pascal Script Komponenten von RemObjects (www.remobjects.com) realisiert. Die Syntax ist also die von Pascal: (siehe http://de.wikipedia.org/wiki/Pascal_(Programmiersprache)). Dabei stehen für die Manipulation der Playlist usw. objektorientierte Strukturen zur Verfügung, realisiert durch Delphi-ähnliche Interfaces. Derer gibt es derzeit zwei. Über das eine lässt sich die Playlist selbst manipulieren, über das andere die einzelnen Playlist-Einträge.

(Stand: mAirList 1.5.15)

type
  IPlaylistItem = interface 
    function GetArtist: string;
    procedure SetArtist(iValue: string);
    function GetTitle: string;
    procedure SetTitle(iValue: string);
    function GetComment: string;
    procedure SetComment(iValue: string);
    function GetCommentExpanded: boolean;
    procedure SetCommentExpanded(iValue: boolean);
    function GetDuration: int64;
    procedure SetDuration(iValue: int64);
    function GetEffectiveEnd: int64;
    function GetEffectiveDuration: int64;
    function GetEndType: string;
    procedure SetEndType(iValue: string);
    function GetColor: TColor;
    procedure SetColor(iValue: TColor);
    function GetDisabled: boolean;
    procedure SetDisabled(iValue: boolean);
    function GetDatabaseID: integer;
    procedure SetDatabaseID(iValue: integer);
    function GetStartTime: TDateTime;
    procedure SetStartTime(iValue: TDateTime);
    function GetStartTimeType: TStartTimeType;
    procedure SetStartTimeType(iValue: TStartTimeType);
    function GetNoBacktiming: boolean;
    procedure SetNoBacktiming(iValue: boolean);
    function GetLastPlayed: TDateTime;
    procedure SetLastPlayed(iValue: TDateTime);
    function GetFixTime: TDateTime;
    procedure SetFixTime(iValue: TDateTime);
    function GetEditableProperties: TStrings;
    procedure SetEditableProperties(iValue: TStrings);
    function GetProperty(iName: string): string;
    procedure SetProperty(iName: string; iValue: string);
    function GetInfo: TStringList;
    function GetXMLNodeName: string;
    function GetOptions: TPlaylistItemOptions;
    procedure LoadTags;
    procedure SaveTags;
    procedure BeginUpdate;
    procedure EndUpdate;
    function GetXML: string;
  end;

  IPlaylist = interface
    function GetCount: integer;
    function GetItem(iIndex: integer): IPlaylistItem;
    function GetAutomation: boolean;
    procedure SetAutomation(iValue: boolean);
    procedure AutomationPlay;
    procedure AutomationStop;
    procedure AutomationNext;

    function GetPlayerCount: integer;
    function GetPlayerOfItem(iItem: IPlaylistItem): integer;

    function ErrorCheck: boolean;
  end;

Die Bedeutung der Funktionen ist weitesgehend selbsterklärend. Außerdem gibt es noch die folgenden globalen Funktionen:

procedure SystemLog(iMessage: string);
procedure RunScript(iFilename: string);
function Playlist(iIndex: integer): IPlaylist;
function CurrentPlaylist: IPlaylist;
function GetPlaylistCount: integer;
function SelectPlaylist(iIndex: integer): boolean;

Über CurrentPlaylist lässt sich auf die “aktive” Playlist zugreifen, die man mit SelectPlaylist auswählen kann. Oder man wählt direkt mit Playlist() eine der Playlists aus. Die meisten von euch haben aber vermutlich eh nur eine Playlist, oder? :slight_smile: SystemLog schreibt einen Eintrag in die Log-Liste ganz unten im Hauptfenster. RunScript führt ein weiteres Script aus.

Torben

PS: Ihr dürft natürlich auch gerne eure selbstgeschriebenen Scripte hier reinstellen!

Länge der Playlist herausfinden und alle Titel auflisten:

var i: integer;

begin
  SystemLog('Current Playlist has ' + IntToStr(CurrentPlaylist.GetCount) + ' items');
  for i := 0 to CurrentPlaylist.GetCount - 1 do
    SystemLog('Item ' + IntToStr(i) + ': ' + CurrentPlaylist.GetItem(i).GetTitle);
end.

Titel fies verändern:

var i: integer;

begin
  for i := 0 to CurrentPlaylist.GetCount - 1 do
    CurrentPlaylist.GetItem(i).SetTitle(IntToStr(i));
end.

Ich finde es schade, dass es im deutschen Forum kaum Code-Beispiele aus der Praxis gibt. Nicht jeder ist im Englischen so bewandert. Schön wäre es, wenn ihr euch mal die Mühe machen würdet und eure "Sripts hier posten würdet :slight_smile:

[code]
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));

sl := TStringList.Create;
sl.Add('<html>');
sl.Add('<head><title>Now Playing</title></head>');
sl.Add('<body><font face="Verdana" size="1"><b><u>ON AIR:</u></b>');
sl.Add('<br><b>' + pi.GetArtist + '</b><br/>' + pi.GetTitle + '</p></font>');
sl.Add('</body>');
sl.Add('</html>');
sl.SaveToFile('c:\www\radio\play.html');
sl.Free

end;[/code]

tja das check i ja fast…
wie kann ich aber die folgenden 3 Titel darstellen?
und wie kann ich die “remaining time” anzeigen

kommt da noch ne antwort? :smiley:

Von mir im Augenblick nicht, denn das ist ziemlich kompliziert, was du da vorhast, und ich bin gerade mit anderen Dingen beschäftigt …

ok
diese antwort reicht mir auch… bleibt ja nix anderes über :wink:

[code]var n: INotification;
pi: IPlaylistItem;
sl: TStringList;
pi2: IPlaylistItem;
pi3: IPlaylistItem;

begin
// fetch notification data
n := GetNotification;

if (n.GetNotificationType = ntMask) then
// we want to be notified when players start
SetNotificationTypes([ntPlayerStart])
else
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));

pi2 := CurrentPlaylist.GetItem(2);
pi3 := CurrentPlaylist.GetItem(3);

sl := TStringList.Create;
sl.Add('<html>');
sl.Add('<head><title>Now Playing</title></head>');
sl.Add('<body>');
sl.Add('<p>Artist: ' + pi.GetArtist + '<br/>Title: ' + pi.GetTitle + '</p>');
sl.Add('<p>Artist2: ' + pi2.GetArtist + '<br/>Title2: ' + pi2.GetTitle + '</p>');
sl.Add('<p>Artist3: ' + pi3.GetArtist + '<br/>Title3: ' + pi3.GetTitle + '</p>');
sl.Add('</body>');
sl.Add('</html>');
sl.SaveToFile('C:\mAirList\play.html');
sl.Free;

end;
end.[/code]

haha ich habs gschafft!!!
ganz easyyy

Was bewirkt das jetzt nochmal genau? :slight_smile:

Gruß,
David

zeigt die nächsten 3 titel auf einer website an

meine beobachtungen sehen folgendermaßen aus:

das script schreibt an erster stelle immer den gerade gespielten track…
dann wirds tricky:

wenn die "Next"taste gedrückt wurde, dann stimmt das script.

wenn aber die tracks ganz normal gestartet werden, dann wird der 2. playlisteintrag übersprungen:

hier die verbesserung: (jetzt werden die meisten von euch lachkrämpfe bekommen, weil ich das mit ner int-variable zusammengeschustert habe, aber der normale operator “!=” funktioniert irgendwie nicht…und “else” wollte er auch ncht schlucken:-(

[code]
var
pi: IPlaylistItem;
sl: TStringList;
pi1: IPlaylistItem;
pi2: IPlaylistItem;
pi3: IPlaylistItem;
n: INotification;
l: Integer;
begin
// fetch notification data
n := GetNotification;
l:= 0;

if (n.GetNotificationType = ntMask) then
// we want to be notified when players start
SetNotificationTypes([ntPlayerStart])
else
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));

pi1 := CurrentPlaylist.GetItem(1);
pi2 := CurrentPlaylist.GetItem(2);
pi3 := CurrentPlaylist.GetItem(3);

sl := TStringList.Create;
sl.Add('<html>');
sl.Add('<head><title>Now Playing</title></head>');
sl.Add('<body>');
sl.Add('<p>Artist: ' + pi.GetArtist + ' --- Title: ' + pi.GetTitle + '</p>');
if pi.GetTitle=pi1.GetTitle then begin
  sl.Add('<p>Artist2: ' + pi2.GetArtist + ' --- Title2: ' + pi2.GetTitle + '</p>');
  sl.Add('<p>Artist3: ' + pi3.GetArtist + ' --- Title3: ' + pi3.GetTitle + '</p>');
  l:=1;
end;
if l=0 then begin
  sl.Add('<p>Artist2: ' + pi1.GetArtist + ' --- Title2: ' + pi1.GetTitle + '</p>');
  sl.Add('<p>Artist3: ' + pi2.GetArtist + ' --- Title3: ' + pi2.GetTitle + '</p>');   
end;
sl.Add('</body>');
sl.Add('</html>');
sl.SaveToFile('C:\Programme\xampp\htdocs\NowPlaying.html');
sl.Free;

end;
end.[/code]

Tipp: Was bei C “!=” heißt, heißt bei Pascal “<>”.

Ansonsten kann ich mir das gerade nicht im Detail angucken, sorry. Zuviel zu tun.

Torben

danke für den Tipp jetzt_schlauer_bin (bin eher der c- und javaler;-))

jetzt kann ich den schmarrn mit dem Int raushauen:

[code]
var
pi: IPlaylistItem;
sl: TStringList;
pi1: IPlaylistItem;
pi2: IPlaylistItem;
pi3: IPlaylistItem;
n: INotification;
begin
// fetch notification data
n := GetNotification;

if (n.GetNotificationType = ntMask) then
// we want to be notified when players start
SetNotificationTypes([ntPlayerStart])
else
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));

pi1 := CurrentPlaylist.GetItem(1);
pi2 := CurrentPlaylist.GetItem(2);
pi3 := CurrentPlaylist.GetItem(3);

sl := TStringList.Create;
sl.Add('<html>');
sl.Add('<head><title>Now Playing</title></head>');
sl.Add('<body>');
sl.Add('<p>Artist: ' + pi.GetArtist + ' --- Title: ' + pi.GetTitle + '</p>');
if pi.GetTitle=pi1.GetTitle then begin
  sl.Add('<p>Artist2: ' + pi2.GetArtist + ' --- Title2: ' + pi2.GetTitle + '</p>');
  sl.Add('<p>Artist3: ' + pi3.GetArtist + ' --- Title3: ' + pi3.GetTitle + '</p>');
end;
if pi.GetTitle<>pi1.GetTitle then begin
  sl.Add('<p>Artist2: ' + pi1.GetArtist + ' --- Title2: ' + pi1.GetTitle + '</p>');
  sl.Add('<p>Artist3: ' + pi2.GetArtist + ' --- Title3: ' + pi2.GetTitle + '</p>');   
end;
sl.Add('</body>');
sl.Add('</html>');
sl.SaveToFile('C:\Programme\xampp\htdocs\NowPlaying.html');
sl.Free;

end;
end.[/code]

Ansonsten kann ich mir das gerade nicht im Detail angucken, sorry. Zuviel zu tun.

–>glaub ich dir… nich schlimm

grüße, michi

Noch ein Tipp: Du fragst ja explizit GetItem(1), GetItem(2) und GetItem(3) ab. Dazu muss sichergestellt sein, dass die Playlist noch mindestens vier Items hat, sonst gibt’s ne Exception. Also lieber vorher mit GetCount überprüfen.

oh ja, werde ich noch machen dann…

wenn ich es dann tatsächlich einsetze, werde ich wahrscheinlich über ne Schleife die gesamte Playlist anzeigen lassen.

bin gerade ein bisschen am rumprobieren und mAirListScript vertrautmachen:-)

grüße, michi

ach genau…was mir noch einfällt:

kann ich irgendwie auch die Backtimingzeiten auslesen?

stelle mir das so vor:

Now Playing — einInterpret — einTrack
20:16:17 — einAnderernterpret — einAndererInterpret
20:20:14 — einAnderernterpret — einAndererInterpret

—>wird dann schön in ner Tabelle aufgelistet;-)

hab das chm schon durchforstet, aber nix passendes dazu gefunden

grüße, michi

Guck dir die Methoden GetStartTime und GetStartTimeType von IPlaylistItem an. Die sagen dir die Backtiming-Zeit, und ob es sich dabei um eine tatsächliche Zeit, eine Zeit berechnet relativ zum vorhergehenden Item, oder um eine eingestellte Fix-Zeit handelt.

Torben

danke… habe ich gemacht.

sorry, ich glaube ich nerve langsam,
aber ich hab schonwieder 2 fragen:

  1. wie kann ich das ansteuern?
    habe versucht:

var pi: IPlaylistItem; begin pi:=CurrentPlaylist.GetItem(2); pi.GetStartTime; end.
—>unknown identifier “GETSTARTTIME”

  1. Was ist TDateTime??? und wie kann ich es in String umformen, damit ich es ins file schreiben kann??

danke schon im vorraus

grüße, michi

Merkwürdig, eigentlich sieht der Code richtig aus. Muss ich mir in Ruhe anschauen.

Zum Umwandeln musst du später auf jeden Fall FormatDateTime verwenden: http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime

Torben