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 ich bekomme einen Error (10:81): Type mismatch.
Was mache ich denn schon wieder falsch?
Du in diesem Falle gar nichts:
Das kann so nicht funktionieren, da CreateMetaDataHandler
ein Objekt vom Typ I
File
PlaylistItem
benötigt, und nicht IPlaylistItem
.
Allerdings bliebe Dein Code auch in der nächsten Zeile hängen:
[Error] (11:16): Unknown identifier 'FilePlaylistItem'
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
Factory.CreateMetadataHandler(CurrentPlaylist.GetItem(i).AsFile).ReadNativeTags;
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
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.
@Tondose you made my day! Danke, das Script läuft und es lag daran. @shorty.xs schau mal, wir kommen vorwärts
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.
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).
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.
Laut den Logs, sollen die Cue Daten auch aktualisiert worden sein:
**
**
Leider klappt das aber irgendwie nicht:
Screenshot alte Datei: (Teil1)
Screenshot neue Datei: (Teil1) Unterschiede sind anhand der Wellenform erkennbar
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