diary/Kojima

・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("&amp;", "&");
    html.replace("&lt;", "<");
    return html.replace("&gt;", ">");
}

になっていて、非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("&amp;", "&");
     html.replace("&lt;", "<");
     return html.replace("&gt;", ">");

一応、手もとではこれぐらいの修正で、 2ページ目以降もたぐれるようになった感じ。

このパッチをあてた64ビット用のsmtubeをPlamo-test以下に置いてみたので、 興味ある人は試してみてください。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42