aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/WinampPlaylist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/WinampPlaylist.cpp')
-rw-r--r--Src/Winamp/WinampPlaylist.cpp228
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