Vollautomatische Ausspielung von Wiederholungen und Vorproduzierten Sendungen

Das Thema hatte ich hier: Vollautomatische Ausspielung von Wiederholungen und Vorproduzierten Sendungen
Schon mal auf gemacht, bisher aber leider noch keine Lösung gefunden. In der Scripting engine fehlt offensichtlich der Zugriff auf die extra Cues, jedenfalls konnte mir bisher noch niemand sagen, wie ich damit in Scripten umgehen müsste.

Ja… Manchmal ist das so eine Sache mit dem Wald und den Bäumen.

Ich habe mich mal wieder an meine Vollautomatisierung gemacht und das Script von weiter oben, vereinfacht. Wir gehen einfach die ganze Playliste durch, suchen nach dem Item Element “Sendung”, laden erst mal den ID3 Tag und falls eine existiert, auch die Cue-Datei.

var
  i: integer;
  cue: IFilePlaylistItem;

begin
  CurrentPlaylist.BeginUpdate;
  try
    for i := 0 to CurrentPlaylist.GetCount - 1 do
      if CurrentPlaylist.GetItem(i).GetItemType = pitShow then begin
        Factory.CreateMetadataHandler(CurrentPlaylist.GetItem(i)).ReadNativeTags;
        cue := FilePlaylistItem.GetFilename(CurrentPlaylist.GetItem(i))+'.cue';
        CurrentPlaylist.GetItem(i).GetCueData.LoadFromCueSheet(cue);
      end;
  finally
    CurrentPlaylist.EndUpdate;
  end;
end.

Muss ich das laden des Cue-Sheets in eine weitere “Try” Schleife packen oder reicht das erste try vor der for-Schleife dafür auch noch aus?
Ich habe es noch nicht getestet aber passt das halbwegs oder bin ich total auf dem Holzweg?

Hmm :man_facepalming: ich bekomme einen Error (10:81): Type mismatch.

Was mache ich denn schon wieder falsch? :thinking:

Du in diesem Falle gar nichts:

Das kann so nicht funktionieren, da CreateMetaDataHandler ein Objekt vom Typ IFilePlaylistItem benötigt, und nicht IPlaylistItem.

Allerdings bliebe Dein Code auch in der nächsten Zeile hängen:

[Error] (11:16): Unknown identifier 'FilePlaylistItem'

@Torben?


Sonntägliche Grüße

TSD

In meiner Zeitzone ist heute Samstag… wo bist du denn?

Da Urlaub, scheinbares Sonntagsempfinden. Um so besser!
 

Entspannte Grüße

TSD

1 Like
Factory.CreateMetadataHandler(CurrentPlaylist.GetItem(i).AsFile).ReadNativeTags;
1 Like

Gut, dann probiere mal folgendes, @shorty.xs:

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

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


Bereinigte Grüße

TSD

Ach, und die Zeile

Meta: IMetadataHandler;

ist überflüssig, nur vom Ausprobieren noch übrig.

Schlampige Grüße

TSD

Und: Die Zeile

if CurrentPlaylist.GetItem(i).GetItemType = pitShow then begin

sollte schöner heißen

if Item.GetItemType = pitShow then begin

Mußte schnell gehen heute morgen.

TSD

1 Like

Ich bin mal wieder in dieses Thema hier eingestiegen.

Diese Script Syntax bring mich noch mal um (den Vestand).
Das hier kam dann am ende raus.

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

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

Problem: Es passiert nichts.
Nun wollte ich anfangen, den Fehler zu suchen ud wollte ganz simpel ein SystemLog einfügen.

Nach dem Item über Item := CurrentPlaylist.GetItem(i); gesetzt worden ist, möchte ich mir das ins Log schreiben. Ich hätte angenommen, dass das über SystemLog (Item); hätte funktionieren müssen. Stattdessen bekomme ich einen Type Missmatch. Wahlweise auch SystemLog (Item.GetItemType);

Das gleiche weiter unten, den Inhalt von Cue.

Verzweifelte Grüße

Ins Log kannst Du nur Daten vom Typ String, also Buchstaben, schreiben. Item ist aber ein IPlaylistItem. Vielleicht so:

  …
  SystemLog('Holleri ' + Item.GetTitle);
  …


Syntaktische Grüße

TSD

ich klinke mich mal mit ein. @shorty.xs und ich testen das gerade intensiver und sind auf der Spur.
Es passiert folgendes:
Wenn nur ein Item in der Playlist ist, dann funzt das Script und das Cuesheet wird geladen.
Existieren mehrere Items in der Playlist, dann passiert nichts. Das Script macht nichts.
@Tondose die letzte Hilfe kam von dir, hast du eine Idee warum da was ignoriert wird sobald mehrere Items in der Playlist sind? Die Items sind von unterschiedlichem Typ, also Sendung, Musik, Jingle. Bei Sendung soll das Cuesheet aktualisiert werden. Systemlog wird geschrieben wenn wie im ersten Fall beschrieben nur ein Item in der Playlist ist und ausgespielt wird. Danke und schönes Wochenende

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

begin
  CurrentPlaylist.BeginUpdate;
  try
    for i:= 0 to CurrentPlaylist.GetCount - 1 do
      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);
      end;
  finally
    CurrentPlaylist.EndUpdate;
  end;
end.

Hm ok. Ich hab nochmal etwas rumprobiert und das Problem eingegrenzt:
Das Skript lädt das Cuesheet immer im letzten/unterstem Item wenn es vom Typ Sendung ist. Sind also z.B. 3 Items in der Playlist, 1=Sendung, 2&3=Musik dann macht das Skript nichts. Ich glaube wir wollten die Playliste komplett durchgehen und alle Items vom Typ Sendung aktualisieren, richtig @shorty.xs? Ich kann etwas Javascript und denke da eher an einen for each loop. Mh … mal sehen bin jetzt zu müde. Wenn jmd. Ideen hat, haut raus.

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