std::wstring Plugin::Lang(const std::wstring &key, int part) { std::wstring ret; if (!m_muiService) return ret; IAIMPString *value = nullptr; if (part > -1) { if (SUCCEEDED(m_muiService->GetValuePart(AIMPString(key), part, &value))) { ret = value->GetData(); value->Release(); } } else { if (SUCCEEDED(m_muiService->GetValue(AIMPString(key), &value))) { ret = value->GetData(); value->Release(); } } return ret; }
void Plugin::ForSelectedTracks(std::function<int(IAIMPPlaylist *, IAIMPPlaylistItem *, int64_t)> callback) { if (!callback) return; if (IAIMPPlaylist *pl = GetCurrentPlaylist()) { pl->BeginUpdate(); std::set<IAIMPPlaylistItem *> to_del; auto delPending = [&] { for (auto x : to_del) { pl->Delete(x); x->Release(); } }; for (int i = 0, n = pl->GetItemCount(); i < n; ++i) { IAIMPPlaylistItem *item = nullptr; if (SUCCEEDED(pl->GetItem(i, IID_IAIMPPlaylistItem, reinterpret_cast<void **>(&item)))) { int isSelected = 0; if (SUCCEEDED(item->GetValueAsInt32(AIMP_PLAYLISTITEM_PROPID_SELECTED, &isSelected))) { if (isSelected) { IAIMPString *url = nullptr; if (SUCCEEDED(item->GetValueAsObject(AIMP_PLAYLISTITEM_PROPID_FILENAME, IID_IAIMPString, reinterpret_cast<void **>(&url)))) { int64_t id = Tools::TrackIdFromUrl(url->GetData()); url->Release(); int result = callback(pl, item, id); if (result & FLAG_DELETE_ITEM) { to_del.insert(item); if (result & FLAG_STOP_LOOP) { delPending(); pl->EndUpdate(); pl->Release(); return; } continue; } if (result & FLAG_STOP_LOOP) { delPending(); item->Release(); pl->EndUpdate(); pl->Release(); return; } } } } item->Release(); } } delPending(); pl->EndUpdate(); pl->Release(); } }
std::wstring Plugin::PlaylistId(IAIMPPlaylist *pl) { std::wstring playlistId; IAIMPPropertyList *plProp = nullptr; if (SUCCEEDED(pl->QueryInterface(IID_IAIMPPropertyList, reinterpret_cast<void **>(&plProp)))) { IAIMPString *id = nullptr; if (SUCCEEDED(plProp->GetValueAsObject(AIMP_PLAYLIST_PROPID_ID, IID_IAIMPString, reinterpret_cast<void **>(&id)))) { playlistId = id->GetData(); id->Release(); } plProp->Release(); } return playlistId; }
void Plugin::ForEveryItem(IAIMPPlaylist *pl, std::function<int(IAIMPPlaylistItem *, IAIMPFileInfo *, int64_t)> callback) { if (!pl || !callback) return; pl->BeginUpdate(); for (int i = 0, n = pl->GetItemCount(); i < n; ++i) { IAIMPPlaylistItem *item = nullptr; if (SUCCEEDED(pl->GetItem(i, IID_IAIMPPlaylistItem, reinterpret_cast<void **>(&item)))) { IAIMPFileInfo *finfo = nullptr; if (SUCCEEDED(item->GetValueAsObject(AIMP_PLAYLISTITEM_PROPID_FILEINFO, IID_IAIMPFileInfo, reinterpret_cast<void **>(&finfo)))) { IAIMPString *custom = nullptr; if (SUCCEEDED(finfo->GetValueAsObject(AIMP_FILEINFO_PROPID_FILENAME, IID_IAIMPString, reinterpret_cast<void **>(&custom)))) { std::wstring url(custom->GetData()); custom->Release(); int64_t id = Tools::TrackIdFromUrl(url); int result = callback(item, finfo, id); if (result & FLAG_DELETE_ITEM) { pl->Delete(item); finfo->Release(); item->Release(); i--; n--; if (result & FLAG_STOP_LOOP) { pl->EndUpdate(); return; } continue; } if (result & FLAG_STOP_LOOP) { finfo->Release(); item->Release(); pl->EndUpdate(); return; } } finfo->Release(); } item->Release(); } } pl->EndUpdate(); }