diff options
Diffstat (limited to 'Src/Winamp/WinampPlaylist.cpp')
-rw-r--r-- | Src/Winamp/WinampPlaylist.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/Src/Winamp/WinampPlaylist.cpp b/Src/Winamp/WinampPlaylist.cpp new file mode 100644 index 00000000..fa93c618 --- /dev/null +++ b/Src/Winamp/WinampPlaylist.cpp @@ -0,0 +1,228 @@ +#include "main.h" +#include "WinampPlaylist.h" +#include "../nu/AutoChar.h" +#include "../nu/AutoWide.h" +#include "api.h" + +WinampDirectoryLoad::WinampDirectoryLoad( bool _forceRecurse, char *_exts ) : forceRecurse( _forceRecurse ), exts( _exts ), needsFree( false ), listStart( 0 ) +{ + listStart = PlayList_getlength(); + if ( !exts ) + { + exts = in_getextlist(); + needsFree = false; + } +} + +WinampDirectoryLoad::~WinampDirectoryLoad() +{ + if ( config_rofiob & 1 ) + PlayList_sort( 2, listStart ); + + if ( needsFree ) + GlobalFree( (HGLOBAL)exts ); +} + +WinampPlaylist::WinampPlaylist( const wchar_t *_base, bool _loadDirectories ) : base( _base ), terminateOnEnd( false ), loadDirectories( _loadDirectories ) +{} + +bool WhitelistOK( wchar_t *url ) +{ + bool validurl = false; + wchar_t *p = url; + // Whitelist the url... + if ( *p == L'a' ) p++; // get passed the ad-fullscreen blob. + if ( *p ) + { + wchar_t *whitelist; + whitelist = wcsstr( p, L"http://www.winamp.com/" ); + if ( whitelist && whitelist == p ) + { + validurl = true; + } + + if ( validurl == false ) // Check for javscript command + { + whitelist = wcsstr( p, L"javascript:onCommand(" ); + if ( whitelist && whitelist == p ) + { + wchar_t *semi = wcsstr( whitelist, L";" ); + if ( semi ) + { + semi++; + if ( *semi ) + *semi = 0; + } + + validurl = true; + } + + } + } + + return validurl; +} + +WinampPlaylist::~WinampPlaylist() +{ + //if ( terminateOnEnd ) + //{ + //} +} + +void WinampPlaylist::OnFile(const wchar_t *filename, const wchar_t *title, int lengthInMs, ifc_plentryinfo *info) +{ + BOOL hidden = false; + int playcount = 0; + unsigned long starttime = 0, endtime = 0; + wchar_t fcurtain[FILENAME_SIZE] = L""; + wchar_t fileExt[ 10 ] = L""; + //wchar_t fbrowser[FILENAME_SIZE] = L""; + + if (LoadPlaylist(filename, 1, 0) == 0) //(playlistManager->Load(filename, this) == PLAYLISTMANAGER_SUCCESS) // if it's another playlist file, load recursively + return ; + + // check for trailing backslash + /* + if (filename[lstrlenW(filename)] == '\\') + { + WinampDirectoryLoad dir(true); + playlistManager->LoadDirectory(filename, this, &dir); + return; + } + */ + + // see if it's a directory + if ( loadDirectories && !PathIsURLW( filename ) && !PathIsNetworkPathW( filename ) ) + { + HANDLE h; + WIN32_FIND_DATAW d; + + h = FindFirstFileW( filename, &d ); + if ( h != INVALID_HANDLE_VALUE ) + { + FindClose( h ); + if ( d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + { + WinampDirectoryLoad dir( true ); + playlistManager->LoadDirectory( filename, this, &dir ); + return; + } + } + } + + if (info) + { + const wchar_t *ext = 0; + ext = info->GetExtendedInfo(L"Repeat"); + if (ext) playcount = _wtoi(ext); + + ext = info->GetExtendedInfo(L"Start"); + if (ext) starttime = _wtoi(ext); + + ext = info->GetExtendedInfo(L"End"); + if (ext) endtime = _wtoi(ext); + + ext = info->GetExtendedInfo(L"Hidden"); + if (ext) + hidden = _wtoi(ext); + else + { + ext = info->GetExtendedInfo(L"Context"); + if (ext) + { + if (!lstrcmpiW(ext, L"radio")) + { + hidden = true; + terminateOnEnd = true; + } + } + } + + ext = info->GetExtendedInfo(L"Curtain"); + if (ext) + { + StringCchCopyW(fcurtain, FILENAME_SIZE, ext); + if (!WhitelistOK(fcurtain)) + fcurtain[0] = 0; + } + + ext = info->GetExtendedInfo( L"ext" ); + if ( ext ) + { + StringCchCopyW( fileExt, 10, ext ); + } + /* + ext = info->GetExtendedInfo(L"Browser"); + if (ext) + { + StringCchCopyW(fbrowser, FILENAME_SIZE, ext); + if (!WhitelistOK(fbrowser)) + fbrowser[0] = 0; + } + */ + } + + if ( lengthInMs != -1 ) + lengthInMs /= 1000; + + if ( !hidden ) + { + PlayList_append_withinfo_curtain( filename, title, lengthInMs, fcurtain[ 0 ] ? AutoChar( fcurtain ) : 0, fileExt, 0 ); + } + else + { + PlayList_append_withinfo_hidden( filename, title, lengthInMs, fcurtain[ 0 ] ? AutoChar( fcurtain ) : 0/*, fbrowser[0] ? AutoChar(fbrowser) : 0*/ ); + } + + PlayList_SetLastItem_RepeatCount(playcount); + PlayList_SetLastItem_Range(starttime, endtime); +} + +const wchar_t *WinampPlaylist::GetBasePath() +{ + return base; +} + +bool WinampDirectoryLoad::ShouldRecurse(const wchar_t *path) +{ + if (config_rofiob&1) + PlayList_sort(2, listStart); + + listStart = PlayList_getlength(); + + if (forceRecurse) + return true; + else + return (config_rofiob&2) ? false : true; +} + +bool WinampDirectoryLoad::ShouldLoad(const wchar_t *filename) +{ + if (!exts) + return true; + const wchar_t *ext = extensionW(filename); + char *a = exts; + while (a && *a) + { + if (!_wcsicmp(AutoWide(a), ext)) + return true; + a += lstrlenA(a) + 1; + } + return false; + +} + +#define CBCLASS WinampPlaylist +START_DISPATCH; +VCB(IFC_PLAYLISTLOADERCALLBACK_ONFILE, OnFile) +CB(IFC_PLAYLISTLOADERCALLBACK_GETBASEPATH, GetBasePath) +END_DISPATCH; + +#undef CBCLASS +#define CBCLASS WinampDirectoryLoad +START_DISPATCH; +CB(IFC_PLAYLISTDIRECTORYCALLBACK_SHOULDRECURSE, ShouldRecurse) +CB(IFC_PLAYLISTDIRECTORYCALLBACK_SHOULDLOAD, ShouldLoad) +END_DISPATCH; +#undef CBCLASS |