diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-03-14 20:57:51 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-03-14 20:57:51 +0000 |
| commit | 4f34d0dd9464fc47fd63e159316317ca0d078899 (patch) | |
| tree | 406b3c9630b1501b354a87ea304494c9f18efb7b /src/plugins/Input | |
| parent | e48ea19dc0bb21b584854ffd32d4f6d59d3427d9 (diff) | |
| download | qmmp-4f34d0dd9464fc47fd63e159316317ca0d078899.tar.gz qmmp-4f34d0dd9464fc47fd63e159316317ca0d078899.tar.bz2 qmmp-4f34d0dd9464fc47fd63e159316317ca0d078899.zip | |
restored cddb support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9285 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
| -rw-r--r-- | src/plugins/Input/cdaudio/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/cdaudio.pro | 4 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.cpp | 161 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decoder_cdaudio.h | 5 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/decodercdaudiofactory.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/settingsdialog.cpp | 21 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/settingsdialog.h | 3 | ||||
| -rw-r--r-- | src/plugins/Input/cdaudio/settingsdialog.ui | 77 |
8 files changed, 267 insertions, 10 deletions
diff --git a/src/plugins/Input/cdaudio/CMakeLists.txt b/src/plugins/Input/cdaudio/CMakeLists.txt index d02fea00a..efdaedd87 100644 --- a/src/plugins/Input/cdaudio/CMakeLists.txt +++ b/src/plugins/Input/cdaudio/CMakeLists.txt @@ -7,7 +7,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../) link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp) # libcdaudio -pkg_check_modules(CDIO libcdio libcdio_cdda libcdio_paranoia) +pkg_check_modules(CDIO libcdio libcdio_cdda libcdio_paranoia libcddb) include_directories(${CDIO_INCLUDE_DIRS}) link_directories(${CDIO_LIBRARY_DIRS}) diff --git a/src/plugins/Input/cdaudio/cdaudio.pro b/src/plugins/Input/cdaudio/cdaudio.pro index c16206c9b..f93de73ee 100644 --- a/src/plugins/Input/cdaudio/cdaudio.pro +++ b/src/plugins/Input/cdaudio/cdaudio.pro @@ -16,11 +16,11 @@ RESOURCES = translations/translations.qrc unix { LIBS += -L/usr/lib -I/usr/include - PKGCONFIG += libcdio libcdio_cdda libcdio_paranoia + PKGCONFIG += libcdio libcdio_cdda libcdio_paranoia libcddb target.path = $$PLUGIN_DIR/Input INSTALLS += target } win32 { - LIBS += -lcdio -lcdio_paranoia -lcdio_cdda -lm -lwinmm -mwindows -liconv -lws2_32 + LIBS += -lcdio -lcdio_paranoia -lcdio_cdda -lm -lwinmm -mwindows -liconv -lcddb -lws2_32 } diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp index e469ec2f0..afc6b2995 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.cpp +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2020 by Ilya Kotov * + * Copyright (C) 2009-2016 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ + #include <QObject> #include <QRegExp> #include <QSettings> @@ -32,6 +33,7 @@ #include <cdio/audio.h> #include <cdio/cd_types.h> #include <cdio/logging.h> +#include <cddb/cddb.h> #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/qmmpsettings.h> @@ -59,6 +61,22 @@ static void log_handler (cdio_log_level_t level, const char *message) } } +static void cddb_log_handler(cddb_log_level_t level, const char *message) +{ + QString str = QString::fromLocal8Bit(message).trimmed(); + switch (level) + { + case CDDB_LOG_DEBUG: + qDebug("DecoderCDAudio: cddb message: %s (level=debug)", qPrintable(str)); + return; + case CDDB_LOG_INFO: + qDebug("DecoderCDAudio: cddb message: %s (level=info)", qPrintable(str)); + return; + default: + qWarning("DecoderCDAudio: cddb message: %s (level=error)", qPrintable(str)); + } +} + // Decoder class DecoderCDAudio::DecoderCDAudio(const QString &url) : Decoder() @@ -158,6 +176,7 @@ QList<CDATrack> DecoderCDAudio::generateTrackList(const QString &device, TrackIn cdio = nullptr; return tracks; } + bool use_cddb = true; //fill track list for (int i = first_track_number; i <= last_track_number; ++i) { @@ -202,6 +221,7 @@ QList<CDATrack> DecoderCDAudio::generateTrackList(const QString &device, TrackIn t.info.setValue(Qmmp::TITLE, QString::fromUtf8(cdtext_get_const(cdtext,CDTEXT_FIELD_TITLE,i))); t.info.setValue(Qmmp::ARTIST, QString::fromUtf8(cdtext_get_const(cdtext,CDTEXT_FIELD_PERFORMER,i))); t.info.setValue(Qmmp::GENRE, QString::fromUtf8(cdtext_get_const(cdtext,CDTEXT_FIELD_GENRE,i))); + use_cddb = false; } #endif else @@ -210,12 +230,151 @@ QList<CDATrack> DecoderCDAudio::generateTrackList(const QString &device, TrackIn } qDebug("DecoderCDAudio: found %d audio tracks", tracks.size()); + use_cddb = use_cddb && settings.value("cdaudio/use_cddb", false).toBool(); + if(use_cddb) + { + qDebug("DecoderCDAudio: reading CDDB..."); + cddb_log_set_handler(cddb_log_handler); + cddb_conn_t *cddb_conn = cddb_new (); + cddb_disc_t *cddb_disc = NULL; + cddb_track_t *cddb_track = NULL; + lba_t lba; + if (!cddb_conn) + qWarning ("DecoderCDAudio: unable to create cddb connection"); + else + { + cddb_cache_disable (cddb_conn); //disable libcddb cache, use own cache implementation instead + settings.beginGroup("cdaudio"); + cddb_set_server_name (cddb_conn, settings.value("cddb_server", "freedb.org").toByteArray().constData()); + cddb_set_server_port (cddb_conn, settings.value("cddb_port", 8880).toInt()); + + if (settings.value("cddb_http", false).toBool()) + { + cddb_http_enable (cddb_conn); + cddb_set_http_path_query (cddb_conn, settings.value("cddb_path").toByteArray().constData()); + if (QmmpSettings::instance()->isProxyEnabled() && QmmpSettings::instance()->proxyType() == QmmpSettings::HTTP_PROXY) + { + QUrl proxy = QmmpSettings::instance()->proxy(); + cddb_http_proxy_enable (cddb_conn); + cddb_set_http_proxy_server_name (cddb_conn, proxy.host().toLatin1().constData()); + cddb_set_http_proxy_server_port (cddb_conn, proxy.port()); + if(QmmpSettings::instance()->useProxyAuth()) + { + cddb_set_http_proxy_username (cddb_conn, proxy.userName().toLatin1().constData()); + cddb_set_http_proxy_password (cddb_conn, proxy.password().toLatin1().constData()); + } + } + } + settings.endGroup(); + + cddb_disc = cddb_disc_new (); + lba = cdio_get_track_lba (cdio, CDIO_CDROM_LEADOUT_TRACK); + cddb_disc_set_length (cddb_disc, FRAMES_TO_SECONDS (lba)); + + for (int i = first_track_number; i <= last_track_number; ++i) + { + cddb_track = cddb_track_new (); + cddb_track_set_frame_offset (cddb_track, cdio_get_track_lba (cdio, i)); + cddb_disc_add_track (cddb_disc, cddb_track); + } + + cddb_disc_calc_discid (cddb_disc); + uint id = cddb_disc_get_discid (cddb_disc); + qDebug ("DecoderCDAudio: disc id = %x", id); + + + if(readFromCache(&tracks, id)) + qDebug("DecoderCDAudio: using local cddb cache"); + else + { + int matches = cddb_query (cddb_conn, cddb_disc); + if(matches == -1) + { + qWarning ("DecoderCDAudio: unable to query the CDDB server, error: %s", + cddb_error_str (cddb_errno(cddb_conn))); + } + else if(matches == 0) + { + qDebug ("DecoderCDAudio: no CDDB info found"); + } + else if(cddb_read(cddb_conn, cddb_disc)) + { + for (int i = first_track_number; i <= last_track_number; ++i) + { + cddb_track_t *cddb_track = cddb_disc_get_track (cddb_disc, i - 1); + int t = i - first_track_number; + tracks[t].info.setValue(Qmmp::ARTIST, + QString::fromUtf8(cddb_track_get_artist(cddb_track))); + tracks[t].info.setValue(Qmmp::TITLE, + QString::fromUtf8(cddb_track_get_title(cddb_track))); + tracks[t].info.setValue(Qmmp::GENRE, + QString::fromUtf8(cddb_disc_get_genre(cddb_disc))); + tracks[t].info.setValue(Qmmp::ALBUM, + QString::fromUtf8(cddb_disc_get_title(cddb_disc))); + } + saveToCache(tracks, id); + } + else + { + qWarning ("DecoderCDAudio: unable to read the CDDB info: %s", + cddb_error_str (cddb_errno(cddb_conn))); + } + } + } + if (cddb_disc) + cddb_disc_destroy (cddb_disc); + + if (cddb_conn) + cddb_destroy (cddb_conn); + } + cdio_destroy(cdio); cdio = nullptr; m_track_cache = tracks; return tracks; } +void DecoderCDAudio::saveToCache(QList <CDATrack> tracks, uint disc_id) +{ + QDir dir(Qmmp::configDir()); + if(!dir.exists("cddbcache")) + dir.mkdir("cddbcache"); + dir.cd("cddbcache"); + QString path = dir.absolutePath() + QString("/%1").arg(disc_id, 0, 16); + QSettings settings(path, QSettings::IniFormat); + settings.clear(); + settings.setValue("count", tracks.size()); + for(int i = 0; i < tracks.size(); ++i) + { + CDATrack track = tracks[i]; + QMap<Qmmp::MetaData, QString> meta = track.info.metaData(); + settings.setValue(QString("artist%1").arg(i), meta[Qmmp::ARTIST]); + settings.setValue(QString("title%1").arg(i), meta[Qmmp::TITLE]); + settings.setValue(QString("genre%1").arg(i), meta[Qmmp::GENRE]); + settings.setValue(QString("album%1").arg(i), meta[Qmmp::ALBUM]); + } +} + +bool DecoderCDAudio::readFromCache(QList <CDATrack> *tracks, uint disc_id) +{ + QString path = Qmmp::configDir(); + path += QString("/cddbcache/%1").arg(disc_id, 0, 16); + if(!QFile::exists(path)) + return false; + QSettings settings(path, QSettings::IniFormat); + int count = settings.value("count").toInt(); + if(count != tracks->count()) + return false; + for(int i = 0; i < count; ++i) + { + (*tracks)[i].info.setValue(Qmmp::ARTIST, settings.value(QString("artist%1").arg(i)).toString()); + (*tracks)[i].info.setValue(Qmmp::TITLE, settings.value(QString("title%1").arg(i)).toString()); + (*tracks)[i].info.setValue(Qmmp::GENRE, settings.value(QString("genre%1").arg(i)).toString()); + (*tracks)[i].info.setValue(Qmmp::ALBUM, settings.value(QString("album%1").arg(i)).toString()); + } + return true; +} + qint64 DecoderCDAudio::calculateTrackLength(lsn_t startlsn, lsn_t endlsn) { return ((endlsn - startlsn + 1) * 1000) / 75; diff --git a/src/plugins/Input/cdaudio/decoder_cdaudio.h b/src/plugins/Input/cdaudio/decoder_cdaudio.h index 29ed8c3ff..5da4c1ea7 100644 --- a/src/plugins/Input/cdaudio/decoder_cdaudio.h +++ b/src/plugins/Input/cdaudio/decoder_cdaudio.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2020 by Ilya Kotov * + * Copyright (C) 2009-2016 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -59,6 +59,9 @@ public: void seek(qint64 time) override; private: + //helper functions + static void saveToCache(QList <CDATrack> tracks, uint disc_id); + static bool readFromCache(QList <CDATrack> *tracks, uint disc_id); // libcdio variables lsn_t m_first_sector; lsn_t m_last_sector; diff --git a/src/plugins/Input/cdaudio/decodercdaudiofactory.cpp b/src/plugins/Input/cdaudio/decodercdaudiofactory.cpp index f63905997..2025e8f8b 100644 --- a/src/plugins/Input/cdaudio/decodercdaudiofactory.cpp +++ b/src/plugins/Input/cdaudio/decodercdaudiofactory.cpp @@ -20,6 +20,7 @@ #include <QMessageBox> #include <cdio/version.h> +#include <cddb/version.h> #include "settingsdialog.h" #include "decoder_cdaudio.h" #include "decodercdaudiofactory.h" @@ -84,7 +85,8 @@ void DecoderCDAudioFactory::showAbout(QWidget *parent) { QMessageBox::about (parent, tr("About CD Audio Plugin"), tr("Qmmp CD Audio Plugin")+"\n"+ - QString(tr("Compiled against libcdio-%1")).arg(CDIO_VERSION) + "\n" + + QString(tr("Compiled against libcdio-%1 and libcddb-%2")).arg(CDIO_VERSION) + .arg(CDDB_VERSION) + "\n" + tr("Written by: Ilya Kotov <forkotov02@ya.ru>")+"\n"+ tr("Usage: open cdda:/// using Add URL dialog or command line")); } diff --git a/src/plugins/Input/cdaudio/settingsdialog.cpp b/src/plugins/Input/cdaudio/settingsdialog.cpp index 5dfced4e0..0e428039e 100644 --- a/src/plugins/Input/cdaudio/settingsdialog.cpp +++ b/src/plugins/Input/cdaudio/settingsdialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2020 by Ilya Kotov * + * Copyright (C) 2009-2013 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -37,6 +37,11 @@ SettingsDialog::SettingsDialog(QWidget *parent) m_ui.speedCheckBox->setChecked(speed > 0); m_ui.speedSpinBox->setValue(speed); m_ui.cdtextCheckBox->setChecked(settings.value("cdtext", true).toBool()); + m_ui.cddbGroupBox->setChecked(settings.value("use_cddb", false).toBool()); + m_ui.httpCheckBox->setChecked(settings.value("cddb_http", false).toBool()); + m_ui.serverLineEdit->setText(settings.value("cddb_server", "freedb.org").toString()); + m_ui.pathLineEdit->setText(settings.value("cddb_path").toString()); + m_ui.portLineEdit->setText(settings.value("cddb_port", 8880).toString()); settings.endGroup(); } @@ -57,8 +62,22 @@ void SettingsDialog::accept() settings.setValue("speed", 0); settings.setValue("cdtext", m_ui.cdtextCheckBox->isChecked()); settings.setValue("cdtext", m_ui.cdtextCheckBox->isChecked()); + settings.setValue("use_cddb", m_ui.cddbGroupBox->isChecked()); + settings.setValue("cddb_http", m_ui.httpCheckBox->isChecked()); + settings.setValue("cddb_server", m_ui.serverLineEdit->text()); + settings.setValue("cddb_path", m_ui.pathLineEdit->text()); + settings.setValue("cddb_port", m_ui.portLineEdit->text()); settings.endGroup(); settings.sync(); DecoderCDAudio::clearTrackCache(); QDialog::accept(); } + +void SettingsDialog::on_clearCacheButton_clicked() +{ + QDir dir(Qmmp::configDir()); + dir.cd("cddbcache"); + const QStringList list = dir.entryList(QStringList() << "*", QDir::Files); + for(const QString &name : qAsConst(list)) + dir.remove(name); +} diff --git a/src/plugins/Input/cdaudio/settingsdialog.h b/src/plugins/Input/cdaudio/settingsdialog.h index 919e108d3..f2b036f16 100644 --- a/src/plugins/Input/cdaudio/settingsdialog.h +++ b/src/plugins/Input/cdaudio/settingsdialog.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2020 by Ilya Kotov * + * Copyright (C) 2009-2013 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -37,6 +37,7 @@ public: public slots: virtual void accept() override; + void on_clearCacheButton_clicked(); private: Ui::SettingsDialog m_ui; diff --git a/src/plugins/Input/cdaudio/settingsdialog.ui b/src/plugins/Input/cdaudio/settingsdialog.ui index ac03e2013..f343f057c 100644 --- a/src/plugins/Input/cdaudio/settingsdialog.ui +++ b/src/plugins/Input/cdaudio/settingsdialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>268</width> - <height>141</height> + <width>261</width> + <height>280</height> </rect> </property> <property name="windowTitle"> @@ -64,6 +64,79 @@ </widget> </item> <item row="3" column="0" colspan="2"> + <widget class="QGroupBox" name="cddbGroupBox"> + <property name="title"> + <string>CDDB</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="2"> + <widget class="QCheckBox" name="httpCheckBox"> + <property name="text"> + <string>Use HTTP instead of CDDBP</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="serverLineEdit"/> + </item> + <item row="1" column="0" rowspan="2"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Server:</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Path:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="pathLineEdit"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Port:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="portLineEdit"/> + </item> + <item row="5" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPushButton" name="clearCacheButton"> + <property name="text"> + <string>Clear CDDB cache</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="4" column="0" colspan="2"> <widget class="QDialogButtonBox" name="buttonBox"> <property name="standardButtons"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
