wie bereits angekündigt, würde ich gern in absehbarer Zeit den Inhalt meiner radioDB in die mAirListDB übernehmen.
Besondere Herausforderung: In meiner radioDB habe ich immer nur den Dateinamen der Musik gespeichert, nicht aber den Pfad. Die meisten Musikdateien liegen bei mir im Verzeichnis D:\Musik, einige Jingles, die auch importiert werden müssen in D:\Musik\Jingles.
Wie kriege ich den Import nun unfallfrei und möglichst vollständig hin?
Ich habe hier gerade noch mal überlegt. Es kommt bei mir nämlich noch die Schwierigkeit hinzu, dass ich in der mAirListDB auch das Genre und das Jahr der Titel haben möchte. Es müsste im Idealfall also so laufen, dass ich die Elemente mit der Datenbankverwaltung einlese (inkl. Genre und Jahr) und dann dein Skript oder Programm für jedes Element sämtliche Ramp-, Outro- und Fade-Zeiten aus der radioDB importiert.
Da ich mir nicht vorstellen kann, das so ein Skript/Programm einfach zu realisieren sein wird, muss ich mich wohl mit dem Gedanken anfreuden, dass ich alle Zeiten nach dem Einlesen der Titel in die mAirListDB neu festlegen muss.
Muss ich das wirklich, Torben, oder kannst du dir doch noch einen halbwegs praktikablen Weg vorstellen?
Ja, Daten aus verschiedenen Quellen zu mischen ist immer schwierig - es sei denn, man weiß genau, welche Daten man ersetzen möchte.
Der Konverter RadioDB->mAirListDB wird keine leichte Angelegenheit. Insbesondere deshalb, weil die RadioDB ja nicht nur eine Tabelle mit Audio-Elementen hat sondern mehrere. Dadurch kommt es zu Überschneidungen der IDs.
Was mit relativ wenig Aufwand möglich wäre, ist nacheinander jedes Element aus der RadioDB zu laden und in die mAirListDB einzufügen, wobei es dann eine neue ID bekommt. Vorteil: Das geht sogar mit einem Script. Nachteil: Dabei gehen die Rotations-Zuordungen verloren.
Das Script könnte man dann so erweitern, dass es jede Datei nochmal temporär importiert und die Attribute in den RadioDB-Datensatz kopiert, bevor der dann in die mAirList-DB eingetragen wird. Also etwa so:
var
pi1: IPlaylistItem;
pi2: IPlaylistItem;
begin
(für jedes RadioDB-Element mache folgendes:)
pi1 := (Element aus RadioDB lesen)
pi2 := Factory.CreateFilePlaylistItem(IFilePlaylistItem(pi1).GetFilename, AllFileImportTasks);
pi1.Attributes.Assign(pi2.Attributes);
(jetzt pi1 in mAirListDB schreiben)
end.
Das wäre in meinem Fall kein Problem, weil ich die Zuordnungen eh überarbeiten möchte bzw. mir für die mAirListDB ein anderes Rotationssystem überlegt habe. Mir geht es vor allem um die Zeiten.
[quote=“Torben, post:5, topic:5921”]Das Script könnte man dann so erweitern, dass es jede Datei nochmal temporär importiert und die Attribute in den RadioDB-Datensatz kopiert, bevor der dann in die mAirList-DB eingetragen wird. Also etwa so:
[code]
var
pi1: IPlaylistItem;
pi2: IPlaylistItem;
begin
(für jedes RadioDB-Element mache folgendes:)
pi1 := (Element aus RadioDB lesen)
(jetzt pi1 in mAirListDB schreiben)
end.
[/code][/quote]
Das klingt plausibel und gut. Hier wäre mir aber noch eine Einschätzung wichtig, ob du so einen Konverter in Bälde liefern kannst, der genau das macht. Ansonsten würde ich den Sonntag evtl. schon mal nutzen, um wenigstens einige der 1400 Titel neu zu importieren un die Zeiten neu festzulegen… :-X
Es sind noch einige Anpassungen notwendig (entsprechende Interfaces in die Script-Engine exportieren). Eine genaue Auskunft ist gerade schwierig. Kann eine Sache von fünf Minuten sein, aber vielleicht hab ich auch was übersehen.
{
Konverter-Script radioDB -> mAirList DB
Vorbereitung:
1. radioDB-Verbindung muss eingerichtet sein
2. Neue mAirListDB erzeugen
3. mAirListDB-Verwaltung starten und neuen Speicherort hinzufügen, der dem
Basisverzeichnis der radioDB entspricht
4. database.ini öffnen und IDs der beiden Datenbankverbindungen nachschauen,
zum Beispiel:
[Database1]
Type=radioDB
...
Hier hätte die radioDB die ID 1.
RADIODB_ID und MAIRLISTDB_ID unten anpassen.
5. Script starten und warten.
Einschränkungen in dieser Version:
- Es werden nur die Musiktitel übertragen, keine Verpackungselemente etc.
- Die Ordner-/Rotations-Zuordnung geht verloren
}
const
RADIODB_ID = 2; // ID der RadioDB
MAIRLISTDB_ID = 0; // ID der neuen mAirListDB
var
radioDB: ISQLDatabase;
mAirListDB: ImAirListDB;
pi: IPlaylistItem;
stmt: IZPreparedStatement;
rs: IZResultSet;
begin
radioDB := ISQLDatabase(Database(RADIODB_ID));
mAirListDB := ImAirListDB(Database(MAIRLISTDB_ID));
stmt := radioDB.GetConnection.PrepareStatement('SELECT "TitelID" FROM Titel');
rs := stmt.ExecuteQueryPrepared;
while rs.Next do begin
pi := radioDB.CreatePlaylistItem('1-' + rs.GetString(1));
SystemLog(pi.GetTitle);
mAirListDB.SavePlaylistItemEx(pi, [soAddItem], 0);
end;
end.
Funktioniert ab dem kommenden Build 574.
Anpassungen für das Auslesen bestimmter Informationen aus dem File-Tag folgen.
Großartigggg! Werden die Cue-, Ramp- und Outro-Daten mit diesem Skript denn importiert? Falls nicht: Kann ich das Skript zunächst so ausführen und die oben genannten Werte später in einem zweiten Schritt importieren?
Das Skript starten heißt mAirList öffnen und es dort ganz normal über die Aktionen ausführen?
Alle Cuepunkte usw. werden übernommen und gespeichert. Das ist, als ob du die Elemente erst aus der RadioDB in die Playlist ziehst und dort dann für alle “Speichern in Datenbank” bezüglich der mAirListDB machst.
Und ja, einfach starten. Vorher unbedingt nochmal die IDs der Datenbanken überprüfen.
Wow, fast zehn Minuten hat er rumgeorgelt… Aber es hat geklappt - klasse!
Und dass ich jetzt noch die in die mAirListDB rüberkopierten Elemente in einem nächsten Schritt um die im Datei-Tag stehenden Genre- und Jahr-Infos erweitere, ist dann bald auch möglich, sagst du?
Das kann ich dir innerhalb von fünf Minuten einbauen - du musst mir nur nochmal genau sagen, welche Informationen das sein sollen, und so wie bislang stehen. Wenn ich dich richtig verstehe, geht es um die ausgewählten ID3-Felder, die mAirList in die “Attribute” importiert, ja? Dann wäre es am einfachsten, man würde einfach die Tags nochmal auslesen und die Attributliste kopieren.
Gib mir das Go, und du hast das Script heute noch. Und denk dran, dass du den ganzen Import dann nochmal machen musst, also jetzt noch nichts an dem mAirListDB-Bestand ändern
Ein super Service, da kann man wirklich nicht meckern! Wer nicht erkennt, dass das ein absolutes Alleinstellungsmerkmal für mAirList und seinen Erfinder ist, dem kann nicht geholfen werden…
Also ich brauche die ID3-Tag-Felder “Genre” und “Jahr”, die sich im Tag der Musikdateien an dem in mAirList angegebenen Speicherort D:\Musik befinden.
“Dann wäre es am einfachsten, man würde einfach die Tags nochmal auslesen und die Attributliste kopieren.”
Ok, dann einfach alle Attribute. Ich probiere das mal aus dem Stand (ohne Teste), sitze gerade mit dem MacBook auf der Terrasse…
{
Konverter-Script radioDB -> mAirList DB
Vorbereitung:
1. radioDB-Verbindung muss eingerichtet sein
2. Neue mAirListDB erzeugen
3. mAirListDB-Verwaltung starten und neuen Speicherort hinzufügen, der dem
Basisverzeichnis der radioDB entspricht
4. database.ini öffnen und IDs der beiden Datenbankverbindungen nachschauen,
zum Beispiel:
[Database1]
Type=radioDB
...
Hier hätte die radioDB die ID 1.
RADIODB_ID und MAIRLISTDB_ID unten anpassen.
5. Script starten und warten.
Einschränkungen in dieser Version:
- Es werden nur die Musiktitel übertragen, keine Verpackungselemente etc.
- Die Ordner-/Rotations-Zuordnung geht verloren
}
const
RADIODB_ID = 2; // ID der RadioDB
MAIRLISTDB_ID = 0; // ID der neuen mAirListDB
var
radioDB: ISQLDatabase;
mAirListDB: ImAirListDB;
pi, pi2: IPlaylistItem;
stmt: IZPreparedStatement;
rs: IZResultSet;
begin
radioDB := ISQLDatabase(Database(RADIODB_ID));
mAirListDB := ImAirListDB(Database(MAIRLISTDB_ID));
stmt := radioDB.GetConnection.PrepareStatement('SELECT "TitelID" FROM Titel');
rs := stmt.ExecuteQueryPrepared;
while rs.Next do begin
pi := radioDB.CreatePlaylistItem('1-' + rs.GetString(1));
// diese zwei Zeilen sind die Ergänzung
pi2 := Factory.CreateFilePlaylistItem(IFilePlaylistItem(pi2).GetFilename, [fitNativeTags]);
pi.GetAttributes.Assign(pi2.GetAttributes);
SystemLog(pi.GetTitle);
mAirListDB.SavePlaylistItemEx(pi, [soAddItem], 0);
end;
end.
Du fängst natürlich nochmal mit einer frisch angelegten leeren Datenbank an
Mach dir von der leeren (aber mit Speicherort!) *.db-Datei vor dem Scriptaufruf am besten eine Kopie, falls das Script noch nicht funktioniert, sparst du dir bei der nächsten Runde die Einrichtungs-Arbeit.