123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #include <shlobj.h>
- #include <shlwapi.h>
- #include <strsafe.h>
- #include "main.h"
- #include "CurrentPlaylist.h"
- #include "Playlist.h"
- #include "../winamp/wa_ipc.h"
- #include "../nu/AutoWide.h"
- #include "PlaylistDirectoryCallback.h"
- #include "api__ml_playlists.h"
- extern Playlist currentPlaylist;
- bool currentPlaylist_ImportFromDisk( HWND hwnd )
- {
- wchar_t oldCurPath[MAX_PATH] = {0};
- GetCurrentDirectoryW(MAX_PATH, oldCurPath);
- wchar_t temp[1024] = {0};
- wchar_t filter[1024] = {0};
- AGAVE_API_PLAYLISTMANAGER->GetFilterList(filter, 1024);
- OPENFILENAMEW l = {sizeof(l), };
- l.hwndOwner = hwnd;
- l.lpstrFilter = filter;
- l.lpstrFile = temp;
- l.nMaxFile = 1023;
- l.lpstrTitle = WASABI_API_LNGSTRINGW(IDS_IMPORT_PLAYLIST);
- l.lpstrDefExt = L"m3u";
- l.lpstrInitialDir = WASABI_API_APP->path_getWorkingPath();
- l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER;
- bool ret = false;
- if ( GetOpenFileNameW( &l ) )
- {
- wchar_t newCurPath[ MAX_PATH ] = { 0 };
- GetCurrentDirectoryW( MAX_PATH, newCurPath );
- WASABI_API_APP->path_setWorkingPath( newCurPath );
- wchar_t titleStr[ 32 ] = { 0 };
- int w = currentPlaylist.GetNumItems() == 0 ? IDYES :
- MessageBox( hwnd, WASABI_API_LNGSTRINGW( IDS_APPEND_IMPORTED_PLAYLIST ),
- WASABI_API_LNGSTRINGW_BUF( IDS_LIBRARY_QUESTION, titleStr, 32 ),
- MB_YESNOCANCEL | MB_ICONQUESTION );
- if ( w != IDCANCEL )
- {
- if ( w == IDNO )
- currentPlaylist.Clear();
- AGAVE_API_PLAYLISTMANAGER->Load( temp, ¤tPlaylist );
- ret = true;
- }
- }
- SetCurrentDirectoryW( oldCurPath );
- return ret;
- }
- bool currentPlaylist_ImportFromWinamp( HWND hwnd )
- {
- wchar_t titleStr[ 32 ] = { 0 };
- int w = currentPlaylist.GetNumItems() == 0 ? IDNO :
- MessageBox( hwnd, WASABI_API_LNGSTRINGW( IDS_APPEND_ACTIVE_PLAYLIST ),
- WASABI_API_LNGSTRINGW_BUF( IDS_LIBRARY_QUESTION, titleStr, 32 ),
- MB_YESNOCANCEL | MB_ICONQUESTION );
- if ( w != IDCANCEL )
- {
- if ( w == IDNO )
- currentPlaylist.Clear();
- SendMessage( plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_WRITEPLAYLIST );
- wchar_t *m3udir = (wchar_t *)SendMessage( plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_GETM3UDIRECTORYW );
- wchar_t s[ MAX_PATH ] = { 0 };
- PathCombineW( s, m3udir, L"winamp.m3u8" );
- AGAVE_API_PLAYLISTMANAGER->Load( s, ¤tPlaylist );
- return true;
- }
- return false;
- }
- bool CurrentPlaylist_DeleteMissing()
- {
- bool ret = false;
- size_t x = currentPlaylist.GetNumItems();
- while ( x-- )
- {
- wchar_t fn[ 1024 ] = { 0 };
- currentPlaylist.GetItem( x, fn, 1024 );
- if ( !wcsstr( fn, L"://" ) && !wcsstr( fn, L":\\\\" ) && !( PathFileExistsW( fn ) ) )
- {
- currentPlaylist.Remove( x );
- ret = true;
- }
- }
- return ret;
- }
- void CurrentPlaylist_Export(HWND dlgparent)
- {
- wchar_t oldCurPath[MAX_PATH] = {0};
- GetCurrentDirectoryW(MAX_PATH, oldCurPath);
- wchar_t temp[MAX_PATH] = {0};
- OPENFILENAMEW l = {sizeof(OPENFILENAMEW), 0};
- lstrcpynW(temp, (wchar_t*)GetPropW(dlgparent, L"TITLE"), MAX_PATH);
- Playlists_ReplaceBadPathChars(temp);
- l.hwndOwner = dlgparent;
- l.hInstance = plugin.hDllInstance;
- l.nFilterIndex = g_config->ReadInt(L"filter", 3);
- l.lpstrFilter = (LPCWSTR)SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 3, IPC_GET_PLAYLIST_EXTLISTW);
- l.lpstrFile = temp;
- l.nMaxFile = MAX_PATH;
- l.lpstrTitle = WASABI_API_LNGSTRINGW(IDS_EXPORT_PLAYLIST);
- l.lpstrDefExt = L"m3u";
- l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT;
- if ( GetSaveFileNameW( &l ) )
- {
- wchar_t newCurPath[ MAX_PATH ] = { 0 };
- GetCurrentDirectoryW( MAX_PATH, newCurPath );
- WASABI_API_APP->path_setWorkingPath( newCurPath );
- AGAVE_API_PLAYLISTMANAGER->Save( temp, ¤tPlaylist );
- }
- g_config->WriteInt( L"filter", l.nFilterIndex );
- SetCurrentDirectoryW( oldCurPath );
- }
- bool CurrentPlaylist_AddLocation( HWND hwndDlg )
- {
- bool ret = false;
- char *p = (char *)SendMessage( plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)hwndDlg, IPC_OPENURLBOX );
- if ( p )
- {
- //size_t s = currentPlaylist.GetNumItems();
- AutoWide wideFn( p );
- if ( AGAVE_API_PLAYLISTMANAGER->Load( wideFn, ¤tPlaylist ) != PLAYLISTMANAGER_SUCCESS )
- {
- wchar_t title[ FILETITLE_SIZE ] = { 0 };
- int length = -1;
- mediaLibrary.GetFileInfo( wideFn, title, FILETITLE_SIZE, &length );
- currentPlaylist.AppendWithInfo( wideFn, title, length * 1000 );
- }
- ret = true;
- // TODO: if (GetPrivateProfileInt("winamp", "rofiob", 1, WINAMP_INI)&1) PlayList_sort(2, s);
- GlobalFree( (HGLOBAL)p );
- }
- return ret;
- }
- static INT_PTR CALLBACK browseCheckBoxProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- if ( uMsg == WM_INITDIALOG )
- {
- int rofiob = GetPrivateProfileIntA( "winamp", "rofiob", 1, mediaLibrary.GetWinampIni() );
- if ( !( rofiob & 2 ) )
- CheckDlgButton( hwndDlg, IDC_CHECK1, BST_CHECKED );
- }
- if ( uMsg == WM_COMMAND )
- {
- if ( LOWORD( wParam ) == IDC_CHECK1 )
- {
- int rofiob = GetPrivateProfileIntA( "winamp", "rofiob", 1, mediaLibrary.GetWinampIni() );
- if ( IsDlgButtonChecked( hwndDlg, IDC_CHECK1 ) )
- rofiob &= ~2;
- else
- rofiob |= 2;
- char blah[ 32 ] = { 0 };
- StringCchPrintfA( blah, 32, "%d", rofiob );
- WritePrivateProfileStringA( "winamp", "rofiob", blah, mediaLibrary.GetWinampIni() );
- }
- }
- return 0;
- }
- static int CALLBACK WINAPI BrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
- {
- switch ( uMsg )
- {
- case BFFM_INITIALIZED:
- {
- SetWindowTextW( hwnd, WASABI_API_LNGSTRINGW( IDS_ADD_DIR_TO_PLAYLIST ) );
- SendMessageW( hwnd, BFFM_SETSELECTIONW, 1, (LPARAM)WASABI_API_APP->path_getWorkingPath() );
- HWND h2 = FindWindowEx( hwnd, NULL, NULL, L"__foo2" );
- if ( h2 )
- ShowWindow( h2, SW_HIDE );
- HWND h = WASABI_API_CREATEDIALOGW( IDD_BROWSE_PLFLD, hwnd, browseCheckBoxProc );
- SetWindowPos( h, 0, 4, 4, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
- ShowWindow( h, SW_SHOWNA );
- // this is not nice but it fixes the selection not working correctly on all OSes
- EnumChildWindows( hwnd, browseEnumProc, 0 );
- }
- }
- return 0;
- }
- bool CurrentPlaylist_AddDirectory( HWND hwndDlg )
- {
- BROWSEINFOW bi = { 0 };
- wchar_t name[ MAX_PATH ] = { 0 };
- bi.hwndOwner = hwndDlg;
- bi.pidlRoot = 0;
- bi.pszDisplayName = name;
- bi.lpszTitle = L"__foo2";
- bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
- bi.lpfn = BrowseCallbackProc;
- bi.lParam = 0;
- ITEMIDLIST *idlist = SHBrowseForFolderW( &bi );
- if ( idlist )
- {
- //size_t s = currentPlaylist.GetNumItems();
- wchar_t path[ MAX_PATH ] = { 0 };
- SHGetPathFromIDListW( idlist, path );
- WASABI_API_APP->path_setWorkingPath( path );
- extern void Shell_Free( void *p );
- Shell_Free( idlist );
- WASABI_API_APP->path_setWorkingPath( path );
- PlaylistDirectoryCallback dirCallback( mediaLibrary.GetExtensionList(), mediaLibrary.GetWinampIni() );
- AGAVE_API_PLAYLISTMANAGER->LoadDirectory( path, ¤tPlaylist, &dirCallback );
- //int rofiob = GetPrivateProfileInt("winamp", "rofiob", 1, WINAMP_INI);
- // TODO: if (rofiob&1) PlayList_sort(2, s);
- return true;
- }
- return false;
- }
- bool CurrentPlaylist_AddFiles( HWND hwndDlg )
- {
- wchar_t oldCurPath[ MAX_PATH ] = { 0 };
- GetCurrentDirectoryW( MAX_PATH, oldCurPath );
- const int len = 256 * 1024 - 128;
- wchar_t *temp;
- OPENFILENAMEW l = { sizeof( l ), };
- static int q;
- if ( q )
- return false;
- q = 1;
- temp = (wchar_t *)GlobalAlloc( GPTR, sizeof( wchar_t ) * len );
- l.hwndOwner = hwndDlg;
- wchar_t *fsb = (wchar_t *)SendMessage( plugin.hwndWinampParent, WM_WA_IPC, 1, IPC_GET_EXTLISTW );
- l.lpstrFilter = fsb;
- l.lpstrFile = temp;
- l.nMaxFile = len - 1;
- l.lpstrTitle = WASABI_API_LNGSTRINGW( IDS_ADD_FILES_TO_PLAYLIST );
- l.lpstrDefExt = L"";
- l.lpstrInitialDir = WASABI_API_APP->path_getWorkingPath();
- l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ALLOWMULTISELECT;
- bool ret = false;
- if ( GetOpenFileNameW( &l ) )
- {
- wchar_t newCurPath[ MAX_PATH ] = { 0 };
- GetCurrentDirectoryW( MAX_PATH, newCurPath );
- WASABI_API_APP->path_setWorkingPath( newCurPath );
- if ( temp[ wcslen( temp ) + 1 ] )
- {
- AGAVE_API_PLAYLISTMANAGER->LoadFromDialog( temp, ¤tPlaylist );
- ret = true;
- // TODO: if (GetPrivateProfileInt("winamp", "rofiob", 1, WINAMP_INI)&1) PlayList_sort(2, sp);
- }
- else
- {
- if ( AGAVE_API_PLAYLISTMANAGER->Load( temp, ¤tPlaylist ) != PLAYLISTMANAGER_SUCCESS )
- {
- wchar_t title[ FILETITLE_SIZE ] = { 0 };
- int length;
- mediaLibrary.GetFileInfo( temp, title, FILETITLE_SIZE, &length );
- currentPlaylist.AppendWithInfo( temp, title, length * 1000 );
- ret = true;
- }
- }
- }
- SetCurrentDirectoryW( oldCurPath );
- GlobalFree( fsb );
- GlobalFree( temp );
- q = 0;
- return ret;
- }
|