From 822e613ba535aedfe1220b5b9689c55b68050057 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sun, 23 Sep 2018 20:45:55 +0000 Subject: added history plugin git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8360 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/CMakeLists.txt | 5 + src/plugins/General/history/CMakeLists.txt | 37 ++ src/plugins/General/history/dateinputdialog.cpp | 44 +++ src/plugins/General/history/dateinputdialog.h | 46 +++ src/plugins/General/history/dateinputdialog.ui | 76 ++++ src/plugins/General/history/history.cpp | 163 ++++++++ src/plugins/General/history/history.h | 60 +++ src/plugins/General/history/history.pro | 33 ++ src/plugins/General/history/historyfactory.cpp | 60 +++ src/plugins/General/history/historyfactory.h | 44 +++ .../General/history/historysettingsdialog.cpp | 56 +++ .../General/history/historysettingsdialog.h | 48 +++ .../General/history/historysettingsdialog.ui | 107 ++++++ src/plugins/General/history/historywindow.cpp | 416 +++++++++++++++++++++ src/plugins/General/history/historywindow.h | 62 +++ src/plugins/General/history/historywindow.ui | 279 ++++++++++++++ .../General/history/progressbaritemdelegate.cpp | 71 ++++ .../General/history/progressbaritemdelegate.h | 45 +++ .../history/translations/history_plugin_bg.ts | 174 +++++++++ .../history/translations/history_plugin_cs.ts | 174 +++++++++ .../history/translations/history_plugin_de.ts | 174 +++++++++ .../history/translations/history_plugin_el.ts | 174 +++++++++ .../history/translations/history_plugin_en.ts | 174 +++++++++ .../history/translations/history_plugin_es.ts | 174 +++++++++ .../history/translations/history_plugin_fi.ts | 174 +++++++++ .../history/translations/history_plugin_fr.ts | 174 +++++++++ .../history/translations/history_plugin_gl_ES.ts | 174 +++++++++ .../history/translations/history_plugin_he.ts | 174 +++++++++ .../history/translations/history_plugin_hu.ts | 174 +++++++++ .../history/translations/history_plugin_id.ts | 174 +++++++++ .../history/translations/history_plugin_it.ts | 174 +++++++++ .../history/translations/history_plugin_ja.ts | 174 +++++++++ .../history/translations/history_plugin_kk.ts | 174 +++++++++ .../history/translations/history_plugin_lt.ts | 174 +++++++++ .../history/translations/history_plugin_nl.ts | 174 +++++++++ .../history/translations/history_plugin_pl_PL.ts | 174 +++++++++ .../history/translations/history_plugin_pt.ts | 174 +++++++++ .../history/translations/history_plugin_pt_BR.ts | 174 +++++++++ .../history/translations/history_plugin_ru.ts | 174 +++++++++ .../history/translations/history_plugin_sk.ts | 174 +++++++++ .../history/translations/history_plugin_sr_BA.ts | 174 +++++++++ .../history/translations/history_plugin_sr_RS.ts | 174 +++++++++ .../history/translations/history_plugin_tr.ts | 174 +++++++++ .../history/translations/history_plugin_uk_UA.ts | 174 +++++++++ .../history/translations/history_plugin_zh_CN.ts | 174 +++++++++ .../history/translations/history_plugin_zh_TW.ts | 174 +++++++++ .../General/history/translations/translations.qrc | 32 ++ 47 files changed, 6556 insertions(+) create mode 100644 src/plugins/General/history/CMakeLists.txt create mode 100644 src/plugins/General/history/dateinputdialog.cpp create mode 100644 src/plugins/General/history/dateinputdialog.h create mode 100644 src/plugins/General/history/dateinputdialog.ui create mode 100644 src/plugins/General/history/history.cpp create mode 100644 src/plugins/General/history/history.h create mode 100644 src/plugins/General/history/history.pro create mode 100644 src/plugins/General/history/historyfactory.cpp create mode 100644 src/plugins/General/history/historyfactory.h create mode 100644 src/plugins/General/history/historysettingsdialog.cpp create mode 100644 src/plugins/General/history/historysettingsdialog.h create mode 100644 src/plugins/General/history/historysettingsdialog.ui create mode 100644 src/plugins/General/history/historywindow.cpp create mode 100644 src/plugins/General/history/historywindow.h create mode 100644 src/plugins/General/history/historywindow.ui create mode 100644 src/plugins/General/history/progressbaritemdelegate.cpp create mode 100644 src/plugins/General/history/progressbaritemdelegate.h create mode 100644 src/plugins/General/history/translations/history_plugin_bg.ts create mode 100644 src/plugins/General/history/translations/history_plugin_cs.ts create mode 100644 src/plugins/General/history/translations/history_plugin_de.ts create mode 100644 src/plugins/General/history/translations/history_plugin_el.ts create mode 100644 src/plugins/General/history/translations/history_plugin_en.ts create mode 100644 src/plugins/General/history/translations/history_plugin_es.ts create mode 100644 src/plugins/General/history/translations/history_plugin_fi.ts create mode 100644 src/plugins/General/history/translations/history_plugin_fr.ts create mode 100644 src/plugins/General/history/translations/history_plugin_gl_ES.ts create mode 100644 src/plugins/General/history/translations/history_plugin_he.ts create mode 100644 src/plugins/General/history/translations/history_plugin_hu.ts create mode 100644 src/plugins/General/history/translations/history_plugin_id.ts create mode 100644 src/plugins/General/history/translations/history_plugin_it.ts create mode 100644 src/plugins/General/history/translations/history_plugin_ja.ts create mode 100644 src/plugins/General/history/translations/history_plugin_kk.ts create mode 100644 src/plugins/General/history/translations/history_plugin_lt.ts create mode 100644 src/plugins/General/history/translations/history_plugin_nl.ts create mode 100644 src/plugins/General/history/translations/history_plugin_pl_PL.ts create mode 100644 src/plugins/General/history/translations/history_plugin_pt.ts create mode 100644 src/plugins/General/history/translations/history_plugin_pt_BR.ts create mode 100644 src/plugins/General/history/translations/history_plugin_ru.ts create mode 100644 src/plugins/General/history/translations/history_plugin_sk.ts create mode 100644 src/plugins/General/history/translations/history_plugin_sr_BA.ts create mode 100644 src/plugins/General/history/translations/history_plugin_sr_RS.ts create mode 100644 src/plugins/General/history/translations/history_plugin_tr.ts create mode 100644 src/plugins/General/history/translations/history_plugin_uk_UA.ts create mode 100644 src/plugins/General/history/translations/history_plugin_zh_CN.ts create mode 100644 src/plugins/General/history/translations/history_plugin_zh_TW.ts create mode 100644 src/plugins/General/history/translations/translations.qrc (limited to 'src') diff --git a/src/plugins/General/CMakeLists.txt b/src/plugins/General/CMakeLists.txt index 80acaf8b2..180020bbb 100644 --- a/src/plugins/General/CMakeLists.txt +++ b/src/plugins/General/CMakeLists.txt @@ -15,6 +15,7 @@ SET(USE_RGSCAN TRUE CACHE BOOL "enable/disable replaygain scanner plugin") SET(USE_SB TRUE CACHE BOOL "enable/disable stream browser plugin") SET(USE_TRACKCHANGE TRUE CACHE BOOL "enable/disable track change plugin") SET(USE_COPYPASTE TRUE CACHE BOOL "enable/disable copy/paste change plugin") +SET(USE_HISTORY TRUE CACHE BOOL "enable/disable history plugin") IF(USE_MPRIS AND Qt5DBus_FOUND) add_subdirectory(mpris) @@ -83,3 +84,7 @@ ENDIF(USE_COPYPASTE) IF(USE_GNOMEHOTKEY AND Qt5DBus_FOUND) add_subdirectory(gnomehotkey) ENDIF(USE_GNOMEHOTKEY AND Qt5DBus_FOUND) + +IF(USE_HISTORY AND Qt5Sql_FOUND) +add_subdirectory(history) +ENDIF(USE_HISTORY AND Qt5Sql_FOUND) diff --git a/src/plugins/General/history/CMakeLists.txt b/src/plugins/General/history/CMakeLists.txt new file mode 100644 index 000000000..a38b65afc --- /dev/null +++ b/src/plugins/General/history/CMakeLists.txt @@ -0,0 +1,37 @@ +project(libhistory) + +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +# libqmmpui & libqmmp +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../) +link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmpui) +link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp) + +SET(libhistory_SRCS + dateinputdialog.cpp + history.cpp + historyfactory.cpp + historysettingsdialog.cpp + historywindow.cpp + progressbaritemdelegate.cpp +) + +SET(libhistory_RCCS translations/translations.qrc) + +QT5_ADD_RESOURCES(libhistory_RCC_SRCS ${libhistory_RCCS}) + +# user interface +SET(libhistory_UIS + historysettingsdialog.ui + dateinputdialog.ui + historywindow.ui +) + +QT5_WRAP_UI(libhistory_UIS_H ${libhistory_UIS}) +# Don't forget to include output directory, otherwise +# the UI file won't be wrapped! +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +ADD_LIBRARY(history MODULE ${libhistory_SRCS} ${libhistory_UIS_H} ${libhistory_RCC_SRCS}) +target_link_libraries(history Qt5::Widgets Qt5::Sql libqmmpui libqmmp) +install(TARGETS history DESTINATION ${PLUGIN_DIR}/General) diff --git a/src/plugins/General/history/dateinputdialog.cpp b/src/plugins/General/history/dateinputdialog.cpp new file mode 100644 index 000000000..81d23133f --- /dev/null +++ b/src/plugins/General/history/dateinputdialog.cpp @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "dateinputdialog.h" +#include "ui_dateinputdialog.h" + +DateInputDialog::DateInputDialog(QWidget *parent) : + QDialog(parent), + m_ui(new Ui::DateInputDialog) +{ + m_ui->setupUi(this); +} + +DateInputDialog::~DateInputDialog() +{ + delete m_ui; +} + +QDate DateInputDialog::selectedDate() const +{ + return m_ui->calendarWidget->selectedDate(); +} + +void DateInputDialog::setSelectedDate(const QDate &date) +{ + m_ui->calendarWidget->setSelectedDate(date); +} diff --git a/src/plugins/General/history/dateinputdialog.h b/src/plugins/General/history/dateinputdialog.h new file mode 100644 index 000000000..2259de255 --- /dev/null +++ b/src/plugins/General/history/dateinputdialog.h @@ -0,0 +1,46 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef DATEINPUTDIALOG_H +#define DATEINPUTDIALOG_H + +#include +#include + +namespace Ui { +class DateInputDialog; +} + +class DateInputDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DateInputDialog(QWidget *parent = 0); + ~DateInputDialog(); + + QDate selectedDate() const; + void setSelectedDate(const QDate &date); + +private: + Ui::DateInputDialog *m_ui; +}; + +#endif // DATEINPUTDIALOG_H diff --git a/src/plugins/General/history/dateinputdialog.ui b/src/plugins/General/history/dateinputdialog.ui new file mode 100644 index 000000000..504d24d39 --- /dev/null +++ b/src/plugins/General/history/dateinputdialog.ui @@ -0,0 +1,76 @@ + + + DateInputDialog + + + + 0 + 0 + 474 + 233 + + + + Select Date + + + + 6 + + + 6 + + + 6 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + DateInputDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DateInputDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/plugins/General/history/history.cpp b/src/plugins/General/history/history.cpp new file mode 100644 index 000000000..25b4bf8fe --- /dev/null +++ b/src/plugins/General/history/history.cpp @@ -0,0 +1,163 @@ +/*************************************************************************** + * Copyright (C) 2017-2018 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "historywindow.h" +#include "history.h" + +History::History(QObject *parent) : QObject(parent) +{ + m_core = SoundCore::instance(); + m_previousState = Qmmp::Stopped; + m_elapsed = 0; + connect(m_core, SIGNAL(trackInfoChanged()), SLOT(onTrackInfoChanged())); + connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(onStateChanged(Qmmp::State))); + + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", CONNECTION_NAME); + if(db.isValid() && !db.isOpen()) + { + db.setDatabaseName(Qmmp::configDir() + "/" + "history.sqlite"); + db.open(); + if(createTables()) + { + QSqlQuery query(db); + query.exec("PRAGMA journal_mode = WAL"); + query.exec("PRAGMA synchronous = NORMAL"); + qDebug("History: database initialization finished"); + } + else + { + db.close(); + qWarning("History: plugin is disabled"); + } + } + + QAction *action = new QAction(tr("History"), this); + action->setIcon(QIcon::fromTheme("text-x-generic")); + UiHelper::instance()->addAction(action, UiHelper::TOOLS_MENU); + connect(action, SIGNAL(triggered()), SLOT(showHistoryWindow())); +} + +History::~History() +{ + if(QSqlDatabase::contains(CONNECTION_NAME)) + { + QSqlDatabase::database(CONNECTION_NAME).close(); + QSqlDatabase::removeDatabase(CONNECTION_NAME); + } +} + +void History::onTrackInfoChanged() +{ + if(m_elapsed + m_time.elapsed() > 20000) + saveTrack(); + + m_trackInfo = m_core->trackInfo(); + m_time.restart(); + m_elapsed = 0; +} + +void History::onStateChanged(Qmmp::State state) +{ + if(state == Qmmp::Playing && m_previousState == Qmmp::Stopped) + { + m_time.restart(); + } + else if(state == Qmmp::Paused) + { + m_elapsed += m_time.elapsed(); + } + else if(state == Qmmp::Stopped) + { + if(m_previousState == Qmmp::Playing) + m_elapsed += m_time.elapsed(); + + if(m_elapsed > 20000) + saveTrack(); + m_elapsed = 0; + } + + m_previousState = state; +} + +void History::showHistoryWindow() +{ + if(!m_historyWindow) + m_historyWindow = new HistoryWindow(QSqlDatabase::database(CONNECTION_NAME), qApp->activeWindow()); + m_historyWindow->show(); + m_historyWindow->activateWindow(); +} + +bool History::createTables() +{ + QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); + if(!db.isOpen()) + return false; + + QSqlQuery query(db); + bool ok = query.exec("CREATE TABLE IF NOT EXISTS track_history(ID INTEGER PRIMARY KEY AUTOINCREMENT," + "Timestamp TIMESTAMP NOT NULL," + "Title TEXT, Artist TEXT, AlbumArtist TEXT, Album TEXT, Comment TEXT, Genre TEXT, Composer TEXT," + "Year INTEGER, Track INTEGER, DiscNumer INTEGER, Duration INTEGER, URL BLOB)"); + + if(!ok) + qWarning("History: unable to create table, error: %s", qPrintable(query.lastError().text())); + + return ok; +} + +void History::saveTrack() +{ + QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); + if(!db.isOpen() || m_trackInfo.isEmpty()) + return; + + QSqlQuery query(db); + query.prepare("INSERT INTO track_history VALUES(NULL, CURRENT_TIMESTAMP, :title, :artist, :albumartist, :album, :comment," + ":genre, :composer, :year, :track, :discnumber, :duration, :url);"); + query.bindValue(":title", m_trackInfo.value(Qmmp::TITLE)); + query.bindValue(":artist", m_trackInfo.value(Qmmp::ARTIST)); + query.bindValue(":albumartist", m_trackInfo.value(Qmmp::ALBUMARTIST)); + query.bindValue(":album", m_trackInfo.value(Qmmp::ALBUM)); + query.bindValue(":comment", m_trackInfo.value(Qmmp::COMMENT)); + query.bindValue(":genre", m_trackInfo.value(Qmmp::GENRE)); + query.bindValue(":composer", m_trackInfo.value(Qmmp::COMPOSER)); + query.bindValue(":year", m_trackInfo.value(Qmmp::YEAR)); + query.bindValue(":track", m_trackInfo.value(Qmmp::TRACK)); + query.bindValue(":discnumber", m_trackInfo.value(Qmmp::DISCNUMBER)); + query.bindValue(":duration", m_trackInfo.duration()); + query.bindValue(":url", m_trackInfo.path()); + bool ok = query.exec(); + + if(!ok) + qWarning("History: unable to save track, error: %s", qPrintable(query.lastError().text())); + else + qDebug("History: track '%s' has been added to history", + qPrintable(m_trackInfo.value(Qmmp::ARTIST) + " - " + m_trackInfo.value(Qmmp::TITLE))); + + m_trackInfo.clear(); +} diff --git a/src/plugins/General/history/history.h b/src/plugins/General/history/history.h new file mode 100644 index 000000000..07d65be0c --- /dev/null +++ b/src/plugins/General/history/history.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2017-2018 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef HISTORY_H +#define HISTORY_H + +#include +#include +#include +#include +#include + +#define CONNECTION_NAME "qmmp_history" + +class SoundCore; +class HistoryWindow; + +class History : public QObject +{ + Q_OBJECT +public: + explicit History(QObject *parent = 0); + ~History(); + +private slots: + void onTrackInfoChanged(); + void onStateChanged(Qmmp::State state); + void showHistoryWindow(); + +private: + bool createTables(); + void saveTrack(); + + SoundCore *m_core; + TrackInfo m_trackInfo; + QTime m_time; + Qmmp::State m_previousState; + quint64 m_elapsed; + QPointer m_historyWindow; + +}; + +#endif // HISTORY_H diff --git a/src/plugins/General/history/history.pro b/src/plugins/General/history/history.pro new file mode 100644 index 000000000..1de764ee4 --- /dev/null +++ b/src/plugins/General/history/history.pro @@ -0,0 +1,33 @@ +include(../../plugins.pri) + +TARGET = $$PLUGINS_PREFIX/General/history + +QT += sql + +HEADERS += historyfactory.h \ + history.h \ + historywindow.h \ + dateinputdialog.h \ + historysettingsdialog.h \ + progressbaritemdelegate.h + +SOURCES += historyfactory.cpp \ + history.cpp \ + historywindow.cpp \ + dateinputdialog.cpp \ + historysettingsdialog.cpp \ + progressbaritemdelegate.cpp + +FORMS += \ + historywindow.ui \ + dateinputdialog.ui \ + historysettingsdialog.ui + +RESOURCES = translations/translations.qrc + +LIBS += $$QMMPUI_LIB + +unix { + target.path = $$PLUGIN_DIR/General + INSTALLS += target +} diff --git a/src/plugins/General/history/historyfactory.cpp b/src/plugins/General/history/historyfactory.cpp new file mode 100644 index 000000000..ddd572de1 --- /dev/null +++ b/src/plugins/General/history/historyfactory.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include "history.h" +#include "historysettingsdialog.h" +#include "historyfactory.h" + +GeneralProperties HistoryFactory::properties() const +{ + GeneralProperties properties; + properties.name = tr("Listening History Plugin"); + properties.shortName = "history"; + properties.hasAbout = true; + properties.hasSettings = true; + properties.visibilityControl = false; + return properties; +} + +QObject *HistoryFactory::create(QObject *parent) +{ + return new History(parent); +} + +QDialog *HistoryFactory::createConfigDialog(QWidget *parent) +{ + return new HistorySettingsDialog(parent) ; +} + +void HistoryFactory::showAbout(QWidget *parent) +{ + QMessageBox::about (parent, tr("About Listening History Plugin"), + tr("Qmmp Listening History Plugin")+"\n"+ + tr("This plugin collects information about listened tracks")+"\n"+ + tr("Written by: Ilya Kotov ")); +} + +QString HistoryFactory::translation() const +{ + return QString(":/history_plugin_"); +} diff --git a/src/plugins/General/history/historyfactory.h b/src/plugins/General/history/historyfactory.h new file mode 100644 index 000000000..5a5e9ed77 --- /dev/null +++ b/src/plugins/General/history/historyfactory.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef HISTORYFACTORY_H +#define HISTORYFACTORY_H + +#include +#include +#include +#include + +/** + @author Ilya Kotov +*/ +class HistoryFactory : public QObject, public GeneralFactory +{ +Q_OBJECT +Q_PLUGIN_METADATA(IID "org.qmmp.qmmp.GeneralFactoryInterface.1.0") +Q_INTERFACES(GeneralFactory) +public: + GeneralProperties properties() const; + QObject *create(QObject *parent); + QDialog *createConfigDialog(QWidget *parent); + void showAbout(QWidget *parent); + QString translation() const; +}; + +#endif // HISTORYFACTORY_H diff --git a/src/plugins/General/history/historysettingsdialog.cpp b/src/plugins/General/history/historysettingsdialog.cpp new file mode 100644 index 000000000..3a4956c7d --- /dev/null +++ b/src/plugins/General/history/historysettingsdialog.cpp @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include "historysettingsdialog.h" +#include "ui_historysettingsdialog.h" + +HistorySettingsDialog::HistorySettingsDialog(QWidget *parent) : + QDialog(parent), + m_ui(new Ui::HistorySettingsDialog) +{ + m_ui->setupUi(this); + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + m_ui->titleLineEdit->setText(settings.value("History/title_format", "%if(%p,%p - %t,%t)").toString()); + + MetaDataFormatterMenu *menu = new MetaDataFormatterMenu(MetaDataFormatterMenu::TITLE_MENU, this); + m_ui->titleButton->setMenu(menu); + m_ui->titleButton->setPopupMode(QToolButton::InstantPopup); + connect(menu, SIGNAL(patternSelected(QString)), SLOT(addTitleString(QString))); +} + +HistorySettingsDialog::~HistorySettingsDialog() +{ + delete m_ui; +} + +void HistorySettingsDialog::accept() +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.setValue("History/title_format", m_ui->titleLineEdit->text()); + QDialog::accept(); +} + +void HistorySettingsDialog::addTitleString(const QString &str) +{ + m_ui->titleLineEdit->insert(str); +} diff --git a/src/plugins/General/history/historysettingsdialog.h b/src/plugins/General/history/historysettingsdialog.h new file mode 100644 index 000000000..b21e03cd7 --- /dev/null +++ b/src/plugins/General/history/historysettingsdialog.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef HISTORYSETTINGSDIALOG_H +#define HISTORYSETTINGSDIALOG_H + +#include + +namespace Ui { +class HistorySettingsDialog; +} + +class HistorySettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit HistorySettingsDialog(QWidget *parent = 0); + ~HistorySettingsDialog(); + +public slots: + void accept(); + +private slots: + void addTitleString(const QString &str); + +private: + Ui::HistorySettingsDialog *m_ui; +}; + +#endif // HISTORYSETTINGSDIALOG_H diff --git a/src/plugins/General/history/historysettingsdialog.ui b/src/plugins/General/history/historysettingsdialog.ui new file mode 100644 index 000000000..2c48b8d5e --- /dev/null +++ b/src/plugins/General/history/historysettingsdialog.ui @@ -0,0 +1,107 @@ + + + HistorySettingsDialog + + + + 0 + 0 + 402 + 89 + + + + Listening History Plugin Settings + + + + 6 + + + 6 + + + 6 + + + + + + + Title format: + + + + + + + + + + ... + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + HistorySettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + HistorySettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/plugins/General/history/historywindow.cpp b/src/plugins/General/history/historywindow.cpp new file mode 100644 index 000000000..e586da74d --- /dev/null +++ b/src/plugins/General/history/historywindow.cpp @@ -0,0 +1,416 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "historywindow.h" +#include "dateinputdialog.h" +#include "progressbaritemdelegate.h" +#include "ui_historywindow.h" + +HistoryWindow::HistoryWindow(QSqlDatabase db, QWidget *parent) : + QWidget(parent), + m_ui(new Ui::HistoryWindow) +{ + m_ui->setupUi(this); + setWindowFlags(Qt::Window); + setAttribute(Qt::WA_DeleteOnClose); + setAttribute(Qt::WA_QuitOnClose, false); + m_db = db; + readSettings(); + + QDateTime t = QDateTime::currentDateTime(); + t.setTime(QTime(23, 59, 0 ,0)); + m_ui->toDateEdit->setDateTime(t); + t.setTime(QTime(0, 0, 0, 0)); + t = t.addDays(-7); + m_ui->fromDateEdit->setDateTime(t); + m_ui->distributionTreeWidget->setItemDelegate(new ProgressBarItemDelegate(this)); + m_ui->topArtistsTreeWidget->setItemDelegate(new ProgressBarItemDelegate(this)); + m_ui->topSongsTreeWidget->setItemDelegate(new ProgressBarItemDelegate(this)); + m_ui->topGenresTreeWidget->setItemDelegate(new ProgressBarItemDelegate(this)); + + on_executeButton_clicked(); +} + +HistoryWindow::~HistoryWindow() +{ + delete m_ui; +} + +void HistoryWindow::loadHistory() +{ + m_ui->historyTreeWidget->clear(); + + if(!m_db.isOpen()) + return; + + QSqlQuery query(m_db); + + query.prepare("SELECT Timestamp,Title,Artist,AlbumArtist,Album,Comment,Genre,Composer,Track,Year,Duration,URL " + "FROM track_history WHERE Timestamp BETWEEN :from and :to"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + + QColor bgColor = palette().color(QPalette::Highlight); + QColor textColor = palette().color(QPalette::HighlightedText); + + while (query.next()) + { + TrackInfo info; + info.setValue(Qmmp::TITLE, query.value(1).toString()); + info.setValue(Qmmp::ARTIST, query.value(2).toString()); + info.setValue(Qmmp::ALBUMARTIST, query.value(3).toString()); + info.setValue(Qmmp::ALBUM, query.value(4).toString()); + info.setValue(Qmmp::COMMENT, query.value(5).toString()); + info.setValue(Qmmp::GENRE, query.value(6).toString()); + info.setValue(Qmmp::COMPOSER, query.value(7).toString()); + info.setValue(Qmmp::TRACK, query.value(8).toString()); + info.setValue(Qmmp::YEAR, query.value(9).toString()); + info.setDuration(query.value(10).toInt()); + info.setPath(query.value(11).toString()); + + QDateTime dateTime = QDateTime::fromString(query.value(0).toString(), "yyyy-MM-dd hh:mm:ss"); + dateTime.setTimeSpec(Qt::UTC); + QString dateStr = dateTime.toLocalTime().toString(tr("dd MMMM yyyy")); + QString timeStr = dateTime.toLocalTime().toString(tr("hh:mm:ss")); + int topLevelCount = m_ui->historyTreeWidget->topLevelItemCount(); + + if(!topLevelCount) + { + m_ui->historyTreeWidget->addTopLevelItem(new QTreeWidgetItem()); + m_ui->historyTreeWidget->topLevelItem(topLevelCount++)->setText(0, dateStr); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setFirstColumnSpanned(true); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setTextAlignment(0, Qt::AlignCenter); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setBackgroundColor(0, bgColor); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setTextColor(0, textColor); + } + else if(m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->text(0) != dateStr) + { + m_ui->historyTreeWidget->addTopLevelItem(new QTreeWidgetItem()); + m_ui->historyTreeWidget->topLevelItem(topLevelCount++)->setText(0, dateStr); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setFirstColumnSpanned(true); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setTextAlignment(0, Qt::AlignCenter); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setBackgroundColor(0, bgColor); + m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1)->setTextColor(0, textColor); + } + + QTreeWidgetItem *topLevelItem = m_ui->historyTreeWidget->topLevelItem(topLevelCount - 1); + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, timeStr); + item->setText(1, m_formatter.format(info)); + topLevelItem->addChild(item); + } + + m_ui->historyTreeWidget->expandAll(); +} + +void HistoryWindow::loadDistribution() +{ + m_ui->distributionTreeWidget->clear(); + + if(!m_db.isOpen()) + return; + + QSqlQuery query(m_db); + + query.prepare("SELECT max(c) FROM( SELECT count(*) as c FROM track_history WHERE Timestamp BETWEEN :from and :to " + "GROUP BY date(Timestamp, 'localtime'))"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + if(!query.next()) + { + qWarning("HistoryWindow: empty result"); + return; + } + int maxCount = query.value(0).toInt(); + query.finish(); + + query.prepare("SELECT count(*), date(Timestamp, 'localtime') FROM track_history WHERE Timestamp BETWEEN :from and :to " + "GROUP BY date(Timestamp, 'localtime')"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + + QColor bgColor = palette().color(QPalette::Highlight); + QColor textColor = palette().color(QPalette::HighlightedText); + + while (query.next()) + { + QDate date = QDate::fromString(query.value(1).toString(), "yyyy-MM-dd"); + QString monthStr = date.toString(tr("MM-yyyy")); + QString dayStr = date.toString(tr("dd MMMM")); + int topLevelCount = m_ui->distributionTreeWidget->topLevelItemCount(); + + if(!topLevelCount) + { + m_ui->distributionTreeWidget->addTopLevelItem(new QTreeWidgetItem()); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount++)->setText(0, monthStr); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setFirstColumnSpanned(true); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setTextAlignment(0, Qt::AlignCenter); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setBackgroundColor(0, bgColor); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setTextColor(0, textColor); + } + else if(m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->text(0) != monthStr) + { + m_ui->distributionTreeWidget->addTopLevelItem(new QTreeWidgetItem()); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount++)->setText(0, monthStr); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setFirstColumnSpanned(true); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setTextAlignment(0, Qt::AlignCenter); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setBackgroundColor(0, bgColor); + m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1)->setTextColor(0, textColor); + } + + QTreeWidgetItem *topLevelItem = m_ui->distributionTreeWidget->topLevelItem(topLevelCount - 1); + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, dayStr); + topLevelItem->addChild(item); + item->setData(1, ProgressBarRole, true); + item->setData(1, ProgressBarMaxRole, maxCount); + item->setData(1, ProgressBarValueRole, query.value(0).toInt()); + } + + m_ui->distributionTreeWidget->expandAll(); +} + +void HistoryWindow::loadTopSongs() +{ + m_ui->topSongsTreeWidget->clear(); + + if(!m_db.isOpen()) + return; + + QSqlQuery query(m_db); + + query.prepare("SELECT count(*) as c,Timestamp,Title,Artist,AlbumArtist,Album,Comment,Genre,Composer,Track,Year,Duration,URL " + "FROM track_history WHERE Timestamp BETWEEN :from and :to " + "GROUP BY Artist,Title ORDER BY c DESC LIMIT 100"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + + int maxCount = 0; + + while (query.next()) + { + TrackInfo info; + info.setValue(Qmmp::TITLE, query.value(2).toString()); + info.setValue(Qmmp::ARTIST, query.value(3).toString()); + info.setValue(Qmmp::ALBUMARTIST, query.value(4).toString()); + info.setValue(Qmmp::ALBUM, query.value(5).toString()); + info.setValue(Qmmp::COMMENT, query.value(6).toString()); + info.setValue(Qmmp::GENRE, query.value(7).toString()); + info.setValue(Qmmp::COMPOSER, query.value(8).toString()); + info.setValue(Qmmp::TRACK, query.value(9).toString()); + info.setValue(Qmmp::YEAR, query.value(10).toString()); + info.setDuration(query.value(11).toInt()); + info.setPath(query.value(12).toString()); + + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, m_formatter.format(info)); + + m_ui->topSongsTreeWidget->addTopLevelItem(item); + + if(!maxCount) + maxCount = query.value(0).toInt(); + + item->setData(1, ProgressBarRole, true); + item->setData(1, ProgressBarMaxRole, maxCount); + item->setData(1, ProgressBarValueRole, query.value(0).toInt()); + } +} + +void HistoryWindow::loadTopArtists() +{ + m_ui->topArtistsTreeWidget->clear(); + + if(!m_db.isOpen()) + return; + + QSqlQuery query(m_db); + + query.prepare("SELECT count(*) as c,Artist " + "FROM track_history WHERE (Timestamp BETWEEN :from and :to) AND Artist NOT NULL " + "GROUP BY Artist ORDER BY c DESC LIMIT 100"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + + int maxCount = 0; + + while (query.next()) + { + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, query.value(1).toString()); + + m_ui->topArtistsTreeWidget->addTopLevelItem(item); + + if(!maxCount) + maxCount = query.value(0).toInt(); + + item->setData(1, ProgressBarRole, true); + item->setData(1, ProgressBarMaxRole, maxCount); + item->setData(1, ProgressBarValueRole, query.value(0).toInt()); + } +} + +void HistoryWindow::loadTopGenres() +{ + m_ui->topGenresTreeWidget->clear(); + + if(!m_db.isOpen()) + return; + + QSqlQuery query(m_db); + + query.prepare("SELECT count(*) as c,Genre " + "FROM track_history WHERE (Timestamp BETWEEN :from and :to) AND Genre NOT NULL " + "GROUP BY Genre ORDER BY c DESC LIMIT 100"); + query.bindValue(":from", m_ui->fromDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + query.bindValue(":to", m_ui->toDateEdit->dateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss")); + + if(!query.exec()) + { + qWarning("HistoryWindow: query error: %s", qPrintable(query.lastError().text())); + return; + } + + int maxCount = 0; + + while (query.next()) + { + QTreeWidgetItem *item = new QTreeWidgetItem(); + item->setText(0, query.value(1).toString()); + + m_ui->topGenresTreeWidget->addTopLevelItem(item); + + if(!maxCount) + maxCount = query.value(0).toInt(); + + item->setData(1, ProgressBarRole, true); + item->setData(1, ProgressBarMaxRole, maxCount); + item->setData(1, ProgressBarValueRole, query.value(0).toInt()); + } +} + +void HistoryWindow::readSettings() +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.beginGroup("History"); + restoreGeometry(settings.value("geometry").toByteArray()); + m_ui->historyTreeWidget->header()->restoreState(settings.value("history_state").toByteArray()); + m_ui->distributionTreeWidget->header()->restoreState(settings.value("distribution_state").toByteArray()); + m_ui->topSongsTreeWidget->header()->restoreState(settings.value("top_songs_state").toByteArray()); + m_ui->topArtistsTreeWidget->header()->restoreState(settings.value("top_artists_state").toByteArray()); + m_ui->topGenresTreeWidget->header()->restoreState(settings.value("top_genres_state").toByteArray()); + m_formatter.setPattern(settings.value("title_format", "%if(%p,%p - %t,%t)").toString()); + settings.endGroup(); +} + +void HistoryWindow::closeEvent(QCloseEvent *) +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.beginGroup("History"); + settings.setValue("geometry", saveGeometry()); + settings.setValue("history_state", m_ui->historyTreeWidget->header()->saveState()); + settings.setValue("distribution_state", m_ui->distributionTreeWidget->header()->saveState()); + settings.setValue("top_songs_state", m_ui->topSongsTreeWidget->header()->saveState()); + settings.setValue("top_artists_state", m_ui->topArtistsTreeWidget->header()->saveState()); + settings.setValue("top_genres_state", m_ui->topGenresTreeWidget->header()->saveState()); + settings.endGroup(); +} + +void HistoryWindow::on_executeButton_clicked() +{ + loadHistory(); + loadDistribution(); + loadTopSongs(); + loadTopArtists(); + loadTopGenres(); +} + +void HistoryWindow::on_lastWeekButton_clicked() +{ + QDateTime t = QDateTime::currentDateTime(); + t.setTime(QTime(23, 59, 0 ,0)); + m_ui->toDateEdit->setDateTime(t); + t.setTime(QTime(0, 0, 0, 0)); + t = t.addDays(-t.date().dayOfWeek() + 1); + m_ui->fromDateEdit->setDateTime(t); + on_executeButton_clicked(); +} + +void HistoryWindow::on_lastMonthButton_clicked() +{ + QDateTime t = QDateTime::currentDateTime(); + t.setTime(QTime(23, 59, 0 ,0)); + m_ui->toDateEdit->setDateTime(t); + t.setTime(QTime(0, 0, 0, 0)); + t.setDate(QDate(t.date().year(), t.date().month(), 1)); ; + m_ui->fromDateEdit->setDateTime(t); + on_executeButton_clicked(); +} + +void HistoryWindow::on_fromButton_clicked() +{ + DateInputDialog d(this); + d.setSelectedDate(m_ui->fromDateEdit->date()); + if(d.exec() == QDialog::Accepted) + m_ui->fromDateEdit->setDate(d.selectedDate()); +} + +void HistoryWindow::on_toButton_clicked() +{ + DateInputDialog d(this); + d.setSelectedDate(m_ui->toDateEdit->date()); + if(d.exec() == QDialog::Accepted) + m_ui->toDateEdit->setDate(d.selectedDate()); +} diff --git a/src/plugins/General/history/historywindow.h b/src/plugins/General/history/historywindow.h new file mode 100644 index 000000000..754cbef8e --- /dev/null +++ b/src/plugins/General/history/historywindow.h @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef HISTORYWINDOW_H +#define HISTORYWINDOW_H + +#include +#include +#include +#include +#include + +namespace Ui { +class HistoryWindow; +} + +class HistoryWindow : public QWidget +{ + Q_OBJECT +public: + explicit HistoryWindow(QSqlDatabase db, QWidget *parent = 0); + ~HistoryWindow(); + +private slots: + void on_executeButton_clicked(); + void on_lastWeekButton_clicked(); + void on_lastMonthButton_clicked(); + void on_fromButton_clicked(); + void on_toButton_clicked(); + +private: + void loadHistory(); + void loadDistribution(); + void loadTopSongs(); + void loadTopArtists(); + void loadTopGenres(); + void readSettings(); + void closeEvent(QCloseEvent *); + + Ui::HistoryWindow *m_ui; + QSqlDatabase m_db; + MetaDataFormatter m_formatter; +}; + +#endif // HISTORYWINDOW_H diff --git a/src/plugins/General/history/historywindow.ui b/src/plugins/General/history/historywindow.ui new file mode 100644 index 000000000..91e50ea36 --- /dev/null +++ b/src/plugins/General/history/historywindow.ui @@ -0,0 +1,279 @@ + + + HistoryWindow + + + + 0 + 0 + 773 + 569 + + + + History + + + + 6 + + + 6 + + + 6 + + + + + Time Range + + + + + + From: + + + + + + + + + + ... + + + + + + + To: + + + + + + + + + + ... + + + + + + + Last week + + + + + + + Last month + + + + + + + Execute + + + + + + + + + + Qt::Horizontal + + + + 234 + 20 + + + + + + + + 0 + + + + History + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + true + + + true + + + + Time + + + + + Song + + + + + + + + + Distribution + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + + Day + + + + + Play counts + + + + + + + + + Top Songs + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + + Song + + + + + Play counts + + + + + + + + + Top Artists + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + + Artist + + + + + Play counts + + + + + + + + + Top Genres + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + + Genre + + + + + Play counts + + + + + + + + + + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + rejected() + HistoryWindow + close() + + + 691 + 496 + + + 750 + 516 + + + + + diff --git a/src/plugins/General/history/progressbaritemdelegate.cpp b/src/plugins/General/history/progressbaritemdelegate.cpp new file mode 100644 index 000000000..51841bcd9 --- /dev/null +++ b/src/plugins/General/history/progressbaritemdelegate.cpp @@ -0,0 +1,71 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include +#include +#include "progressbaritemdelegate.h" + +ProgressBarItemDelegate::ProgressBarItemDelegate(QObject *parent) : QStyledItemDelegate(parent) +{ +} + +void ProgressBarItemDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + if (hasProgressBar(index)) + { + QStyleOptionViewItem opt = option; + + initStyleOption(&opt, index); + + QStyleOptionProgressBar progressBarOption; + progressBarOption.rect = option.rect; + progressBarOption.invertedAppearance = false; + progressBarOption.bottomToTop = false; + progressBarOption.text = index.data(ProgressBarValueRole).toString(); + progressBarOption.minimum = 0; + progressBarOption.maximum = index.data(ProgressBarMaxRole).toInt(); + progressBarOption.progress = index.data(ProgressBarValueRole).toInt(); + progressBarOption.textVisible = true; + progressBarOption.palette = opt.palette; + qApp->style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter); + } + else + { + QStyledItemDelegate::paint(painter, option, index); + } +} + +QSize ProgressBarItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QSize size = QStyledItemDelegate::sizeHint(option, index); + if (hasProgressBar(index)) + { + int buttonHeight = qApp->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight, &option); + size.setHeight(qMax(size.height(), buttonHeight)); + } + return size; +} + +bool ProgressBarItemDelegate::hasProgressBar(const QModelIndex &index) const +{ + return index.data(ProgressBarRole).toBool(); +} diff --git a/src/plugins/General/history/progressbaritemdelegate.h b/src/plugins/General/history/progressbaritemdelegate.h new file mode 100644 index 000000000..9e8cf8e50 --- /dev/null +++ b/src/plugins/General/history/progressbaritemdelegate.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2017 by Ilya Kotov * + * forkotov02@ya.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef PROGRESSBARITEMDELEGATE_H +#define PROGRESSBARITEMDELEGATE_H + +#include +#include + +#define ProgressBarRole (Qt::UserRole + 1) +#define ProgressBarValueRole (Qt::UserRole + 2) +#define ProgressBarMaxRole (Qt::UserRole + 3) + +/*! + * @author Ilya Kotov + */ +class ProgressBarItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + explicit ProgressBarItemDelegate(QObject *parent = 0); + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + bool hasProgressBar(const QModelIndex &index) const; +}; + +#endif // PROGRESSBARITEMDELEGATE_H diff --git a/src/plugins/General/history/translations/history_plugin_bg.ts b/src/plugins/General/history/translations/history_plugin_bg.ts new file mode 100644 index 000000000..51dd59b77 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_bg.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_cs.ts b/src/plugins/General/history/translations/history_plugin_cs.ts new file mode 100644 index 000000000..fd475d6e0 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_cs.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + Formát titulku: + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + Umělec + + + + Top Genres + + + + + Genre + Žánr + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_de.ts b/src/plugins/General/history/translations/history_plugin_de.ts new file mode 100644 index 000000000..7d5a78c27 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_de.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Datum auswählen + + + + History + + + History + Chronik + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Geschrieben von: Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + Titelformat: + + + + HistoryWindow + + + + History + Chronik + + + + Time Range + Zeitspanne + + + + From: + Von: + + + + To: + Bis: + + + + Last week + Letzte Woche + + + + Last month + Letzter Monat + + + + Execute + Ausführen + + + + Time + Zeit + + + + + Song + Song + + + + Distribution + Distribution + + + + Day + Tag + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + Interpret + + + + Top Genres + + + + + Genre + Genre + + + + dd MMMM yyyy + tt MMMM jjjj + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-jjjj + + + + dd MMMM + tt MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_el.ts b/src/plugins/General/history/translations/history_plugin_el.ts new file mode 100644 index 000000000..d026207fe --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_el.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Επιλογή ημερομηνίας + + + + History + + + History + Ιστορικό + + + + HistoryFactory + + + Listening History Plugin + Πρόσθετο ιστορικού ακρόασης + + + + About Listening History Plugin + Περί του πρόσθετου ιστορικού ακρόασης + + + + Qmmp Listening History Plugin + Qmmp πρόσθετο ιστορικού ακρόασης + + + + This plugin collects information about listened tracks + Αυτό το πρόσθετο συλλέγει πληροφορίες σχετικά με τα εκτελεσμένα κομμάτια + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Γράφτηκε από τον: Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Ρυθμίσεις πρόσθετου ιστορικού ακρόασης + + + + Title format: + Μορφή τίτλου: + + + + HistoryWindow + + + + History + Ιστορικό + + + + Time Range + Χρονικό διάστημα + + + + From: + Από: + + + + To: + Προς: + + + + Last week + Περασμένη εβδομάδα + + + + Last month + Προηγούμενος μήνας + + + + Execute + Εκτέλεση + + + + Time + Ώρα + + + + + Song + Τραγούδι + + + + Distribution + Διανομή + + + + Day + Ημέρα + + + + + + + Play counts + Πλήθος εκτελέσεων + + + + Top Songs + Κορυφαία τραγούδια + + + + Top Artists + Κορυφαίοι καλλιτέχνες + + + + Artist + Καλλιτέχνης + + + + Top Genres + Κορυφαία είδη + + + + Genre + Είδος + + + + dd MMMM yyyy + dd MMMM yyyy + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-yyyy + + + + dd MMMM + dd MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_en.ts b/src/plugins/General/history/translations/history_plugin_en.ts new file mode 100644 index 000000000..57eb45767 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_en.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_es.ts b/src/plugins/General/history/translations/history_plugin_es.ts new file mode 100644 index 000000000..91b315a1e --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_es.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Fecha selecionada + + + + History + + + History + Historial + + + + HistoryFactory + + + Listening History Plugin + Módulo de Historia de Escucha + + + + About Listening History Plugin + Acerca del Módulo de Historia de Escucha + + + + Qmmp Listening History Plugin + Módulo de Historia de Escucha de Qmmp + + + + This plugin collects information about listened tracks + Este módulo colecta información acerca de las pistas escuchadas + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Escrito por: Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Configuración del Módulo de Historia de Escucha + + + + Title format: + Formato del título: + + + + HistoryWindow + + + + History + Historial + + + + Time Range + Rango de Tiempo + + + + From: + De: + + + + To: + Hasta: + + + + Last week + Semana pasada + + + + Last month + Mes pasado + + + + Execute + Ejecutar + + + + Time + Tiempo + + + + + Song + Canción + + + + Distribution + Distribución + + + + Day + Día + + + + + + + Play counts + Conteo de reproducciones + + + + Top Songs + Canciones más escuchadas + + + + Top Artists + Intérpretes más escuchados + + + + Artist + Intérprete + + + + Top Genres + Géneros más escuchados + + + + Genre + Género + + + + dd MMMM yyyy + dd MMMM yyyy + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-aaaa + + + + dd MMMM + dd MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_fi.ts b/src/plugins/General/history/translations/history_plugin_fi.ts new file mode 100644 index 000000000..007eb6f66 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_fi.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Valitse päivä + + + + History + + + History + Historia + + + + HistoryFactory + + + Listening History Plugin + Kuunteluhistorialiitännäinen + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + Tämä liitännäinen kerää tietoja kuunnelluista kappaleista + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Toteuttanut: Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Kuunteluhistorialiitännäisen asetukset + + + + Title format: + + + + + HistoryWindow + + + + History + Historia + + + + Time Range + Aikajana + + + + From: + Alkaa: + + + + To: + Päättyy: + + + + Last week + Viime viikko + + + + Last month + Viime kuukausi + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + Päivä + + + + + + + Play counts + Toistokerrat + + + + Top Songs + Suosituimmat kappaleet + + + + Top Artists + Suosituimmat artistit + + + + Artist + Artisti + + + + Top Genres + Suosituimmat tyylilajit + + + + Genre + Tyylilaji + + + + dd MMMM yyyy + + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_fr.ts b/src/plugins/General/history/translations/history_plugin_fr.ts new file mode 100644 index 000000000..58e363f81 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_fr.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Sélectionner une date + + + + History + + + History + Historique + + + + HistoryFactory + + + Listening History Plugin + Greffon d'Historique d'écoute + + + + About Listening History Plugin + À propos du greffon Historique d'écoute + + + + Qmmp Listening History Plugin + Greffon d'Historique d'écoute Qmmp + + + + This plugin collects information about listened tracks + Ce greffon collecte des données concernant les pistes écoutées + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Écrit par : Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Paramètres du greffon d'Historique d'écoute + + + + Title format: + Format du titre: + + + + HistoryWindow + + + + History + Historique + + + + Time Range + Intervalle de temps + + + + From: + Provient: + + + + To: + Vers: + + + + Last week + + + + + Last month + Le mois dernier + + + + Execute + Exécuter + + + + Time + Temps + + + + + Song + Musique + + + + Distribution + DIstribution + + + + Day + Jour + + + + + + + Play counts + Nombre d'écoutes + + + + Top Songs + Musique les plus écoutées + + + + Top Artists + Artistes les plus écoutés + + + + Artist + Artiste + + + + Top Genres + Genres les plus écoutés + + + + Genre + Genre + + + + dd MMMM yyyy + jj MMMM aaaa + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-aaaa + + + + dd MMMM + jj MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_gl_ES.ts b/src/plugins/General/history/translations/history_plugin_gl_ES.ts new file mode 100644 index 000000000..f98a99160 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_gl_ES.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Data seleccionada + + + + History + + + History + Historial + + + + HistoryFactory + + + Listening History Plugin + Plugin Listening History + + + + About Listening History Plugin + Acerca do plugin Listening History + + + + Qmmp Listening History Plugin + Plugin Qmmp Listening History + + + + This plugin collects information about listened tracks + Este plugin recopila información sobre as cancións escoitadas + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Configuracións do plugin Listening History + + + + Title format: + Formato de título: + + + + HistoryWindow + + + + History + Historial + + + + Time Range + Rango de tempo + + + + From: + Dende: + + + + To: + Ata: + + + + Last week + Última semán + + + + Last month + Último mes + + + + Execute + Executar + + + + Time + Tempo + + + + + Song + Canción + + + + Distribution + Distribución + + + + Day + Día + + + + + + + Play counts + Contador de reproduccións + + + + Top Songs + Cancións populares + + + + Top Artists + Artistas populares + + + + Artist + Artista + + + + Top Genres + Xéneros populares + + + + Genre + Xénero + + + + dd MMMM yyyy + dd MMMM yyyy + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-yyyy + + + + dd MMMM + dd MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_he.ts b/src/plugins/General/history/translations/history_plugin_he.ts new file mode 100644 index 000000000..62c2e9b4c --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_he.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + בחר תאריך + + + + History + + + History + היסטוריה + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + פורמט כותרת: + + + + HistoryWindow + + + + History + היסטוריה + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + אמן + + + + Top Genres + + + + + Genre + ז׳אנר + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_hu.ts b/src/plugins/General/history/translations/history_plugin_hu.ts new file mode 100644 index 000000000..dd8c65c17 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_hu.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_id.ts b/src/plugins/General/history/translations/history_plugin_id.ts new file mode 100644 index 000000000..aabac4df6 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_id.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_it.ts b/src/plugins/General/history/translations/history_plugin_it.ts new file mode 100644 index 000000000..ec26c6d20 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_it.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_ja.ts b/src/plugins/General/history/translations/history_plugin_ja.ts new file mode 100644 index 000000000..255b02aa2 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_ja.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + 日時選択 + + + + History + + + History + 履歴 + + + + HistoryFactory + + + Listening History Plugin + 視聴履歴プラグイン + + + + About Listening History Plugin + 視聴履歴プラグインについて + + + + Qmmp Listening History Plugin + QMMP 視聴履歴プラグイン + + + + This plugin collects information about listened tracks + このプラグインは視聴したトラックの情報を収集します + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + 制作: Илья Котов (Ilya Kotov) <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + 視聴プラグインの設定 + + + + Title format: + 表題の書式: + + + + HistoryWindow + + + + History + 履歴 + + + + Time Range + 期間 + + + + From: + 自: + + + + To: + 至: + + + + Last week + 先週 + + + + Last month + 先月 + + + + Execute + 抽出 + + + + Time + 時刻 + + + + + Song + 演目 + + + + Distribution + 普及 + + + + Day + 日付 + + + + + + + Play counts + 配信回数 + + + + Top Songs + 上位の演目 + + + + Top Artists + 上位のアーティスト + + + + Artist + アーティスト + + + + Top Genres + 上位のジャンル + + + + Genre + ジャンル + + + + dd MMMM yyyy + yyyy年MM月dd日 + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + yyyy年MM月 + + + + dd MMMM + MM月dd日 + + + diff --git a/src/plugins/General/history/translations/history_plugin_kk.ts b/src/plugins/General/history/translations/history_plugin_kk.ts new file mode 100644 index 000000000..4741908e5 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_kk.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_lt.ts b/src/plugins/General/history/translations/history_plugin_lt.ts new file mode 100644 index 000000000..54ceb119a --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_lt.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_nl.ts b/src/plugins/General/history/translations/history_plugin_nl.ts new file mode 100644 index 000000000..29f2c251b --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_nl.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_pl_PL.ts b/src/plugins/General/history/translations/history_plugin_pl_PL.ts new file mode 100644 index 000000000..3505f834f --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_pl_PL.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + Format tytułu: + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + Artysta + + + + Top Genres + + + + + Genre + Gatunek + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_pt.ts b/src/plugins/General/history/translations/history_plugin_pt.ts new file mode 100644 index 000000000..92531495a --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_pt.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Selecionar data + + + + History + + + History + Histórico + + + + HistoryFactory + + + Listening History Plugin + Suplemento Listening History + + + + About Listening History Plugin + Sobre o suplemento Listening History + + + + Qmmp Listening History Plugin + Suplemento Listening History + + + + This plugin collects information about listened tracks + Este suplemento recolhe informações sobre as faixas reproduzidas + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Desenvolvido por: Ilya Kotov <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Definições + + + + Title format: + Formato do título: + + + + HistoryWindow + + + + History + Histórico + + + + Time Range + Intervalo de tempo + + + + From: + Desde: + + + + To: + Até: + + + + Last week + Última semana + + + + Last month + Último mês + + + + Execute + Executar + + + + Time + Tempo + + + + + Song + Faixa + + + + Distribution + Distribuição + + + + Day + Dia + + + + + + + Play counts + Reproduções + + + + Top Songs + Faixas mais ouvidas + + + + Top Artists + Artistas mais ouvidos + + + + Artist + Artista + + + + Top Genres + Géneros mais ouvidos + + + + Genre + Género + + + + dd MMMM yyyy + dd MMMM yyyy + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-yyyy + + + + dd MMMM + dd MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_pt_BR.ts b/src/plugins/General/history/translations/history_plugin_pt_BR.ts new file mode 100644 index 000000000..e60fdf9cf --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_pt_BR.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + Formato dos títulos: + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + Artista + + + + Top Genres + + + + + Genre + Gênero + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_ru.ts b/src/plugins/General/history/translations/history_plugin_ru.ts new file mode 100644 index 000000000..6ddadf2c5 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_ru.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Выберите дату + + + + History + + + History + Журнал + + + + HistoryFactory + + + Listening History Plugin + Модуль журнала + + + + About Listening History Plugin + О модуле журнала прослушиваний + + + + Qmmp Listening History Plugin + Модуль журнала прослушиваний для Qmmp + + + + This plugin collects information about listened tracks + Данный модуль собирает информацию о прослушенных треках + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Разработчик: Илья Котов <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Настройки модуля журнала + + + + Title format: + Формат названия: + + + + HistoryWindow + + + + History + Журнал + + + + Time Range + Диапазон времени + + + + From: + От: + + + + To: + До: + + + + Last week + Последняя неделя + + + + Last month + Последний месяц + + + + Execute + Выполнить + + + + Time + Время + + + + + Song + Композиция + + + + Distribution + Распределение + + + + Day + День + + + + + + + Play counts + Число проигрываний + + + + Top Songs + Лучшие композиции + + + + Top Artists + Лучшие исполнители + + + + Artist + Исполнитель + + + + Top Genres + Лучшие жанры + + + + Genre + Жанр + + + + dd MMMM yyyy + dd MMMM yyyy + + + + hh:mm:ss + hh:mm:ss + + + + MM-yyyy + MM-yyyy + + + + dd MMMM + dd MMMM + + + diff --git a/src/plugins/General/history/translations/history_plugin_sk.ts b/src/plugins/General/history/translations/history_plugin_sk.ts new file mode 100644 index 000000000..a47a71991 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_sk.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_sr_BA.ts b/src/plugins/General/history/translations/history_plugin_sr_BA.ts new file mode 100644 index 000000000..89e89940c --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_sr_BA.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_sr_RS.ts b/src/plugins/General/history/translations/history_plugin_sr_RS.ts new file mode 100644 index 000000000..2af239747 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_sr_RS.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_tr.ts b/src/plugins/General/history/translations/history_plugin_tr.ts new file mode 100644 index 000000000..4f6771fc5 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_tr.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_uk_UA.ts b/src/plugins/General/history/translations/history_plugin_uk_UA.ts new file mode 100644 index 000000000..8432dca54 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_uk_UA.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + Виберіть дату + + + + History + + + History + Журнал + + + + HistoryFactory + + + Listening History Plugin + Модуль журнала + + + + About Listening History Plugin + Про модуль журнала прослуховування + + + + Qmmp Listening History Plugin + Модуль журнала прослуховування для Qmmp + + + + This plugin collects information about listened tracks + Цей модуль збирає інформацію про прослухані треки + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + Розробник: Ілля Котов <forkotov02@ya.ru> + + + + HistorySettingsDialog + + + Listening History Plugin Settings + Налаштування модуля журнала + + + + Title format: + Формат назви: + + + + HistoryWindow + + + + History + Журнал + + + + Time Range + Проміжок часу + + + + From: + Від: + + + + To: + До: + + + + Last week + Крайній тиждень + + + + Last month + Крайній місяць + + + + Execute + Виконати + + + + Time + Час + + + + + Song + Композиція + + + + Distribution + Видавництво + + + + Day + День + + + + + + + Play counts + Число відтворень + + + + Top Songs + Кращі композиції + + + + Top Artists + Кращі виконавці + + + + Artist + Виконавець + + + + Top Genres + Кращі жанри + + + + Genre + Жанр + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_zh_CN.ts b/src/plugins/General/history/translations/history_plugin_zh_CN.ts new file mode 100644 index 000000000..aff71d714 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_zh_CN.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + 标题格式: + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + 艺术家 + + + + Top Genres + + + + + Genre + 风格 + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/history_plugin_zh_TW.ts b/src/plugins/General/history/translations/history_plugin_zh_TW.ts new file mode 100644 index 000000000..e208105d3 --- /dev/null +++ b/src/plugins/General/history/translations/history_plugin_zh_TW.ts @@ -0,0 +1,174 @@ + + + + + DateInputDialog + + + Select Date + + + + + History + + + History + + + + + HistoryFactory + + + Listening History Plugin + + + + + About Listening History Plugin + + + + + Qmmp Listening History Plugin + + + + + This plugin collects information about listened tracks + + + + + Written by: Ilya Kotov <forkotov02@ya.ru> + + + + + HistorySettingsDialog + + + Listening History Plugin Settings + + + + + Title format: + + + + + HistoryWindow + + + + History + + + + + Time Range + + + + + From: + + + + + To: + + + + + Last week + + + + + Last month + + + + + Execute + + + + + Time + + + + + + Song + + + + + Distribution + + + + + Day + + + + + + + + Play counts + + + + + Top Songs + + + + + Top Artists + + + + + Artist + + + + + Top Genres + + + + + Genre + + + + + dd MMMM yyyy + + + + + hh:mm:ss + + + + + MM-yyyy + + + + + dd MMMM + + + + diff --git a/src/plugins/General/history/translations/translations.qrc b/src/plugins/General/history/translations/translations.qrc new file mode 100644 index 000000000..4dc7ffdb9 --- /dev/null +++ b/src/plugins/General/history/translations/translations.qrc @@ -0,0 +1,32 @@ + + + + history_plugin_ru.qm + history_plugin_uk_UA.qm + history_plugin_zh_CN.qm + history_plugin_zh_TW.qm + history_plugin_tr.qm + history_plugin_cs.qm + history_plugin_pt_BR.qm + history_plugin_pt.qm + history_plugin_de.qm + history_plugin_pl_PL.qm + history_plugin_fr.qm + history_plugin_it.qm + history_plugin_kk.qm + history_plugin_lt.qm + history_plugin_hu.qm + history_plugin_nl.qm + history_plugin_ja.qm + history_plugin_sk.qm + history_plugin_es.qm + history_plugin_he.qm + history_plugin_gl_ES.qm + history_plugin_sr_BA.qm + history_plugin_sr_RS.qm + history_plugin_bg.qm + history_plugin_el.qm + history_plugin_id.qm + history_plugin_fi.qm + + -- cgit v1.2.3-13-gbd6f