[[diary/Kojima]]
・smtubeの複数ページ検索
以前、[[こっち:http://plamo.linet.gr.jp/wiki/index.php?%C9%D4%B6%F1%B9%E7%CA%F3%B9%F0%2F5.0%20x86%2F5]]で指摘していた、
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以下に:ftp://plamo.linet.gr.jp/pub/Plamo-test/for-5.0/x86_64/smtube-1.5-x86_64-P2.txz]]置いてみたので、
興味ある人は試してみてください。
- 確認してないけど、このあたり、UTF8なら%encodeされずに通るんだろうか? -- [[kojima]] &new{2013-01-14 (月) 21:07:16};
- Pythonとかもそうだけど、最近の言語だと、自分のやりたい処理はたいてい汎用性を持った立派なライブラリとして実装されていて、それをいかに見つけて使い方を調べるかが作業時間の大半を占めちゃうんだよなぁ。もちろん、その手のコードを使う方が効率はいいし、バグも少なくなるのだけど、境界条件やらアルゴリズムの詳細を考える時間よりも、ライブラリを探し回る時間の方が長くなるのはちょっと寂しい。。 -- [[kojima]] &new{2013-01-15 (火) 01:13:17};
#comment