Eksport plików z winampa na MP3-ke

user2046

Więc tak na szybko to chodzi o to, aby zrobić program który za nas będzie kopiował nasze ulubione piosenki na nasze telefony, empetrójki, pendrivy czy co tam jeszcze chcemy tym samym odbierając nam wątpliwą przyjemność jaką jest znajdowanie na dysku każdej piosenki po kolei i kopiowanie jej ręcznie.

Jak to działa?
Ano działa to tak, że program kopiuje wszystkie pliki jakie mamy aktualnie w playliście winampa. Obojętnie czy są w bibliotece multimediów czy nie. Program najpierw wysyła komunikat do winampa każąc mu zapisać aktywną playlistę do pliku, czyta ten plik, sprawdza czy jest dość miejsca na nośniku i kopiuje pliki. Tyle. Napisałem to wyłącznie dla siebie i mi to BARDZO ułatwia życie mam nadzieję że komuś też się przyda;)

Potrzebne będą na naszej formie:
1 *Edit (adres do którego kopiujemy)
1 *ProgressBar (postęp kopiowania to chyba wiadomo;))
2 *Button (przyciski 'Kopiuj' i 'Przeglądaj')
2 *Label (pierwszy wyświetla postęp kopiowania obok progressbara, drugi nad editem to np 'Kopiuj do folderu:'

A cały kod wygląda tak:

unit Playlista1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, strutils, ComCtrls, shlobj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  folder, s1, linia: string;
  lista: text;
  a: integer;
  wolne, rozmiar: int64;
  hwnd: thandle;
  path: array [0..255] of char;
implementation

{$R *.dfm}

function BrowseForFolder(Sender:TForm):string;
var BrowseInfo : TBrowseInfo;
  PIDL : PItemIDList;
begin
  Result := '';
  ZeroMemory(@BrowseInfo, SizeOf(BrowseInfo));
  BrowseInfo.hwndOwner := Sender.Handle;
  BrowseInfo.pszDisplayName := @Path[0];
  BrowseInfo.lpszTitle := 'Wybierz folder docelowy:';
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or BIF_RETURNFSANCESTORS or BIF_USENEWUI;
  PIDL := SHBrowseForFolder(BrowseInfo);
  if Assigned(PIDL) and SHGetPathFromIDList(PIDL, Path) then
    Result := string(Path);
end;

function CheckFileSize(FileName : String) : Integer;
var
  Plik : TSearchRec;
begin
  if FindFirst(FileName, faAnyFile, Plik) = 0 then
    Result := Plik.Size
  else
    Result := 0;
  FindClose(Plik);
end;

procedure TForm1.Button1Click(Sender: TObject); //przycisk 'Kopiuj'
begin
  folder:=edit1.text;
  if not directoryexists(folder) then
  begin
    showmessage('Folder nie istnieje');
    exit;
  end;
  hwnd:=FindWindow('Winamp v1.x',nil);
  if hwnd=0 then
  begin
    showmessage('Włącz winampa');
    exit;
  end;
  SendMessage(hwnd, WM_USER,0,120);
  button2.Enabled:=false;
  wolne:= DiskFree(ord(folder[1])-64);
  SHGetSpecialFolderPath(0, path, CSIDL_APPDATA, False);
  label1.Caption:='';
  assignfile(lista, path+'\Winamp\Winamp.m3u');
  reset(lista);
  rozmiar:=0;
  a:=0;
  repeat
    readln(lista, linia);
    if (linia[1]<>'#') and (fileexists(linia)) then
      rozmiar:=rozmiar+CheckFileSize(linia);
    a:=a+1;
  until eof(lista);
  if (rozmiar>wolne)and(ord(folder[1])>64)and(ord(folder[1])<91) then //sprawdza tylko dyski
  begin
    closefile(lista);
    showmessage('Za mało miejsca na dysku! Brakuje '+inttostr((rozmiar-wolne)div 1048576 +1)+' MB');
    exit;
  end;
  reset(lista);
  progressbar1.max:=a div 2;
  a:=0;
  repeat
    a:=a+1;
    readln(lista, linia);
    if (linia[1]='#') or (not fileexists(linia)) then
      continue;
    s1:= linia;
    while AnsiContainsStr(s1, '\') do
      delete(s1, 1, 1);
    copyfile(pchar(linia), pchar(folder+'\'+s1), true);
    progressbar1.position:=a div 2;
    label1.Caption:= inttostr(a div 2)+'/'+inttostr(progressbar1.max);
    Application.ProcessMessages;
  until eof(lista);
  closefile(lista);
  assignfile(lista, path+'\Winamp\PlaylistExporter.ini');
  rewrite(lista);
  writeln(lista, folder);
  closefile(lista);
  label1.Caption:= label1.Caption+' DONE!!!';
  button2.Enabled:= true;
end;

procedure TForm1.Button2Click(Sender: TObject);// przycisk 'Przeglądaj'
begin
  folder:= BrowseForFolder(Form1);
  if folder<>'' then
    edit1.Text:= folder;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SHGetSpecialFolderPath(0, path, CSIDL_APPDATA, False);
  if not fileexists(path+'\Winamp\PlaylistExporter.ini') then
    exit;
  assignfile(lista, path+'\Winamp\PlaylistExporter.ini');
  reset(lista);
  readln(lista, folder);
  closefile(lista);
  edit1.Text:=folder;
end;

end.

3 komentarzy

Preferencje -> Wtyczki -> Urządzenia przenośne -> Konfiguracja wtyczki 'Obsługa urządzeń USB'. Wybierasz literę dysku podpiętego telefonu, czekasz chwilę i możesz od tej chwili dowolnie konfigurować kopiowanie muzyki na komórkę. Tak działa to u mnie na Nokii i powinno działać na każdym innym urządzeniu.

Dodatkową zaletą tego rozwiązania jest przenośność - Winamp zostawia swój plik konfiguracyjny na odtwarzaczu. Wystarczy jedna konfiguracja na dowolnym komputerze i wtedy na każdym innym skopiowanie plików (wraz z konwersją, zmianą nazw itd) to też jedno kliknięcie ;) (przepraszam, dwa).

Ale to opcja winampa jest zupełnie niewygodna jak dla mnie, a poza tym działa z moją empetrójką a z telefonem np już nie. Poza tym nikt z moich znajomych tej opcji użyć nie potrafi a tu jest prosto jednym kliknięciem. Nie każe nikomu używać i nie uważam się za lepszego programistę niż kolesie z nullsoftu;)

Ale Winamp ma opcję eksportu muzyki do przenośnych odtwarzaczy (wraz z automatyczną konwersją i masą innych opcji).