Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Eigene Playlist entwickeln?! (https://www.delphipraxis.net/99157-eigene-playlist-entwickeln.html)

Cyberaxx 7. Sep 2007 17:48


Eigene Playlist entwickeln?!
 
Hallo,

was besseres viel mir leider gerade nicht als Thema ein.

Es geht darum ein eigenes Playlist-System zu erstellen, ähnlich der MediaLibrary von Winamp.
Ich weiß nicht ob Winamp dafür eine Datenbank benutzt aber das ist gerade wengier wichtig.

Ich wurde von einem Bekannten angesprochen ob ich nicht etwas bauen könnte damit er eine interaktive Suche für seine Musik hat.
Er hat also alle Seine Musik und möchte nun nach einem Lied suchen, dessen genauen Namen er nicht mehr kennt, aber einen Teil von ihm.

Hatte es auch zum Teil schon fertig gehabt aber nicht direkt mit dem Erfolg den ich wollte.
Beim erstellen der "Liste" übergibt man Quellverzeichnis und eine Liste vom Typ TStrings(für die Visualisierung).
Das Verzeichnis inkl. aller Unterverzeichnisse wird durchsucht und für jede gefundene Datei ein CollectionItem angelegt.
Darin enthalten sind bisher nur Pfad und Dateiname. Später sollen dort aber auch noch ID3 Tag, Länge usw. drin enthalten sein.
Nachdem alle Dateien hinzugefügt werden, wird einfach nur der Dateiname an die Liste angehängt.
Intern nutze ich nur TStrings, da ist mir schon aufgefallen das es dort ja keine Eigenschaft ItemIndex gibt, was natürlich nicht so toll ist. Bin dann erstmal über IndexOf(S: String) gegangen aber was passiert wenn öfter eine Datei vorkommt. Dann würde er immer die erste nutzen.
Sie suche ansich funtioniert recht einfach. die liste wird gesäubert und es werden alle CollectionItems durchgegangen und wenn der Suchtext passt, wird er zur liste hinzugefügt. Da hab ich dann eben gemerkt wenn im Verzeichnis /xy/lied.mp3 liegt und direkt darunter im Verzeichnis /xx/lied.mp3 und ich klicke letzteres an er eben das erste nehmen würde.
Somit dachte ich ok übergibst halt auch das eigentliche Objekt bei der Suche und gehst dann direkt über das Objekt in der Liste.
Es wäre jetzt die Frage die ich hier stelle, ob es eine bessere Lösung gebe sowohl in der Umsetzung und Aufwand.


Das ist jetzt noch der Original Code ohne übergabe des Objektes an die Liste
Delphi-Quellcode:
type
  TAudioItem = class(TCollectionItem)
  private
    FFilename: String;
    FDirectory: String;
    procedure SetDirectory(const Value: String);
    procedure SetFilename(const Value: String);
  public
    property Filename: String read FFilename write SetFilename;
    property Directory: String read FDirectory write SetDirectory;
  end;

type
  TAudioItems = class(TCollection)
  private
  public
    constructor Create;
    constructor Destroy;
    function Add(Directory, Filename: String): TAudioItem;
    function GetAudioItem(Index: Integer): TAudioItem;
  end;

type
  TPlayList = class(TObject)
  private
    FList: TStrings;
    FAudioItems: TAudioItems;
    FCount: Integer;
    procedure GetFiles(aDirectory: String; const FileMask: String; SubDirs: Boolean);
  public
    constructor Create(List: TStrings);
    destructor Destroy; override;
    procedure AddDirectory(ADirectory: String);
    procedure FileEntry(S: String; var Directory: String; var Filename: String);
    procedure Search(S: String);
    function Count: Integer;
    function SelectedItem: Integer;
  end;

procedure TPlayList.AddDirectory(ADirectory: String);
  var
    SR: TSearchRec;
    I: Integer;
begin
  GetFiles(ADirectory, '*.mp3', True);

  for I := 0 to FAudioItems.Count - 1 do
    FList.Add(FAudioItems.GetAudioItem(I).Filename);

end;

procedure TPlayList.FileEntry(S: String; var Directory, Filename: String);
  var
    AItem: TAudioItem;
    I: Integer;
begin
  for I := 0 to FAudioItems.Count - 1 do
    if (FAudioItems.GetAudioItem(I).Filename = S) then
      begin
      AItem := FAudioItems.GetAudioItem(I);
      break;
      end;

  Directory := AItem.Directory;
  Filename := AItem.Filename;
end;

DP-Maintenance 7. Sep 2007 18:05

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Es geht um Delphi.

arbu man 7. Sep 2007 21:01

Re: Eigene Playlist entwickeln?!
 
Hau einfach die Daten in eine Datenbank, dann muss du dir um die Punkte Speichern/Laden und Suchen keine sorgen machen, das macht alles die DB für dich.


mfg, Björn

argonix 7. Sep 2007 21:14

Re: Eigene Playlist entwickeln?!
 
Mein Musikplayer Merkur Player macht genau das. (mit ID3-Tag usw.) Dabei werden die Daten in einer XML-Datenbank gespeichert. Das geht mit wenig Aufwand (es gibt hier im Forum irgendwo auch ein gutes Tutorial dazu). XML ist enorm flexibel und (meißtens) auch sehr schnell.
Warum schreibst du die Daten zur Anzeige nicht in ein Listview? Das geht doch viel einfacher!

[edit]Unsinn entfernt[/edit]

Cyberaxx 7. Sep 2007 21:33

Re: Eigene Playlist entwickeln?!
 
Na das wäre ja ein wenig zu einfach ;)

Die frage ist wie die Performans ausschaut und das aktualisieren der Daten.
Ist eine Datenbank, muss ja eine Lokale sein wirklich schneller?
Jemand ändert nen Eintrag oder den Namen. Beim Name wäre das ja ok, ist der Name nicht vorhanden einfach löschen aber beim ändern, das heisst ich muss jede Datei eh noch einmal aufrufen um zu sehen ob die Daten nicht stimmen.

Im Visuellen habe ich ja eine Listwiev.
Da wird halt nur Visuell dargestellt für die Suche, ich will intern ja dennoch die gesamte Liste haben und nur die Anzeigen die im Suchergebnis enthalten sind. Genau das ist ja bisher auch nur das Problem gewesen, habe nur den Dateinamen übergeben und nicht noch das Objekt angehängt.
Mit der DB wäre ne Idee, aber da ja wie gesagt was schneller geht.
Ich würde ungerne auf eine XML zurück greifen, gerade was mal eben von einigen Tausend Dateien angeht.
Ich gehe hier auch nicht von einem Mediaplayer aus was die Playlist angeht sondern eher ein Verwaltungstool der Dateien.
Die Suche soll ja nicht alles an dem Konstrukt sein.

[Edit]Was ist bei die die Grundlage für Aidio und Video? Nutzt Du eine Komponente oder mehrere?[/Edit]

arbu man 8. Sep 2007 09:52

Re: Eigene Playlist entwickeln?!
 
Grade bei vielen Datensätzen würde ich eine DB vorziehen, durch SQL Abfragen kann man schnell die gesuchten Datensätze anzeigen lassen. Natürlich könnte man es von Hand etwas schneller machen, aber in dem DBMS stecken schon sehr viele Optimierungen drin, ich sehe ich das es ein vertretbarer Aufwand wäre, es von Hand selbst zu machen, zumal ich bezweifle das du es schneller hin bekommst als eine DB.

mfg, Björn

Cyberaxx 8. Sep 2007 13:26

Re: Eigene Playlist entwickeln?!
 
Abgesehen von XML was wäre denn eine nette Datenbank, die Lokal läuft und die ich ohne weitere Installationsvorraussetungen nutzen kann unter Windows sowie unter Linux?

Cyberaxx 10. Sep 2007 15:38

Re: Eigene Playlist entwickeln?!
 
Habe mich nun für ein Datenbank Konzept entschieden.
Ist vllt. nicht die beste Wahl aber ich denke dafür geniügen die Ansprüche, ist nun eine SQLite Datenbank.
Hier habe ich wenigstens den Vorteil, das man durch die SQL Syntax auch andere Datenbanken nutzen kann und entsprechend auch erweitern kann ohne viel Aufwand. Hoffe das die Zugriffszeigen recht gut sind.

@argonix
Habe deinen Rat befolgt und alles in eine TreeView rein gesetzt, macht Optisch schon mehr her. :)

mimi 10. Sep 2007 18:43

Re: Eigene Playlist entwickeln?!
 
wie währe es denn mit einer such Funktion für Dateien ?
also Praktisch ein eigens "dir" wenn du so möchtest.... kannst du folgend ?

Bei bedarf kann man die Dateien auch noch öffnen und per FMod oder so die Tags Rauslesen wenn man möchte !

Cyberaxx 10. Sep 2007 18:57

Re: Eigene Playlist entwickeln?!
 
@mimi
Zum ersten Teil nicht so ganz, Suchfunktion ist ja bereits in der NonDB Version drin, da bisher aber auch nur nach Dateinamen, da ich damit jemanden Delphi ein wenig näher bringen will, und ich noch keine Lust hatte ihm die Jedis auf der Turbo Version zum laufen zu bringen.

Mit der DB allerdings geht das suchen noch schneller und ich kann auch direkt nach mehreren Kreterien suchen.
Abspielbar soll das alles nachher per BASS.DLL oder aber playlist -> WinAmp sein.
Was mir immernoch fehlt ist etwas um WinAmp bzw NSV Dateien abzuspielen... Falls da wer etwas hat, her damit


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz