Vollautomatische Ausspielung von Wiederholungen und Vorproduzierten Sendungen

ich bleibe hartnäckig und habe nochmal intensiv versucht zu verstehen was das Problem ist, nachdem ich intensiv im Forum Scriptbeschreibungen von @Tondose und ein paar Grundlagen zu Delphi gelesen habe. Ich habe erstmal geschaut ob der Loop überhaupt läuft und hab dazu den Code gekürzt:

var
  i: integer;
  Cue: string;
  Item: IPlaylistItem;

begin
  CurrentPlaylist.BeginUpdate;

  try

   For i:= 0 to CurrentPlaylist.GetCount -1 Do
//	Item:= CurrentPlaylist.GetItem(i);
	ShowMessage('i = '+IntToStr(i));
//	ShowMessage(IntToStr(i)+' '+ Item.GetArtist +'-' + Item.GetTitle);

  finally

  end;
CurrentPlaylist.EndUpdate;
end.

sicherlich sind da noch überflüssige Dinge drin, aber mir ging es ganz einfach darum zu sehen ob der Loop überhaupt was macht und so oft durchläuft, wie es Playlistitems gibt. Das macht er. Es erscheint eine Messagebox die nacheinander die Playlist-Position ausgibt, das allerdings rückwärts.
Wenn ich dann folgende Zeile wieder von der Auskommentierung befreie

Item:= CurrentPlaylist.GetItem(i);

dann ist der Loop kein Lopp mehr, denn es wird nur noch die Position des letzten Items ausgegeben.
Was läuft da falsch ? Das kann doch nix großes mehr sein um das Ding endlich zum laufen zu bringen …
Verzweifelte Grüße
Chris

Nur scheinbar. Du stapelst Messageboxen übereinander, die Du dann von oben weg-okayst. Benutze mal SystemLog() statt ShowMessage(), dann wird die Sache klarer.
 

Korrekt. Möchtest Du, daß sich die for … do-Schleife auf mehrere nachfolgende Zeilen bezieht, so mußt Du jene in begin und end; einschließen. Deine Zählschleife sollte (von etwas Ballast befreit) so aussehen:

var
  i: integer;
  Item: IPlaylistItem;

begin
  For i := 0 to CurrentPlaylist.GetCount - 1  Do
  begin
    Item:= CurrentPlaylist.GetItem(i);
    SystemLog('i = ' + IntToStr(i) + ': ' + Item.GetTitle);
  end;
end.

Das scheint auch beim Code von @shorty.xs der Fehler zu sein.

1 Like

@Tondose you made my day! Danke, das Script läuft und es lag daran. @shorty.xs schau mal, wir kommen vorwärts :snail: :rofl:

Mit den Messageboxen leuchtet mir jetzt ein, da hätte ich auch selbst drauf kommen müssen. Klappt wunderbar über Systemlog und durch IntToStr kann der index auch dort ausgegeben werden.

Jetzt steh ich noch auf dem Schlauch warum da nochmal ein begin und end; hinmusste. :thinking:
Gelesen hatte ich das Delphi Basics : Begin command aber entweder nicht verstanden oder unter …“da steht ja ein begin und end” … als erledigt abgehakt. Oder ist das erste begin überflüssig ?
Hier noch das finale Script

var
  i: integer;
  Cue: string;
  Item: IPlaylistItem;

begin
  CurrentPlaylist.BeginUpdate;
  try
    for i:= 0 to CurrentPlaylist.GetCount -1 do
      begin
	Item:= CurrentPlaylist.GetItem(i);
        if Item.GetItemType = pitShow then begin
        Factory.CreateMetadataHandler(Item.AsFile).ReadNativeTags;
        Cue:= IFilePlaylistItem(Item).GetFilename + '.cue';
	Item.GetCueData.LoadFromCueSheet(Cue);
	SystemLog(Cue);
	SystemLog('Track '+IntToStr(i)+'|Cuesheet loaded|'+Cue);
      end;     
     end;
  finally
  end;
  CurrentPlaylist.EndUpdate;
end.

Kommandos wie if … then oder for … do beziehen sich immer nur auf die folgende Zeile, bzw. sie sind eine Zeile (kein Semikolon hinter do und then!). Soll die Bedingung/Schleife mehrere verschiedene Handlungen (= Zeilen) nach sich ziehen, so müssen ebenjene in begin und end eingeschlossen werden, sonst wird, wie Du erfahren hast, gnadenlos nur die jeweils erste Zeile berücksichtigt.

Wenn Du den Code sauber durchstrukturierst, d. h., mit Einzügen (immer zwei Leerzeichen) entsprechend den logischen Zusammenhängen versiehst, dann wird der Code klarer, schau:

var
  i: integer;
  Cue: string;
  Item: IPlaylistItem;

begin
  CurrentPlaylist.BeginUpdate;
  try
    for i:= 0 to CurrentPlaylist.GetCount -1 do
    begin
      Item:= CurrentPlaylist.GetItem(i);
      if Item.GetItemType = pitShow then
      begin
        Factory.CreateMetadataHandler(Item.AsFile).ReadNativeTags;
        Cue:= IFilePlaylistItem(Item).GetFilename + '.cue';
        Item.GetCueData.LoadFromCueSheet(Cue);
        SystemLog(Cue);
        SystemLog('Track '+ IntToStr(i) + '|Cuesheet loaded|' + Cue);
      end;     
    end;
  finally
    CurrentPlaylist.EndUpdate;
  end;
end.

Da siehst Du dann auch sofort, daß Dir das EndUpdate aus der try … finally … end;-Struktur herausgerutscht war. (Es funktioniert zwar so, aber nur wenn alles klappt.) Ich versuche, das so strikt wie möglich durchzuhalten (und gerne auch mal ein paar Leerzeilen entsprechend der einzelnen in sich zusammenhängenden Aktionen einzubauen).

2 Likes

danke. Das ist dann anders als z.B. in Javascript. Aber wenn man es weiß dann ist es klar!

Ich muss das Thema leider wieder raus holen.
Ich habe versucht mittels diesem Script, eine Sendung mit CueSheet vollautomatisiert in einer Stundenvorlage in mAirList an zu legen.

Der Download der jeweiligen Dateien incl. mp3.cue Daten klappt problemlos.
Auch die Zuordnungen in der Stunde und das überschreiben der alten Daten dank folgender Einstellungen:

  • Auto Cue bei jedem Öffnen erneut durch führen
  • Normalisierung bei jedem Öffnen erneut durch führen

Was jedoch leider nicht klappt, ist die Aktualisierung der mp3.cue Marker in der Datenbank.
Die liest mAirList zwar beim ersten Import in die Datenbank zuverlässig aus, jedoch sobald die Dateien einmal in der Woche aktualisiert werden, bleiben die Cue Marker die alten.
Das Script habe ich als [Script für Nachbearbeitung] in der Stundenvorlage eingegeben.

Ich habe bereits darauf geachtet, das die Dateibezeichnungen im Windows Explorer 1:1 mit der .cue Datei übereinstimmt.
image
Laut den Logs, sollen die Cue Daten auch aktualisiert worden sein:
**
image
**
Leider klappt das aber irgendwie nicht:
Screenshot alte Datei: (Teil1)

Screenshot neue Datei: (Teil1) Unterschiede sind anhand der Wellenform erkennbar :wink:

Wäre es möglich ( in naher Zukunft ) eine Möglichkeit in mAirList selbst zu bekommen, die lauten könnte:

  • Cue Sheet beim Öffnen neu importieren?

Oder natürlich mittels Script? Vielen Dank

1 Like