Author Topic: Codebeispiele mAirListScript  (Read 29695 times)

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Codebeispiele mAirListScript
« on: August 14, 2006, 20:01:22 »
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_%28Programmiersprache%29). 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)

Code: [Select]

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:

Code: [Select]

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!

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Beispiel:
« Reply #1 on: August 14, 2006, 20:05:17 »
Länge der Playlist herausfinden und alle Titel auflisten:

Code: [Select]

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.

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Codebeispiele mAirListScript
« Reply #2 on: August 14, 2006, 20:06:17 »
Titel fies verändern:

Code: [Select]

var i: integer;

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

isanhagen

  • Regular
  • *
  • Posts: 483
  • Okerwelle.de
    • View Profile
    • Okerwelle 104,6 - Radio für die Region
Leider nur im internationalen Forum :(
« Reply #3 on: September 10, 2006, 13:12:10 »
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 :)
~~~ Ich bin die Ruhe vor dem Sturm ~~~*

djmanu

  • Regular
  • *
  • Posts: 246
    • ICQ Messenger - 175428727
    • MSN Messenger - djmanu@icb.at
    • View Profile
    • SunRise FM
Codebeispiele mAirListScript
« Reply #4 on: October 30, 2006, 18:54:50 »
Code: [Select]

  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;


tja das check i ja fast...
wie kann ich aber die folgenden 3 Titel darstellen?
und wie kann ich die "remaining time" anzeigen
SunRiseFM.at - Your Dance Radio
MusicBase.FM - Don't stop the Base

djmanu

  • Regular
  • *
  • Posts: 246
    • ICQ Messenger - 175428727
    • MSN Messenger - djmanu@icb.at
    • View Profile
    • SunRise FM
Codebeispiele mAirListScript
« Reply #5 on: November 15, 2006, 17:07:32 »
kommt da noch ne antwort?  :D
SunRiseFM.at - Your Dance Radio
MusicBase.FM - Don't stop the Base

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Codebeispiele mAirListScript
« Reply #6 on: November 15, 2006, 17:09:14 »
Von mir im Augenblick nicht, denn das ist ziemlich kompliziert, was du da vorhast, und ich bin gerade mit anderen Dingen beschäftigt ...

djmanu

  • Regular
  • *
  • Posts: 246
    • ICQ Messenger - 175428727
    • MSN Messenger - djmanu@icb.at
    • View Profile
    • SunRise FM
Codebeispiele mAirListScript
« Reply #7 on: November 16, 2006, 09:32:48 »
ok
diese antwort reicht mir auch... bleibt ja nix anderes über :wink:
SunRiseFM.at - Your Dance Radio
MusicBase.FM - Don't stop the Base

djmanu

  • Regular
  • *
  • Posts: 246
    • ICQ Messenger - 175428727
    • MSN Messenger - djmanu@icb.at
    • View Profile
    • SunRise FM
Codebeispiele mAirListScript
« Reply #8 on: November 27, 2006, 11:55:14 »
Code: [Select]
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.


haha ich habs gschafft!!!
ganz easyyy
SunRiseFM.at - Your Dance Radio
MusicBase.FM - Don't stop the Base

Klappspaten

  • Regular
  • *
  • Posts: 233
    • View Profile
Codebeispiele mAirListScript
« Reply #9 on: November 27, 2006, 19:38:48 »
Was bewirkt das jetzt nochmal genau? :)

Gruß,
David

djmanu

  • Regular
  • *
  • Posts: 246
    • ICQ Messenger - 175428727
    • MSN Messenger - djmanu@icb.at
    • View Profile
    • SunRise FM
Codebeispiele mAirListScript
« Reply #10 on: November 28, 2006, 09:37:12 »
zeigt die nächsten 3 titel auf einer website an
SunRiseFM.at - Your Dance Radio
MusicBase.FM - Don't stop the Base

flashlighter

  • Regular
  • *
  • Posts: 643
    • ICQ Messenger - 289125779
    • View Profile
    • http://www.flashlighter.de
    • Email
Codebeispiele mAirListScript
« Reply #11 on: December 03, 2006, 16:42:33 »
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: [Select]

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.

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Codebeispiele mAirListScript
« Reply #12 on: December 03, 2006, 17:32:22 »
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

flashlighter

  • Regular
  • *
  • Posts: 643
    • ICQ Messenger - 289125779
    • View Profile
    • http://www.flashlighter.de
    • Email
Codebeispiele mAirListScript
« Reply #13 on: December 03, 2006, 17:39:40 »
danke für den Tipp *jetzt_schlauer_bin* (bin eher der c- und javaler;-))

jetzt kann ich den schmarrn mit dem Int raushauen:
Code: [Select]

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.


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


-->glaub ich dir... nich schlimm

grüße, michi

Torben

  • Administrator
  • Doktor mAirList
  • *****
  • Posts: 11104
    • View Profile
Codebeispiele mAirListScript
« Reply #14 on: December 03, 2006, 17:52:19 »
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.