YouTube データ API を使用して、YouTube プレイリストの合計時間を取得しようとしています。たとえば、http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958<yt:duration='xxx'/>
から応答をダウンロードします。私の考えは、各ビデオの長さを秒単位で繰り返し、xxx
それらを合計して合計プレイリストを取得することですランタイム。
それぞれを取得するCAtlRegExp
には、次の文字列を使用します。
<yt:duration seconds='{[0-9]+}'/>
ただし、最初の出現のみに一致し、残りのいずれにも一致しません (以下に貼り付けられたソース コードを参照すると、ループは 1 回だけ繰り返されます)。
次のような他の正規表現文字列をいくつか試しました
(<yt:duration seconds='{[0-9]+}'/>)
(<yt:duration seconds='{[0-9]+}'/>)*
ただし、どちらも機能しませんでした(同じ理由)。
ソース コードからの抜粋を次に示します。ここでは、 が にmcDuration.m_uNumGroups
等しいため、 for ループは 1 回だけ繰り返され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 ...
ですか?