Eigenschaften von Musiktiteln per Programm speichern

Hallo Hackerboard :)

Ich arbeite momentan an einem kleineren Projekt, zur eigenen Förderung.
Bin dabei auf ein Problem gestossen - ich will eine Datenbank meiner Musiktitel anlegen enthalten sein sollen:
Dateipfad, Interpret, Album, Titel
meine Lieder haben die Formate m4a und mp3, die Informationen über Interpret etc. wurden grösstenteils per iTunes eingetippt und sind somit nicht in den Eigenschaften.

Da mir weder Google englisch noch Google deutsch weitergeholfen haben, werde ich solch eine Applikation wohl selbst schreiben müssen.

Ich hab mir überlegt, etwas in .cmd zu schreiben, da das relativ anspruchslos ist, jedoch weiss ich nicht, wie ich ihn dazu bringe, die Informationen auszulesen.
Wisst ihr da mehr?

Schönen Abend noch :)
 
der mangel an anspruch wird begleitet von einem mangel an möglichkeiten ...


zudem gibt es für MP4 aka M4A nur den "standard" (nicht wirklich, aber quasi allgemein üblich) alle metainformationen unter "udta" also dem user-data bereich des containers abzulegen ... wie dieses tag dann aussieht, oder was es bedeutet, ist nicht standardisiert ... itunes verwendet ein proprietäres format ... ich meine mal gelesen zu haben, das die quicktime COM schnitstelle da was von unterstützt ...

im fall von MP3 wirst du größtenteils auf ID3 metadaten stoßen ... eine c# lib die das kann wäre z.b. http://sourceforge.net/projects/csid3lib/
 
Du meinst, die Infos stehen also im ID3V2 Tag o.ä.?
Für C++ kann ich da die Taglib empfehlen. Mit MP3's klappt das super, kann ggf. auf mal ein Codesample posten. :)
Angeblich kann die Taglib auch MP4, was ich allerdings noch nicht ausprobiert habe...
 
Wow, ihr seid ja schnell

Nun, hab noche in bisschen gesucht und Schlussendlich ein (unbefridigendes) Ergebnis mit dem Programm "The Godfather" erhalten.
Das Programm lässt mir einfach zu wenig Freiheiten.
Die Library die ihr ansprecht wird auf der seite erklärt.
Bin nun soweit, dass ich das ganze in C schreiben will und mit .Net Framework ausführen will.
Leider fehlt mir da jegliche Praxis, deshalb wäre ich um ein Codebeispiel sehr froh, ich bin definitiv in der Lernphase!
 
Die Taglib - und afaik .NET, bin nicht so der Windows Programmierer :/ - stellen Klassen bereit. In C gibt es keine Klassen. Du meinst eher C++?

Kleine Anmerkung: Die Taglib muss man afaik unter Windows mit CMake kompilieren - Eine Quälerei, man merkt, dass makefiles nicht für windows gedacht sind... :(
Hier mal im Header ein Struct und Präprozessoren, die ich später benutze:
Code:
#include <string>
#include <iostream>
#include <vector>

#include "taglib/tag.h"
#include "taglib/taglib.h"
#include "taglib/fileref.h"
#include "taglib/tstring.h"
#include "taglib/audioproperties.h"
using namespace TagLib;

struct mp3info //Sozusagen ein Programminterner ID3V2 Tag
//Allerdings unvollständig - Kannst ja noch welche hinzufügen
//Bei Eclipse gibt es da auf dem Rechtsklick die Nette Funktion "Open Declaration (F3)" - Die lotst dich zum header aus der ich z.B. *.tag()->setTitle(...) habe... 
{
    std::string titel;
    std::string interpret;
    std::string album;
    std::string genre;
    std::string dauer;

    std::string kommentar;
    int jahr;
    int trackNr;

    int idauer; //In Sekunden
    std::string dateipfad;
};
[...]

Die *.cpp Datei:
Code:
void set_mp3info(std::string info[7], mp3info song)
{
    TagLib::FileRef f(song.dateipfad.c_str());
    song.titel = info[0];
    f.tag()->setTitle(info[0].c_str());

    song.interpret = info[1];
    f.tag()->setArtist(info[1]);

    song.album = info[2];
    f.tag()->setAlbum(info[2]);

    song.kommentar = info[3];
    f.tag()->setComment(info[3]);

    song.genre = info[4];
    f.tag()->setGenre(info[4]);

    song.jahr = StoI(info[5]); //StoI macht aus std::string Integer...
    f.tag()->setYear(StoI(info[5]));

    song.trackNr = StoI(info[6]);

    f.tag()->setTrack(StoI(info[6]));
    f.save();
 
   //Lesen fast genau so, schau mal in die Header.
}

PS: Als DBMS kann ich dir SQLite3 empfehlen. Sowas in Textdateien anzulegen ist etwas ineffizient und es fehlt die Datenbank Abfragesprache, MySQL oder MSSQL sind etwas zu aufwendig für ein kleineres Programm. Oder wie seht ihr das? Oo
 
Zuletzt bearbeitet:
wenn ich c in verbindung mit .net lese, vermute ich mal du meinst c# (C Sharp)

in dem fall wäre Taglib Sharp wohl das mittel der wahl

zu DBMS würde ich 3 alternativen benennen(sortiert nach steigendem aufwand für anfänger):

zum einen SQLite, was wegen seines geringen aufwandes im vergleich zu dem erheblichen nutzen ja schon genannt wurde

zum anderen würde ich MySQL nicht sofort abharken, da auch hier der anfang relativ leicht sein kann (xammp bringt beispielsweise eine vorkonfigurierte mysql instanz mit die dank phpmyadmin recht übersichtlich administriert werden kann... )

und zu guter letzt, noch MS SQL Express, was zwar vom anfänglichen aufwand die arbeitsintensivste alternative ist (die konfiguration von benutzern, datenbankrechten, etc), aber die integration in Visual Studio Express mitbringt (falls diese IDE verwendet werden soll... stichwort linq-to-sql, oder Entity-framework ... letzteres arbeitet auch mit MySQL zusammen, aber ich weiß nicht wie es da mit der integration um Visual Studio Express steht)

ich würde vermutlich als DBMS auf MySQL oder MSSQL zurück greifen, und unter .NET das Entity framework benutzen
 
Vielen Dank für eure Mühen!

Danke sehr für die Mühe!!

Fürs Erste habe ich nun eine Lösung mit "The Godfather" gefunden, wenn das ganze Projekt jedoch anwächst ist eine eigene, integrierte Codelösung auf jeden Fall eleganter und schlanker als "The Godfahter".
Deshalb habe ich zum Code noch einige Fragen, zu denen du dir bitte nicht die Mühe machst, einen Code zu schreiben, da ich bloss sehr ungenaue Antworten brauche.
Wie sagst du ihm, dass er die gesammelten Daten schreiben soll?
Um mehrere Dateien zu scannen und zu schreiben - ich würde das mit einem Loop regeln so im Stile: "Lasse für jede Datei im Ordner x den String laufen und speichere die Daten anschliessend" Lösung soweit machbar?
 
mach dich ein wenig mit der lib vertraut, speziell wie man ihr die ressource zeigt, von der man etwas wissen will (ka, ob das ding gerne ein handle von dir haben will, oder einen pfad übernimmt, um die datei selber zu lesen, etc...)

danach sollte es relativ einfach sein eine schleife zu konstruieren, die alle dateien durchgeht ...

lege dir einen typ (eine klasse/ein struct) an, dass alle benötigten daten aufnehmen kann (pfad zur datei, interpret, album, ...) und erzeuge ein objekt je datei, und befülle es ...

die neuen objekte kannst du in einer liste speichern, und dann damit tun oder lassen was dir beliebt, wie z.b. die auflistung an eine funktion zu übergeben, die daraus sql anweisungen erzeugt, um die daten in eine db zu schreiben ...

je nach verwendetem DBMS eignen sich hier verschiedene wege ...

wenn du das Entity-framework oder LINQ-to-SQL verwendest, kann die klasse deren objekte die daten speichern, gleich über das framework erstellt sein ... dann kannst du dir sogar die liste sparen, sondern erzeugst einfach einen entsprechenden DB kontext, und hängst die objekte ein ...

anschließend (oder in regelmäßigen abständen) sagst du dem kontext, dass er die änderungen speichern kann (SubmitChanges) das framework kümmert sich dann darum, dass die daten in die DB kommen ...

schreib erstmal den teil, mit der die dateien durchgeht (und die informationen erstmal einfach auf die console rauswirft, also noch keine klasse oder struktur entwerfen) ... dann kannst du dir ein DBMS suchen, und ab da sehen wir weiter, ok?
 
Zurück
Oben