Rolled back debian/control deps changes
[maelyrica:maelyrica.git] / lyricsDownloader.h
1 /* File: main.cpp
2  *
3  * This file is part of MaeLyrica.
4  *
5  * Copyright (C) 2012 Marcin Mielniczuk.
6  *
7  * MaeLyrica is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, version 3 of the License.
10  *
11  * MaeLyrica is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  *  along with MaeLyrica.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef LYRICSDOWNLOADER_H
21 #define LYRICSDOWNLOADER_H
22
23 #include <sstream>
24 #include <curl/curl.h>
25 #include <QRegExp>
26 #include <QtNetwork/QNetworkConfigurationManager>
27
28 #include "settings.h"
29
30 using namespace std;
31
32 #define DEBUG 1
33
34 class LyricsDownloaderManager;
35
36 class lyricsDownloader : public QObject
37 {
38     Q_OBJECT
39     friend class LyricsDownloaderManager;
40 public:
41
42     virtual short perform(const string & a, const string & t);
43     /* Do all the activities needed for the lyrics to be shown to the user
44      * Return values:
45      * -1 - no internet
46      * 0  - OK
47      * 1  - Error downloading
48      * 2  - Error parsing
49      */
50
51 protected:
52     //lyricsDownloader(const string & a, const string & t ) : artist(a), track(t)
53
54     // settings object
55     // functions
56     virtual CURLcode download(const string& a, const string& t) ;
57     virtual string toProviderCode(const string& artist, const string& track) const = 0;
58     virtual bool parse() = 0;
59     // overloaded for QML functions
60     // data
61     //static const QString rooturl; // url for this provider
62     // helper stuff for curl
63     static size_t write_data_to_var(char *ptr, size_t size, size_t nmemb, void *userdata);
64     ostringstream buff;
65     QString lyrics_qstr; // lyrics are stored here until LyricsDownloaderManager gets them
66 };
67
68 ///////////////////////////////////////////////////////
69
70 class LyricsDownloaderManager : public QObject
71 {
72     Q_OBJECT
73     Q_ENUMS(LyricsDownloaderClass)
74 public:
75     Q_PROPERTY(QString lyrics READ getLyrics WRITE setLyrics NOTIFY lyricsChanged)
76     Q_PROPERTY(QString savedLyrics READ getSavedLyrics WRITE setSavedLyrics NOTIFY savedLyricsChanged)
77     Q_PROPERTY(bool theseLyricsSaved READ getTheseLyricsSaved NOTIFY theseLyricsSavedSignal)
78
79     enum LyricsDownloaderClass
80     {
81         AZLyricsDownloaderClass = 0,
82         LyricWikiDownloaderClass = 1,
83         ChartLyricsDownloaderClass = 2,
84         LyricsManiaDownloaderClass = 3
85
86     } currentClass;
87
88     LyricsDownloaderManager(LyricsDownloaderClass lyricsDownloaderName = AZLyricsDownloaderClass );
89     ~LyricsDownloaderManager();
90
91     Q_INVOKABLE void changeLyricsDownloader(LyricsDownloaderClass lyricsDownloaderName);
92
93     // functions working on data for any downloader
94     Q_INVOKABLE short perform();
95     Q_INVOKABLE inline void setData(const QString & a, const QString & t) // for QStrings
96         { artist = a.toStdString(); track = t.toStdString(); emit dataChanged(); }
97     Q_INVOKABLE inline void setData(const QString & str) {setData(str.split('-')); }
98     Q_INVOKABLE inline bool anyFieldEmpty() // check whether everything is filled
99         { if ( artist.empty() || track.empty() ) return true; else return false; }
100
101     Q_INVOKABLE inline bool lyricsExistMaeLyrica() {return progSettings.contains(savedLyricsKey);}
102     Q_INVOKABLE void saveLyricsMaeLyrica();
103     Q_INVOKABLE inline void deleteLyricsMaeLyrica() {progSettings.remove(savedLyricsKey);}
104
105     inline void setData(const string & a, const string & t) {artist = a; track = t;} // set artist and track
106 protected:
107     // internal functions
108     lyricsDownloader * newDownloader(LyricsDownloaderClass & name);
109     // internal data
110     lyricsDownloader * downloader;
111     string artist, track;
112     QString lyrics;
113     static Settings progSettings;
114
115     // additional internal data
116     QString savedLyricsKey;
117     static const QString recentSearchesUrl;
118     QString cleanedTitle;
119     QString cleanQString(QString qstr); // clean for saving, as in legacy OMP lyrics
120
121     // versions of public functions for internal usage only
122     inline void setData(const QStringList& list) // for a list "artist - track"
123         { artist = list[0].toStdString(); track = list[1].toStdString(); emit dataChanged(); }
124
125 private:
126     // Q _PROPERTY functions
127     inline void setLyrics(QString newlyrics) {lyrics = newlyrics;}
128     inline void setSavedLyrics(QString newlyrics) { progSettings.setValue(savedLyricsKey, newlyrics); emit savedLyricsChanged(newlyrics); }
129     inline QString getLyrics() const {return lyrics;}
130     inline QString getSavedLyrics() const {return progSettings.value(savedLyricsKey).value<QString>();}
131     inline bool getTheseLyricsSaved() const {return progSettings.contains(savedLyricsKey);}
132
133 signals: // for Q_PROPERTY
134     void dataChanged();
135     void lyricsChanged(QString);
136     void savedLyricsChanged(QString);
137     void theseLyricsSavedSignal(QString);
138
139 protected slots:
140     void findSavedLyricsKey() {savedLyricsKey = "lyrics/" + cleanedTitle;}
141     void cleanTitle();
142 };
143
144 #endif // LYRICSDOWNLOADER_H