From d14349242cc5e17af068a415f6893e58f3983628 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Thu, 4 Feb 2010 15:49:17 +0000 Subject: http plugin: added automatic charset detection git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1545 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Transports/http/CMakeLists.txt | 15 ++- src/plugins/Transports/http/downloader.cpp | 47 ++++++-- src/plugins/Transports/http/downloader.h | 9 +- src/plugins/Transports/http/http.pro | 5 + src/plugins/Transports/http/settingsdialog.cpp | 20 ++++ src/plugins/Transports/http/settingsdialog.ui | 128 +++++++++++++++------ .../Transports/http/translations/http_plugin_cs.ts | 29 +++-- .../Transports/http/translations/http_plugin_de.ts | 29 +++-- .../Transports/http/translations/http_plugin_it.ts | 29 +++-- .../Transports/http/translations/http_plugin_lt.ts | 29 +++-- .../Transports/http/translations/http_plugin_pl.ts | 27 ++++- .../Transports/http/translations/http_plugin_ru.ts | 29 +++-- .../Transports/http/translations/http_plugin_tr.ts | 27 ++++- .../http/translations/http_plugin_uk_UA.ts | 29 +++-- .../http/translations/http_plugin_zh_CN.ts | 29 +++-- .../http/translations/http_plugin_zh_TW.ts | 29 +++-- 16 files changed, 391 insertions(+), 119 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/Transports/http/CMakeLists.txt b/src/plugins/Transports/http/CMakeLists.txt index 60d623866..f1f103c93 100644 --- a/src/plugins/Transports/http/CMakeLists.txt +++ b/src/plugins/Transports/http/CMakeLists.txt @@ -31,6 +31,13 @@ pkg_search_module(CURL libcurl) include_directories(${CURL_INCLUDE_DIRS}) link_directories(${CURL_LIBRARY_DIRS}) +# libenca +IF(USE_ENCA AND ENCA_FOUND) +ADD_DEFINITIONS(-DWITH_ENCA) +include_directories(${ENCA_INCLUDE_DIRS}) +link_directories(${ENCA_LIBRARY_DIRS}) +ENDIF(USE_ENCA AND ENCA_FOUND) + SET(libhttp_SRCS streamreader.cpp downloader.cpp @@ -67,7 +74,13 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) IF(CURL_FOUND) ADD_LIBRARY(http MODULE ${libhttp_SRCS} ${libhttp_MOC_SRCS} ${libhttp_UIS_H} ${libhttp_RCC_SRCS}) -add_dependencies(http qmmp) + +IF(USE_ENCA AND ENCA_FOUND) +target_link_libraries(http ${QT_LIBRARIES} -lqmmp ${CURL_LDFLAGS} ${CURL_CFLAGS} ${ENCA_LDFLAGS} ${ENCA_CFLAGS}) +ELSE(USE_ENCA AND ENCA_FOUND) target_link_libraries(http ${QT_LIBRARIES} -lqmmp ${CURL_LDFLAGS} ${CURL_CFLAGS}) +ENDIF(USE_ENCA AND ENCA_FOUND) + +add_dependencies(http qmmp) install(TARGETS http DESTINATION ${LIB_DIR}/qmmp/Transports) ENDIF(CURL_FOUND) diff --git a/src/plugins/Transports/http/downloader.cpp b/src/plugins/Transports/http/downloader.cpp index e2bfbe252..ff1f3b3c1 100644 --- a/src/plugins/Transports/http/downloader.cpp +++ b/src/plugins/Transports/http/downloader.cpp @@ -119,10 +119,17 @@ Downloader::Downloader(QObject *parent, const QString &url) m_metacount = 0; m_meta_sent = FALSE; QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - m_codec = QTextCodec::codecForName(settings.value("HTTP/icy_encoding","windows-1252").toByteArray ()); - m_buffer_size = settings.value("HTTP/buffer_size",128).toInt() * 1000; + settings.beginGroup("HTTP"); + m_codec = QTextCodec::codecForName(settings.value("icy_encoding","windows-1252").toByteArray ()); + m_buffer_size = settings.value("buffer_size",128).toInt() * 1000; if (!m_codec) m_codec = QTextCodec::codecForName ("UTF-8"); +#ifdef WITH_ENCA + m_analyser = 0; + if(settings.value("use_enca", FALSE).toBool()) + m_analyser = enca_analyser_alloc(settings.value("enca_lang").toByteArray ().constData()); +#endif + settings.endGroup(); } @@ -136,6 +143,10 @@ Downloader::~Downloader() free(m_stream.buf); m_stream.buf = 0; +#ifdef WITH_ENCA + if(m_analyser) + enca_analyser_free(m_analyser); +#endif } @@ -224,10 +235,7 @@ void Downloader::run() //proxy if (QmmpSettings::instance()->isProxyEnabled()) curl_easy_setopt(m_handle, CURLOPT_PROXY, - strdup((QmmpSettings::instance()->proxy().host() + ":" + - QString("%1").arg(QmmpSettings::instance()->proxy().port())). - toLatin1 ().constData ())); - + strdup((QmmpSettings::instance()->proxy().toString().toLatin1().constData()))); if (QmmpSettings::instance()->useProxyAuth()) curl_easy_setopt(m_handle, CURLOPT_PROXYUSERPWD, strdup((QmmpSettings::instance()->proxy().userName() + ":" + @@ -343,17 +351,34 @@ void Downloader::readICYMetaData() qApp->processEvents(); m_mutex.lock(); } - readBuffer(packet, size); + qint64 l = readBuffer(packet, size); qDebug("Downloader: ICY metadata: %s", packet); - parseICYMetaData(packet); + parseICYMetaData(packet, l); } m_mutex.unlock(); } -void Downloader::parseICYMetaData(char *data) -{ - QString str = m_codec->toUnicode(data).trimmed(); +void Downloader::parseICYMetaData(char *data, qint64 size) +{ + if(!size) + return; + QTextCodec *codec = m_codec; +#ifdef WITH_ENCA + if(m_analyser) + { + EncaEncoding encoding = enca_analyse(m_analyser, (uchar *) data, size); + if(encoding.charset != ENCA_CS_UNKNOWN) + { + codec = QTextCodec::codecForName(enca_charset_name(encoding.charset,ENCA_NAME_STYLE_ENCA)); + qDebug("Downloader: detected charset: %s", + enca_charset_name(encoding.charset,ENCA_NAME_STYLE_ENCA)); + if(!codec) + codec = m_codec; + } + } +#endif + QString str = codec->toUnicode(data).trimmed(); QStringList list(str.split(";", QString::SkipEmptyParts)); foreach(QString line, list) { diff --git a/src/plugins/Transports/http/downloader.h b/src/plugins/Transports/http/downloader.h index 66855b0f5..5688fee00 100644 --- a/src/plugins/Transports/http/downloader.h +++ b/src/plugins/Transports/http/downloader.h @@ -25,7 +25,9 @@ #include #include #include - +#ifdef WITH_ENCA +#include +#endif class QTextCodec; /*! @internal @@ -68,7 +70,7 @@ signals: private: qint64 readBuffer(char* data, qint64 maxlen); void readICYMetaData(); - void parseICYMetaData(char *data); + void parseICYMetaData(char *data, qint64 size); CURL *m_handle; QMutex m_mutex; Stream m_stream; @@ -79,6 +81,9 @@ private: bool m_meta_sent; long m_buffer_size; QTextCodec *m_codec; +#ifdef WITH_ENCA + EncaAnalyser m_analyser; +#endif protected: void run(); diff --git a/src/plugins/Transports/http/http.pro b/src/plugins/Transports/http/http.pro index 35c08883c..cab1906e1 100644 --- a/src/plugins/Transports/http/http.pro +++ b/src/plugins/Transports/http/http.pro @@ -27,6 +27,11 @@ unix { isEmpty(LIB_DIR):LIB_DIR = /lib target.path = $$LIB_DIR/qmmp/Transports INSTALLS += target + contains(CONFIG, WITH_ENCA){ + CONFIG += link_pkgconfig + PKGCONFIG += enca + DEFINES += WITH_ENCA + } } win32 { QMAKE_LIBDIR += ../../../../bin diff --git a/src/plugins/Transports/http/settingsdialog.cpp b/src/plugins/Transports/http/settingsdialog.cpp index 0b4636ead..390d2845b 100644 --- a/src/plugins/Transports/http/settingsdialog.cpp +++ b/src/plugins/Transports/http/settingsdialog.cpp @@ -20,6 +20,9 @@ #include #include #include +#ifdef WITH_ENCA +#include +#endif #include "settingsdialog.h" SettingsDialog::SettingsDialog(QWidget *parent) @@ -30,11 +33,24 @@ SettingsDialog::SettingsDialog(QWidget *parent) findCodecs(); foreach (QTextCodec *codec, codecs) ui.icyEncodingComboBox->addItem(codec->name()); +#ifdef WITH_ENCA + size_t n = 0; + const char **langs = enca_get_languages(&n); + for (size_t i = 0; i < n; ++i) + ui.encaAnalyserComboBox->addItem(langs[i]); +#endif QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("HTTP"); int pos = ui.icyEncodingComboBox->findText(settings.value("icy_encoding","windows-1252").toString()); ui.icyEncodingComboBox->setCurrentIndex(pos); ui.bufferSizeSpinBox->setValue(settings.value("buffer_size",128).toInt()); +#ifdef WITH_ENCA + ui.autoCharsetCheckBox->setChecked(settings.value("use_enca", FALSE).toBool()); + pos = ui.encaAnalyserComboBox->findText(settings.value("enca_lang", langs[n-1]).toString()); + ui.encaAnalyserComboBox->setCurrentIndex(pos); +#else + ui.autoCharsetCheckBox->setEnabled(FALSE); +#endif settings.endGroup(); } @@ -48,6 +64,10 @@ void SettingsDialog::accept() settings.beginGroup("HTTP"); settings.setValue("icy_encoding", ui.icyEncodingComboBox->currentText()); settings.setValue("buffer_size", ui.bufferSizeSpinBox->value()); +#ifdef WITH_ENCA + settings.setValue("use_enca", ui.autoCharsetCheckBox->isChecked()); + settings.setValue("enca_lang", ui.encaAnalyserComboBox->currentText()); +#endif settings.endGroup(); QDialog::accept(); } diff --git a/src/plugins/Transports/http/settingsdialog.ui b/src/plugins/Transports/http/settingsdialog.ui index 28b990432..c90c89ef4 100644 --- a/src/plugins/Transports/http/settingsdialog.ui +++ b/src/plugins/Transports/http/settingsdialog.ui @@ -6,14 +6,14 @@ 0 0 - 235 - 91 + 218 + 179 HTTP Plugin Settings - + 6 @@ -23,33 +23,7 @@ 6 - - - - - 0 - 0 - - - - Metadata encoding: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - + Buffer size: @@ -59,7 +33,7 @@ - + @@ -78,7 +52,7 @@ - + @@ -91,14 +65,78 @@ - + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + Metadata encoding + + + + + + Automatic charset detection + + + + + + + true + + + Language: + + + + + + + false + + + + + + + + 0 + 0 + + + + Default encoding: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + + + + label_17_2_2 + bufferSizeSpinBox + label + buttonBox + groupBox @@ -109,8 +147,8 @@ reject() - 168 - 84 + 222 + 172 70 @@ -125,8 +163,8 @@ accept() - 219 - 73 + 222 + 172 61 @@ -134,5 +172,21 @@ + + autoCharsetCheckBox + toggled(bool) + encaAnalyserComboBox + setEnabled(bool) + + + 59 + 67 + + + 143 + 90 + + + diff --git a/src/plugins/Transports/http/translations/http_plugin_cs.ts b/src/plugins/Transports/http/translations/http_plugin_cs.ts index dfafe14e0..b3fdcc204 100644 --- a/src/plugins/Transports/http/translations/http_plugin_cs.ts +++ b/src/plugins/Transports/http/translations/http_plugin_cs.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB KB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_de.ts b/src/plugins/Transports/http/translations/http_plugin_de.ts index 87b87a8d2..32bb7910f 100644 --- a/src/plugins/Transports/http/translations/http_plugin_de.ts +++ b/src/plugins/Transports/http/translations/http_plugin_de.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB KB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_it.ts b/src/plugins/Transports/http/translations/http_plugin_it.ts index f0ce642d8..ca89649ab 100644 --- a/src/plugins/Transports/http/translations/http_plugin_it.ts +++ b/src/plugins/Transports/http/translations/http_plugin_it.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB KB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_lt.ts b/src/plugins/Transports/http/translations/http_plugin_lt.ts index cd18830a1..41551e5bf 100644 --- a/src/plugins/Transports/http/translations/http_plugin_lt.ts +++ b/src/plugins/Transports/http/translations/http_plugin_lt.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB КB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_pl.ts b/src/plugins/Transports/http/translations/http_plugin_pl.ts index cc175d58a..81119a4c2 100644 --- a/src/plugins/Transports/http/translations/http_plugin_pl.ts +++ b/src/plugins/Transports/http/translations/http_plugin_pl.ts @@ -37,18 +37,33 @@ - - Metadata encoding: + + Buffer size: - - Buffer size: + + KB - - KB + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: diff --git a/src/plugins/Transports/http/translations/http_plugin_ru.ts b/src/plugins/Transports/http/translations/http_plugin_ru.ts index a3d39ee02..67a4e516d 100644 --- a/src/plugins/Transports/http/translations/http_plugin_ru.ts +++ b/src/plugins/Transports/http/translations/http_plugin_ru.ts @@ -37,19 +37,34 @@ Настройки модуля HTTP - - Metadata encoding: - Кодировка метаинформации: - - - + Buffer size: Размер буфера: - + KB КБ + + + Metadata encoding + Кодировка мета-информации + + + + Automatic charset detection + Автоматическое определение кодировки + + + + Language: + Язык: + + + + Default encoding: + Кодировка по умолчанию: + diff --git a/src/plugins/Transports/http/translations/http_plugin_tr.ts b/src/plugins/Transports/http/translations/http_plugin_tr.ts index e1022f9a5..017d9bda2 100644 --- a/src/plugins/Transports/http/translations/http_plugin_tr.ts +++ b/src/plugins/Transports/http/translations/http_plugin_tr.ts @@ -37,18 +37,33 @@ - - Metadata encoding: + + Buffer size: - - Buffer size: + + KB - - KB + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: diff --git a/src/plugins/Transports/http/translations/http_plugin_uk_UA.ts b/src/plugins/Transports/http/translations/http_plugin_uk_UA.ts index e0c7800bc..b27103148 100644 --- a/src/plugins/Transports/http/translations/http_plugin_uk_UA.ts +++ b/src/plugins/Transports/http/translations/http_plugin_uk_UA.ts @@ -37,19 +37,34 @@ Налаштування модуля HTTP - - Metadata encoding: - Кодування метаданих: - - - + Buffer size: Розмір буфера: - + KB Кб + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_zh_CN.ts b/src/plugins/Transports/http/translations/http_plugin_zh_CN.ts index 84b2a35c5..2fd1286b2 100644 --- a/src/plugins/Transports/http/translations/http_plugin_zh_CN.ts +++ b/src/plugins/Transports/http/translations/http_plugin_zh_CN.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB KB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + diff --git a/src/plugins/Transports/http/translations/http_plugin_zh_TW.ts b/src/plugins/Transports/http/translations/http_plugin_zh_TW.ts index e5455e903..4a63abd4c 100644 --- a/src/plugins/Transports/http/translations/http_plugin_zh_TW.ts +++ b/src/plugins/Transports/http/translations/http_plugin_zh_TW.ts @@ -37,19 +37,34 @@ - - Metadata encoding: - - - - + Buffer size: - + KB KB + + + Metadata encoding + + + + + Automatic charset detection + + + + + Language: + + + + + Default encoding: + + -- cgit v1.2.3-13-gbd6f