winamp/Src/Plugins/Library/ml_plg/pass2.cpp

73 lines
1.8 KiB
C++

#include "IDScanner.h"
#include "playlist.h"
#include <atlbase.h>
#include "main.h"
#include "api__ml_plg.h"
static ICddbFileInfoList *CreateScanList(volatile int *killswitch)
{
// benski> this function REALLY SUCKS but there's not much we can do about it unfortunately.
// because Gracenote's Playlist SDK doesn't give us a good way to run queries like this
ICddbPL2FindDataPtr pFindData;
ICddbDisc2Ptr pDisc;
if (FAILED(pFindData.CreateInstance(CLSID_CddbPL2FindData)))
return 0;
if (FAILED(playlistMgr->FindOpen(pFindData)))
return 0;
ICddbFileInfoListPtr infoList;
infoList.CreateInstance(CLSID_CddbFileInfoList);
while (SUCCEEDED(playlistMgr->FindNext(pFindData, &pDisc)))
{
if (*killswitch)
return 0;
CComBSTR path,filespec;
wchar_t file[MAX_PATH] = {0};
CComBSTR phase;
pDisc->GetProperty(PROP_Default, PLM_Filename, &filespec);
pDisc->GetProperty(PROP_Default, PLM_Pathname, &path);
PathCombineW(file, path, filespec);
playlistMgr->FileGetFieldVal(file, gnpl_crit_field_xdev1, &phase);
if (!phase || !phase[0] || phase[0]!='2')
continue;
ICddbFileInfoPtr info;
info.CreateInstance(CLSID_CddbFileInfo);
info->put_Filename(file);
infoList->AddFileInfo(info);
}
playlistMgr->FindClose(pFindData);
infoList->AddRef();
return infoList;
}
/*
Pass 2 Algorithm
Find all files with gnpl_crit_field_xdev1 == "2" and run them through MusicID
*/
void IDScanner::Pass2()
{
if (SetupMusicID())
{
ICddbFileInfoList *infoList = CreateScanList(&killswitch);
if (infoList)
{
musicID->LibraryID(infoList, MUSICID_RETURN_EXACT_ONLY | MUSICID_GET_FP_FROM_APP | MUSICID_GET_TAG_FROM_APP | MUSICID_PREFER_WF_MATCHES);
infoList->Release();
}
}
}
int IDScanner::Pass2OnThread(HANDLE handle, void *user_data, intptr_t id)
{
IDScanner *scanner = (IDScanner *)id;
scanner->Pass2();
return 0;
}