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? 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.
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
[code]
if (n.GetNotificationType = ntPlayerStart) then begin
// interface #1 contains a reference to the playlist item
pi := IPlaylistItem(n.GetInterface(1));
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));
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));
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));
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.
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.