123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472 |
- #include "GracenoteApi.h"
- #include "api.h"
- #include "../winamp/api_decodefile.h"
- #include <bfc/error.h>
- #include <limits.h>
- #include <shlwapi.h>
- #include <strsafe.h>
- GracenoteApi::GracenoteApi()
- {
- cddbInitialized = false;
- playlistInitialized = false;
- pCDDBControl=0;
- }
- GracenoteApi::~GracenoteApi()
- {
- }
- void GracenoteApi::Close()
- {
- if (pCDDBControl)
- {
- pCDDBControl->Shutdown();
- pCDDBControl->Release();
- pCDDBControl=0;
- }
- }
- static void SetProxy(const wchar_t *proxy, ICddbOptions *options)
- {
- wchar_t user[1024]=L"";
- wchar_t pass[1024]=L"";
- wchar_t server[1024]=L"";
- int port=80;
- if (!_wcsnicmp(proxy,L"https:",6))
- port = 443;
- const wchar_t *skip = wcsstr(proxy, L"://");
- if (skip)
- proxy = skip+3;
- skip = wcsstr(proxy, L"@");
- if (skip)
- {
- const wchar_t *delimiter = wcsstr(proxy, L":");
- if (delimiter < skip)
- {
- StringCchCopyNW(user, 1024, proxy, delimiter-proxy);
- StringCchCopyNW(pass, 1024, delimiter+1, skip-(delimiter+1));
- proxy=skip+1;
- }
- else
- {
- StringCchCopyNW(user, 1024, proxy, skip-proxy);
- proxy=skip+1;
- }
- }
- skip = wcsstr(proxy, L":");
- if (skip)
- {
- StringCchCopyNW(server, 1024, proxy, skip-proxy);
- port = _wtoi(skip+1);
- }
- else
- StringCchCopyW(server, 1024, proxy);
- if (server[0])
- options->put_ProxyServer(server);
- if (port)
- options->put_ProxyServerPort(port);
- if (user[0])
- options->put_ProxyUserName(user);
- if (pass[0])
- options->put_ProxyPassword(pass);
- }
- static const GUID internetConfigGroupGUID =
- { 0xc0a565dc, 0xcfe, 0x405a, { 0xa2, 0x7c, 0x46, 0x8b, 0xc, 0x8a, 0x3a, 0x5c } };
- ICDDBControl2 *GracenoteApi::GetCDDB()
- {
- Nullsoft::Utility::AutoLock lock(cddbGuard);
- if (!cddbInitialized)
- {
- CoCreateInstance(__uuidof(CDDBNSWinampControl), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pCDDBControl);
- if (pCDDBControl == NULL)
- return 0;
- #if 1
-
- if (WASABI_API_LNG)
- {
- const wchar_t *langFolder = WASABI_API_LNG->GetLanguageFolder();
- if (langFolder)
- {
- WIN32_FIND_DATAW find;
- wchar_t mask[MAX_PATH] = {0}, maskLoc[16] = {0};
-
- if(WASABI_API_LNG->GetLanguageIdentifier(LANG_IDENT_STR))
- StringCchPrintfW(maskLoc, 16, L"CddbLang%s.dll", WASABI_API_LNG->GetLanguageIdentifier(LANG_LANG_CODE));
- PathCombineW(mask, langFolder, maskLoc);
- HANDLE hFind = FindFirstFileW(mask, &find);
-
- if (hFind == INVALID_HANDLE_VALUE)
- {
- PathCombineW(mask, langFolder, L"CddbLang*.dll");
- hFind = FindFirstFileW(mask, &find);
- }
- if (hFind != INVALID_HANDLE_VALUE)
- {
- ICddbUIPtr ui;
- ui.CreateInstance(__uuidof(CddbNSWinampUI));
- if (ui)
- {
- long val = 0;
- wchar_t cddb_lang_fn[MAX_PATH] = {0};
- PathCombineW(cddb_lang_fn, langFolder, find.cFileName);
-
- ui->SetUILanguage(0, cddb_lang_fn, &val);
-
- }
- }
- FindClose(hFind);
- }
- }
- #endif
-
-
-
- const wchar_t *appVersion = WASABI_API_APP->main_getVersionNumString();
-
-
-
-
-
- BSTR appVersionBSTR = SysAllocString(appVersion);
- HRESULT hr = pCDDBControl->SetClientInfo(L"4896768", L"C1519CAE91489E405BCA93531837F2BE", appVersionBSTR, L"regstring");
- SysFreeString(appVersionBSTR);
- if (FAILED(hr))
- return 0;
- long flags = CACHE_UPDATE_FUZZY | CACHE_DONT_WRITE_ANY | CACHE_NO_LOOKUP_MEDIA;
-
- ICddbOptionsPtr pOptions;
- hr = pCDDBControl->GetOptions(&pOptions);
- if (SUCCEEDED(hr))
- {
- wchar_t dataPath[MAX_PATH] = {0};
- PathCombineW(dataPath, WASABI_API_APP->path_getUserSettingsPath(), L"Plugins");
- CreateDirectoryW(dataPath, 0);
- PathAppendW(dataPath, L"Gracenote");
- CreateDirectoryW(dataPath, 0);
- hr = pOptions->put_LocalCachePath(dataPath);
-
-
-
-
-
- hr = pOptions->put_ProgressEvents(FALSE);
-
- hr = pOptions->put_LocalCacheFlags(flags);
- hr = pOptions->put_LocalCacheSize(128 * 1024);
- hr = pOptions->put_LocalCacheTimeout(5 * 365);
- hr = pOptions->put_TestSubmitMode(FALSE);
-
-
- hr = pOptions->put_ResourceModule(-1);
-
- const wchar_t *proxy = AGAVE_API_CONFIG->GetString(internetConfigGroupGUID, L"proxy", L"");
- if (proxy && proxy[0])
- SetProxy(proxy, pOptions);
-
- hr = pCDDBControl->SetOptions(pOptions);
- }
- hr = pCDDBControl->Initialize(0, (CDDBCacheFlags)flags);
-
- long pVal=0;
-
-
- hr = pCDDBControl->IsRegistered(FALSE, &pVal);
-
- if (!pVal)
- {
-
- ICddbUserInfoPtr pUser;
- hr = pCDDBControl->GetUserInfo(&pUser);
- if (pUser != NULL)
- {
- do
- {
- wchar_t strdata[129] = {0};
- size_t size = sizeof(strdata)/sizeof(*strdata);
- wchar_t *str = strdata;
- GUID uid = GUID_NULL;
- int x;
- unsigned char *p;
- CoCreateGuid(&uid);
- p = (unsigned char *) & uid;
-
- StringCchCopyExW(str, size, L"WA5_", &str, &size, 0);
- for (x = 0; x < sizeof(uid); x ++)
- {
- StringCchPrintfExW(str, size, &str, &size, 0, L"%02X", p[x]);
-
- }
-
- hr = pUser->put_UserHandle(strdata);
- hr = pUser->put_Password(strdata);
- hr = pCDDBControl->SetUserInfo(pUser);
- }
- while (hr == CDDBSVCHandleUsed);
- }
-
- hr = pCDDBControl->IsRegistered(FALSE, &pVal);
- }
- cddbInitialized = true;
- }
- if (pCDDBControl)
- pCDDBControl->AddRef();
- return pCDDBControl;
- }
- #if 0
- ICddbPlaylist25Mgr *GracenoteApi::GetPlaylistManager()
- {
- ICddbPlaylist25Mgr *playlistMgr;
- ICDDBControl2 *cddb = GetCDDB();
- if (!cddb)
- return 0;
- CoCreateInstance(__uuidof(CddbNSWinampPlaylist2Mgr), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&playlistMgr);
- if (playlistMgr)
- {
- playlistMgr->AddRef();
- wchar_t dataPath[MAX_PATH] = {0};
- PathCombineW(dataPath, WASABI_API_APP->path_getUserSettingsPath(), L"Plugins");
- CreateDirectoryW(dataPath, 0);
- PathAppendW(dataPath, L"Gracenote");
- CreateDirectoryW(dataPath, 0);
- if (SUCCEEDED(playlistMgr->Initialize(cddb, dataPath)))
- {
- playlistMgr->DownloadCorrelates(0);
- playlistInitialized = true;
- }
- else
- {
- playlistMgr->Release();
- playlistMgr=0;
- }
- }
- cddb->Release();
- return playlistMgr;
- }
- #endif
- BSTR SetAndCreatePath(const wchar_t *node)
- {
- wchar_t path_to_create[MAX_PATH] = {0};
-
- BSTR bPath = 0;
-
- PathCombineW(path_to_create, WASABI_API_APP->path_getUserSettingsPath(), L"Plugins");
- CreateDirectoryW(path_to_create, 0);
- PathAppendW(path_to_create, node);
- CreateDirectoryW(path_to_create, 0);
- bPath = SysAllocString(path_to_create);
-
- return bPath;
- }
- int GracenoteApi::GetPlaylistManager(ICddbPlaylist25Mgr **playlistMgr, ICddbMLDBManager **mldbMgr)
- {
- ICddbPlaylist25Mgr *playlistMgrCreated;
- ICddbMLDBManager *mldbMgrCreated;
- ICDDBControl2 *cddb = GetCDDB();
- if (!cddb)
- return 0;
-
- CoCreateInstance(__uuidof(CddbMLDBManager), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&mldbMgrCreated);
- if (mldbMgrCreated)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- long autoFlags = PL_MLDB_AUTO_REINDEX | PL_MLDB_AUTO_BACKUP | PL_MLDB_AUTO_MANAGE_INIT_FLAG | PL_MLDB_AUTO_CHECK_IF_INIT_SET;
- BSTR bDataPath = SetAndCreatePath(L"Gracenote");
- BSTR bBackupPath = SetAndCreatePath(L"Gracenote/Backup");
-
- mldbMgrCreated->AddRef();
- mldbMgrCreated->SetOptions(autoFlags, bBackupPath);
- CoCreateInstance(__uuidof(CddbNSWinampPlaylist2Mgr), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&playlistMgrCreated);
- if (playlistMgrCreated)
- {
- playlistMgrCreated->AddRef();
-
- mldbMgrCreated->Attach(playlistMgrCreated);
- if (SUCCEEDED(playlistMgrCreated->Initialize(cddb, bDataPath)))
- {
- playlistMgrCreated->DownloadCorrelates(0);
- playlistInitialized = true;
- }
- else
- {
- playlistMgrCreated->Release();
- playlistMgrCreated=0;
- }
- }
- SysFreeString(bDataPath);
- SysFreeString(bBackupPath);
- }
- cddb->Release();
-
- *mldbMgr = mldbMgrCreated;
- *playlistMgr = playlistMgrCreated;
-
- if (mldbMgr && playlistMgr)
- return NErr_Success;
- else
- return NErr_FailedCreate;
- }
- ICddbMLDBManager *GracenoteApi::GetMLDBManager()
- {
- ICddbMLDBManager *mldbMgr;
- ICDDBControl2 *cddb = GetCDDB();
- if (!cddb)
- return 0;
- CoCreateInstance(__uuidof(CddbMLDBManager), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&mldbMgr);
- if (mldbMgr)
- {
- mldbMgr->AddRef();
- }
- cddb->Release();
- return mldbMgr;
- }
- HRESULT GracenoteApi::CreateFingerprint(ICDDBMusicIDManager *musicID, api_decodefile *decodeApi, ICddbFileInfo *info, const wchar_t *filename, long *killswitch)
- {
- if (!musicID || !decodeApi)
- return E_FAIL;
- ICddbMusicIDFingerprinterPtr fingerprinter;
- musicID->CreateFingerprinter(NULL, &fingerprinter);
- AudioParameters parameters;
- parameters.bitsPerSample = 16;
- parameters.channels = 2;
- parameters.sampleRate = 44100;
- ifc_audiostream *decoder = decodeApi->OpenAudioBackground(filename, ¶meters);
- if (decoder)
- {
- HRESULT hr = fingerprinter->BeginAudioStream((long)parameters.sampleRate, (long)parameters.bitsPerSample, (long)parameters.channels);
- char data[65536] = {0};
- size_t decodeSize;
- int decode_killswitch=0, decode_error;
- while (decodeSize = decoder->ReadAudio((void *)data, sizeof(data), &decode_killswitch, &decode_error))
- {
- if (decodeSize > LONG_MAX)
- break;
- if (*killswitch)
- break;
- hr = fingerprinter->WriteAudioData(data, (long)decodeSize);
- if (hr == CDDBMusicID_FPAcquired)
- break;
- }
- ICddbMusicIDFingerprintPtr fingerprint;
- fingerprinter->EndAudioStream(&fingerprint);
- decodeApi->CloseAudio(decoder);
- hr=info->put_Fingerprint(fingerprint);
- return S_OK;
- }
- return E_FAIL;
- }
- ICDDBMusicIDManager3 *GracenoteApi::GetMusicID()
- {
- ICDDBControl2 *cddb = GetCDDB();
- if (!cddb)
- return 0;
- ICDDBMusicIDManager3 *musicID;
- CoCreateInstance(__uuidof(CDDBNSWinampMusicIDManager), 0, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&musicID);
- if (musicID)
- musicID->Initialize(cddb);
- cddb->Release();
- return musicID;
- }
- #define CBCLASS GracenoteApi
- START_DISPATCH;
- CB(API_GRACENOTE_GETCDDB, GetCDDB)
- CB(API_GRACENOTE_GETMUSICID, GetMusicID)
- CB(API_GRACENOTE_GETPLAYLISTMGR, GetPlaylistManager)
- CB(API_GRACENOTE_GETMLDBMGR, GetMLDBManager)
- CB(API_GRACENOTE_CREATEFINGERPRINT, CreateFingerprint)
- END_DISPATCH;
- #undef CBCLASS
|