From 7732da6543466654c4f0ecf5826467a053721e87 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sat, 28 Jan 2017 18:19:11 +0000 Subject: lyrics plugin: added cache (#411) git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7016 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/lyrics/lyricswindow.cpp | 93 ++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 21 deletions(-) (limited to 'src/plugins/General/lyrics/lyricswindow.cpp') diff --git a/src/plugins/General/lyrics/lyricswindow.cpp b/src/plugins/General/lyrics/lyricswindow.cpp index e8d9b1bf3..603e6630f 100644 --- a/src/plugins/General/lyrics/lyricswindow.cpp +++ b/src/plugins/General/lyrics/lyricswindow.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009-2012 by Ilya Kotov * + * Copyright (C) 2009-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include #include "lyricswindow.h" @@ -30,13 +33,14 @@ LyricsWindow::LyricsWindow(const QString &artist, const QString &title, QWidget *parent) : QWidget(parent) { - ui.setupUi(this); + m_ui.setupUi(this); setWindowFlags(Qt::Dialog); setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_QuitOnClose, false); m_requestReply = 0; - ui.artistLineEdit->setText(artist); - ui.titleLineEdit->setText(title); + m_cachePath = Qmmp::configDir() + "lyrics/"; + m_ui.artistLineEdit->setText(artist); + m_ui.titleLineEdit->setText(title); m_http = new QNetworkAccessManager(this); //load global proxy settings QmmpSettings *gs = QmmpSettings::instance(); @@ -51,7 +55,15 @@ LyricsWindow::LyricsWindow(const QString &artist, const QString &title, QWidget m_http->setProxy(proxy); } connect(m_http, SIGNAL(finished (QNetworkReply *)), SLOT(showText(QNetworkReply *))); - on_searchPushButton_clicked(); + + QDir cacheDir(m_cachePath); + if(!cacheDir.exists()) + { + if(!cacheDir.mkpath(cacheDir.absolutePath())) + qWarning("LyricsWindow: unable to create cache directory"); + } + if(!loadFromCache()) + on_searchPushButton_clicked(); } @@ -61,11 +73,11 @@ LyricsWindow::~LyricsWindow() void LyricsWindow::showText(QNetworkReply *reply) { - ui.stateLabel->setText(tr("Done")); + m_ui.stateLabel->setText(tr("Done")); if (reply->error() != QNetworkReply::NoError) { - ui.stateLabel->setText(tr("Error")); - ui.textBrowser->setText(reply->errorString()); + m_ui.stateLabel->setText(tr("Error")); + m_ui.textBrowser->setText(reply->errorString()); m_requestReply = 0; reply->deleteLater(); return; @@ -88,13 +100,13 @@ void LyricsWindow::showText(QNetworkReply *reply) if(artist_regexp.indexIn(content) < 0) { - ui.textBrowser->setHtml("" + tr("Error") + ""); + m_ui.textBrowser->setHtml("" + tr("Error") + ""); return; } if(artist_regexp.indexIn(content) < 0) { - ui.textBrowser->setHtml("" + tr("Error") + ""); + m_ui.textBrowser->setHtml("" + tr("Error") + ""); return; } else @@ -102,7 +114,7 @@ void LyricsWindow::showText(QNetworkReply *reply) if(song_regexp.indexIn(content) < 0) { - ui.textBrowser->setHtml("" + tr("Error") + ""); + m_ui.textBrowser->setHtml("" + tr("Error") + ""); return; } else @@ -110,18 +122,18 @@ void LyricsWindow::showText(QNetworkReply *reply) if(lyrics_regexp.indexIn(content) < 0) { - ui.textBrowser->setHtml("" + tr("Error") + ""); + m_ui.textBrowser->setHtml("" + tr("Error") + ""); return; } else if(lyrics_regexp.cap(1) == "Not found") { - ui.textBrowser->setHtml("" + tr("Not found") + ""); + m_ui.textBrowser->setHtml("" + tr("Not found") + ""); return; } if(url_regexp.indexIn(content) < 0) { - ui.textBrowser->setHtml("" + tr("Error") + ""); + m_ui.textBrowser->setHtml("" + tr("Error") + ""); return; } @@ -136,7 +148,7 @@ void LyricsWindow::showText(QNetworkReply *reply) QNetworkRequest request; request.setUrl(url); request.setRawHeader("Referer", referer.toLatin1()); - ui.stateLabel->setText(tr("Receiving")); + m_ui.stateLabel->setText(tr("Receiving")); m_http->get(request); reply->deleteLater(); return; @@ -150,23 +162,62 @@ void LyricsWindow::showText(QNetworkReply *reply) lyrics = lyrics.trimmed(); lyrics.replace("\n", "
"); if(lyrics.isEmpty()) - ui.textBrowser->setHtml("" + tr("Not found") + ""); + m_ui.textBrowser->setHtml("" + tr("Not found") + ""); else { text += lyrics; - ui.textBrowser->setHtml(text); + m_ui.textBrowser->setHtml(text); + saveToCache(text); + } reply->deleteLater(); } void LyricsWindow::on_searchPushButton_clicked() { - ui.stateLabel->setText(tr("Receiving")); - setWindowTitle(QString(tr("Lyrics: %1 - %2")).arg(ui.artistLineEdit->text()) - .arg(ui.titleLineEdit->text())); + m_ui.stateLabel->setText(tr("Receiving")); + setWindowTitle(QString(tr("Lyrics: %1 - %2")).arg(m_ui.artistLineEdit->text()) + .arg(m_ui.titleLineEdit->text())); QNetworkRequest request; request.setUrl(QUrl("http://lyrics.wikia.com/api.php?action=lyrics&artist=" + - ui.artistLineEdit->text()+"&song=" + ui.titleLineEdit->text() + "&fmt=xml")); + m_ui.artistLineEdit->text()+"&song=" + m_ui.titleLineEdit->text() + "&fmt=xml")); request.setRawHeader("User-Agent", QString("qmmp/%1").arg(Qmmp::strVersion()).toLatin1()); m_requestReply = m_http->get(request); } + +QString LyricsWindow::cacheFilePath() const +{ + QString name = m_ui.artistLineEdit->text() + "_" + m_ui.titleLineEdit->text(); + QByteArray hash = QCryptographicHash::hash(name.toUtf8(), QCryptographicHash::Md5); + return m_cachePath + QString::fromLatin1(hash.toHex()) + ".html"; +} + +bool LyricsWindow::loadFromCache() +{ + QFile file(cacheFilePath()); + if(!file.exists()) + return false; + + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qWarning("LyricsWindow: unable to open cache file '%s', error: %s", + qPrintable(file.fileName()), qPrintable(file.errorString())); + return false; + } + + m_ui.textBrowser->setHtml(QString::fromUtf8(file.readAll())); + m_ui.stateLabel->setText(tr("Done")); + return true; +} + +void LyricsWindow::saveToCache(const QString &text) +{ + QFile file(cacheFilePath()); + if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + qWarning("LyricsWindow: unable to open cache file '%s', error: %s", + qPrintable(file.fileName()), qPrintable(file.errorString())); + return; + } + file.write(text.toUtf8()); +} -- cgit v1.2.3-13-gbd6f