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.
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).