[SCRIPT] Daten neu einlesen

Hallo Leute,

ich will es einfach nicht wahr haben, dass es keine Option in mAirList geben soll die einen Titel, der in der Datenbank erfasst ist, neu einließt.

mAirList muß ja nichts anderes tun als eine bestimmte ID zu nehmen und beim zugehörigen Pfad/Titel.mp3 die ID3-Infos und die Titellänge neu auszulesen und in die Datenbank zu übernehmen.

Einfach etwas in der Richtung
"Hallo Datenbank,

kannst Du mir mal kurz bei der ID (1258) nachsehen wo die Datei liegt und dort die Aktuelle Filelänge sowie die ID-Tags auslesen und bei Dir speichern? Wäre lib von dir, dann habe ich später beim senden die korrekten Daten vorliegen.

Alles Liebe
Dein Script"

Ich kann mir nicht vorstellen dass das nicht möglich sein soll :slight_smile:

Ich kann diese Idee nur unterstützen, das wäre echt praktisch!

Ich auch!

Like

Hallo allerseits,

vor ca. einem Jahr hatte ich schon einmal ein ähnliches Thema eröffnet (siehe https://www.mairlist.com/forum/index.php/topic,5694.msg40574.html#msg40574).
Damals schrieb Torben, dass es wohl in Zukunft eine Lösung geben könnte.
Ich könnte diese Funktion gut gebrauchen, weil ich meine Tonträger generell mit dem Programm “catraxx” archiviere und auch nur dort Tags bearbeite.
Deshalb würde ich gerne von Zeit zu zeit eventuell aktualisierte Tags neu einlesen, damit ich in mairlist die aktuellen Daten zur Verfügung habe.

Schöne Grüße
Martin

In der GUI geht es nun seit Build 1829 von v4.3.

Script-Lösung sieht ungefähr so aus: Man liest das Element aus der Datenbank aus, verwendet seinen FileTypeHandler zum Einlesen der Länge und Tags, und schreibt es dann zurück in die DB.

Der “FileTypeHandler” ist ein Objekt, das je nach Dateityp (MP3, OGG, …) die passenden Routinen zum Auslesen der Tags zur Verfügung stellt.

(Script ungetestet)

var
  item: IPlaylistItem;
  fth: IFileTypeHandler;

begin
  // Element aus Datenbank laden anhand der ID
  item := Database(0).CreatePlaylistItem('12345');

  // Test ob Datei
  if not item.IsFile then begin
    SystemLog('Das ist kein Datei-Element!');
    exit;
  end;

  // FileTypeHandler erzeugen
  fth := item.AsFile.GetFileTypeHandler;

  // Daten neu einlesen
  fth.ReadDuration; // Länge
  fth.ReadNativeTags; // native Tags (ID3)
  // fth.ReadTags; // spezieller mAirList-XML-Tag

  // und das Element in die DB zurückschreiben
  Database(0).SavePlaylistItem(item); 
end.

Ein Traum :slight_smile:

Vielen Dank Torben, das macht es ungleich einfacher in Zukunft wandelnde Elemente wie Nachrichten, Werbung usw. zu automatisieren.

Danke

So, ich habe mich jetzt mal daran gemacht und dem Script meine Aufmerksamkeit geschenkt.

Aber so wirklich weiter komm ich da noch nicht. Wenn ich das korrekt verstehe, wird der Variablen “Item” automatisch die Database (0) zugewisen und eine Art themporäres Playlistitem erstellt?

Angefangen damit, dass ich zum Beispiel 4 Datenbanken habe, wobei 2 demnächst rausfallen weil es alte relikte sind, habe ich alleine mit der Zuordnung “Database(0)” ein Problem. Zu dem entzieht sich mir die Verknüpfung zu einem bestimmten File.

Beispiel:
Ich habe in einem Playlist.Player oder der Cartwall ein File das in die DB eingebunden ist und dessen Inhalt (Länge und Tag) sich immer wieder ändert (Nachrichten, Werbung, Horoskop usw.). Diese Elemente sind immer fix an einer bestimmten Position (Cartwall) Also müßte das Script eigentlich sagen: Nehme Titel aus CW-Player1 oder Player1-3, bestimme Interne-ID des aktuellen Titels und ReadDuration usw. …

Ich hoffe ich kann verständlich machen was ich meine?

Database(0) ist die erste in der Konfiguration definierte Datenbank, Database(1) die zweite usw. Diese Datenbankobjekte haben jeweils eine Methode “CreatePlaylistItem(…)”, der man die ID des gewünschten Elementes mitteilt. Zurückgeliefert wird dann das entsprechende IPlaylistItem-Objekt, “temporär”, wenn du so willst, also nicht in irgendeiner Playlist eingetragen. Damit kann man dann weiterarbeiten.

Wenn du von einem Element auf die Datenbank schließen möchtest, wird es etwas komplizierter, aber nicht viel: Wenn du ein IPlaylistItem hast, kannst du mit GetDatabase die “Uniqze ID” der Datenbank ermitteln, und mit mit “GetDatabaseID” die ID des Elementes innerhalb der Datenbank.

Die “Unique ID” ist ein String, der jede im System angelegte Datenbank eindeutig definiert. Über die Unique ID kann man eine Referenz auf das eigentliche Datenbankobjekt ermitteln.

Hier mal wieder anschaulich als Code:

var
  db: IDatabase; 
  item: IPlaylistItem;

begin

  // Element von Playlist 1, Player 3 ermitteln
  item := Playlist(0).GetPlayer(2).GetItem;

  if item = nil then begin
    SystemLog('Der Player ist leer.');
    exit;
  end;

  // Überprüfen ob Unique ID gesetzt
  if item.GetDatabase = '' then begin
    SystemLog('Das Element stammt nicht aus einer Datenbank.');
    exit;
  end;

  // Jetzt Referenz auf Datenbank ermitteln anhand der Unique ID
  db := Instance.GetDatabases.FindByUniqueID(item.GetDatabase);

  if db = nil then begin
    SystemLog('Das Datenbankobjekt konnte nicht ermittelt werden.');
    exit;
  end;

  // UND JETZT WEITER WIE OBEN

  // Test ob Datei
  if not item.IsFile then begin
    SystemLog('Das ist kein Datei-Element!');
    exit;
  end;

  // FileTypeHandler erzeugen
  fth := item.AsFile.GetFileTypeHandler;

  // Daten neu einlesen
  fth.ReadDuration; // Länge
  fth.ReadNativeTags; // native Tags (ID3)
  // fth.ReadTags; // spezieller mAirList-XML-Tag

  // und das Element in die DB zurückschreiben
  db.SavePlaylistItem(item); 

end.

So, ich habe da noch ein Problem it dem FileTypHandler

Hier binrgt mir mAirList einen running Scriot-Error in Zeile 38:3

// FileTypeHandler erzeugen fth := item.AsFile.GetFileTypeHandler;

Brauch ich da ein extra Tool oder woran liegt das?

Ich habe mir diese Woche nochmal einige Nächte um die Ohren geschlagen um bei dieser Geschichte voran zu kommen.

Aber … Wie ich es auch drehe und wende am Ende bliebe ich immer wieder im selben Teufelskreis hängen. Es findet bei einem bereits im Player geladenen Element kein Reload statt.

Korrekter Weise müßte das Script die Datei mit der ID:XXXXXX aus dem Player werfen und wieder neu einladen.

Um das System an dem ich arbeite nochmal zu erklären.
Es geht mir darum eine feste Struktur aufzubauen, das heißt zum Beispiel dass die entsprechende Datei in einem Player der Cartwall liegt (oder wie bei mir in meiner 2nd CW gebaut aus Playlist2). Das wiederum heißt die Datei ist in irgendeinem Player bereits geladen und damit auch gepuffert. Ich hoffe dass seh ich so richtig ?

Nun wird durch Script oder was auch immer im Hintergrund die Datei ausgetauscht, das bekomme ich hin obwohl die Datei im Player geladen ist.

Aber das Neueinlesen der Filelänge bringt nicht den gewünschten Erfolg, um das Element mit der neuen Länge und evtl. neuem Tag im geladenen Player zu verändern und auch korrekt abzuspielen.

Unterm Strich heißt das, die Routine muß nicht nur die neue Datei herunterladen, austauschen, die neue Länge und ID3-Tag einlesen, sondern auch den Titel aus dem Player löschen und wieder an der selben Stelle einfügen. Dann würde es klappen…