・smtubeの複数ページ検索
以前、こっちで指摘していた、 smtubeで日本語をキーワードに検索すると、2ページ目以降が表示されない件、 現実逃避で少し追いかけてみた。
Qt用のコードのデバッグをするのは久しぶりだったので、 あちこちにqDebug()を散りばめながら試行錯誤してみた感じ、どうやら、 YouTubeが返してくるキーワードを含めたURLの日本語の部分がすでに %encodeされているのを、smtubeから送り直す際に再度 %encode してしまうのが原因っぽい。
一応、smtubeの側でも、ytdataapi.cpp の中で、
for(int i = 0; i< links.count(); ++i) { if(links.item(i).toElement().attribute("rel") == "next") { formattedReply.nextUrl = unescape(links.item(i).toElement().attribute("href")); } }
みたいな処理はあって、YouTubeから帰ってくるデータの、 次のページへのURLはunescapeしているようなんだけど、そのunescape処理自体は、
QString YTDataAPI::unescape(QString html) { html.replace("&", "&"); html.replace("<", "<"); return html.replace(">", ">"); }
になっていて、非ASCIIな文字列が%encodeされてしまった場合は対応していない感じ。
どうするのがいいのかはよく分かってないのだけど、 QUrl::fromPercentEncoding()というのを通せば %encoding は戻せるようなので、 一応帰ってきた文字列中に"%"があれば QUrl::fromPercentEncoding()してから、 元のunescape処理を通すようにしてみた。
--- smtube-1.5/src/ytdataapi.cpp 2012-07-06 13:28:51.000000000 +0900 +++ build/src/ytdataapi.cpp 2013-01-14 17:45:07.000000000 +0900 @@ -129,6 +134,12 @@ void YTDataAPI::reset() QString YTDataAPI::unescape(QString html) + if (html.indexOf("%") > 0) { + QString decode_url; + decode_url = QUrl::fromPercentEncoding(html.toAscii()); + qDebug() << decode_url ; + html = decode_url; + } html.replace("&", "&"); html.replace("<", "<"); return html.replace(">", ">");
一応、手もとではこれぐらいの修正で、 2ページ目以降もたぐれるようになった感じ。
このパッチをあてた64ビット用のsmtubeをPlamo-test以下に置いてみたので、 興味ある人は試してみてください。