Я пытаюсь получить общую продолжительность плейлиста youtube с использованием данных youtube api. Я загружаю ответ от, например, http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958, и моя идея состоит в том, чтобы перебирать каждый из <yt:duration='xxx'/>
событий, где xxx
- это продолжительность видео в секундах и суммировать их, чтобы получить общее время воспроизведения плейлиста.Совпадение нескольких групп с CAtlRegExp
Для получения каждого я использовать CAtlRegExp
со следующей строкой:
<yt:duration seconds='{[0-9]+}'/>
однако это соответствует только первое вхождение, а не какой-либо из остальных (со ссылкой на исходный код вставленного ниже, только итерации цикла один раз).
Я пробовал некоторые другие строки регулярных выражений, как
(<yt:duration seconds='{[0-9]+}'/>)
(<yt:duration seconds='{[0-9]+}'/>)*
однако они не работают либо (по той же причине).
Вот отрывок из исходного кода, где только для цикла итерацию один раз, потому что mcDuration.m_uNumGroups
равна 1
:
//get video duration
CAtlRegExp<> reDurationFinder;
CAtlREMatchContext<> mcDuration;
REParseError status = reDurationFinder.Parse(_T("<yt:duration seconds='{[0-9]+}'/>"));
if (status != REPARSE_ERROR_OK)
{
// Unexpected error.
return false;
}
if (!reDurationFinder.Match(sFeed, &mcDuration)) //i checked it with debug, sFeed contains full response from youtube data api
{
//cannot find video url
return false;
}
m_nLengthInSeconds = 0;
for (UINT nGroupIndex = 0; nGroupIndex < mcDuration.m_uNumGroups; ++nGroupIndex)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcDuration.GetMatch(nGroupIndex, &szStart, &szEnd);
ptrdiff_t nLength = szEnd - szStart;
m_nLengthInSeconds += _ttoi(CString(szStart, nLength));
}
Как я могу сделать CAtlRegExp
матч все из вхождений <yt:duration ...
?