313 lines
8.5 KiB
C++
313 lines
8.5 KiB
C++
|
#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;
|
||
|
}
|