new file: Groove.pro
[groove] / gscom.cpp
1 #include "gscom.h"
2 #include <parser.h>
3 #include <serializer.h>
4 #include <QCryptographicHash>
5 //#include <QApplication>
6
7 gscom::gscom()
8 {
9     manager = new QNetworkAccessManager(this);
10     connect(manager, SIGNAL(finished(QNetworkReply*)),
11             this, SLOT(replyFinished(QNetworkReply*)));
12     cookies = manager->cookieJar();
13     currentaction = getPHP;
14     manager->get(QNetworkRequest(QUrl(QString("http://") + GS_LISTEN)));
15     phpSession = new QString("none");
16     sessionKey = new QString("none");
17     firstR = true;
18     model = new QStandardItemModel();
19     model->setHorizontalHeaderLabels(
20         QStringList() << "Online");
21     addDebugMsg("You may now search for a song");
22     //getSessionKey();
23 }
24
25 QStandardItemModel* gscom::getSongModel(QString song)
26 {
27     model = new QStandardItemModel();
28     model->setHorizontalHeaderLabels(
29         QStringList() << "Searching..");
30     addDebugMsg("Fetching Song List...");
31
32     if(currentaction != none)
33     {
34         addDebugMsg("Error: communication is busy Try again later");
35         return model;
36     }
37     else
38     {
39         QString *token = getToken(getSearchResults);
40         qDebug() << token->toAscii();
41         QNetworkRequest request;
42         request.setUrl(QUrl("http://cowbell.grooveshark.com/more.php?getSearchResults"));
43         request.setHeader(request.ContentTypeHeader,QVariant("application/json"));
44         QVariantMap jlist;
45         QVariantMap header;
46         //header.insert("uuid","DEA8E133-2080-F666-4B38-9465187B20A9");
47         header.insert("session",phpSession->toUtf8());
48         header.insert("client","gslite");
49         header.insert("clientRevision","20100412.09");
50         header.insert("token",token->toAscii());
51         jlist.insert("method","getSearchResults");
52         jlist.insertMulti("header",header);
53         QVariantMap param;
54         param.insert("type","Songs");
55         param.insert("query",song.toAscii());
56         jlist.insertMulti("parameters",param);
57         QJson::Serializer *serializer = new QJson::Serializer();
58         //qDebug() << serializer->serialize(jlist);
59         manager->post(request,serializer->serialize(jlist));
60         currentaction = getSearchResults;
61     }
62
63     return model;
64 }
65 QStandardItemModel* gscom::getArtistModel(QString song)
66 {
67     model = new QStandardItemModel();
68     model->setHorizontalHeaderLabels(
69         QStringList() << "Searching..");
70     addDebugMsg("Fetching Song List...");
71
72     if(currentaction != none)
73     {
74         addDebugMsg("Error: communication is busy Try again later");
75         return model;
76     }
77     else
78     {
79         QString *token = getToken(getSearchResults);
80         qDebug() << token->toAscii();
81         QNetworkRequest request;
82         request.setUrl(QUrl("http://cowbell.grooveshark.com/more.php?getSearchResults"));
83         request.setHeader(request.ContentTypeHeader,QVariant("application/json"));
84         QVariantMap jlist;
85         QVariantMap header;
86         //header.insert("uuid","DEA8E133-2080-F666-4B38-9465187B20A9");
87         header.insert("session",phpSession->toUtf8());
88         header.insert("client","gslite");
89         header.insert("clientRevision","20100412.09");
90         header.insert("token",token->toAscii());
91         jlist.insert("method","getSearchResults");
92         jlist.insertMulti("header",header);
93         QVariantMap param;
94         param.insert("type","Artists");
95         param.insert("query",song.toAscii());
96         jlist.insertMulti("parameters",param);
97         QJson::Serializer *serializer = new QJson::Serializer();
98         //qDebug() << serializer->serialize(jlist);
99         manager->post(request,serializer->serialize(jlist));
100         currentaction = getSearchResults;
101     }
102
103     return model;
104 }
105 QStandardItemModel* gscom::getAlbumModel(QString song)
106 {
107     model = new QStandardItemModel();
108     model->setHorizontalHeaderLabels(
109         QStringList() << "Searching..");
110     addDebugMsg("Fetching Song List...");
111
112     if(currentaction != none)
113     {
114         addDebugMsg("Error: communication is busy Try again later");
115         return model;
116     }
117     else
118     {
119         QString *token = getToken(getSearchResults);
120         qDebug() << token->toAscii();
121         QNetworkRequest request;
122         request.setUrl(QUrl("http://cowbell.grooveshark.com/more.php?getSearchResults"));
123         request.setHeader(request.ContentTypeHeader,QVariant("application/json"));
124         QVariantMap jlist;
125         QVariantMap header;
126         //header.insert("uuid","DEA8E133-2080-F666-4B38-9465187B20A9");
127         header.insert("session",phpSession->toUtf8());
128         header.insert("client","gslite");
129         header.insert("clientRevision","20100412.09");
130         header.insert("token",token->toAscii());
131         jlist.insert("method","getSearchResults");
132         jlist.insertMulti("header",header);
133         QVariantMap param;
134         param.insert("type","Albums");
135         param.insert("query",song.toAscii());
136         jlist.insertMulti("parameters",param);
137         QJson::Serializer *serializer = new QJson::Serializer();
138         //qDebug() << serializer->serialize(jlist);
139         manager->post(request,serializer->serialize(jlist));
140         currentaction = getSearchResults;
141     }
142
143     return model;
144 }
145 void gscom::replyFinished(QNetworkReply *reply)
146 {
147     switch (currentaction)
148     {
149     case getStreamKeyFromSongIDEx:
150         {
151             qDebug() << "tester";
152             QJson::Parser parser;
153             bool ok;
154             QVariantMap result = parser.parse (reply->readAll(), &ok).toMap();
155             if (!ok) {
156               qFatal("An error occurred during parsing");
157               return;
158             }
159             QVariantMap results = result["result"].toMap();
160             this->streamID = results["streamKey"].toString();
161             this->sku = QUrl(QString("http://") + results["ip"].toString() + "/stream.php");
162             qDebug() << sku;
163             currentaction = none;
164             reply->close();
165             emit sKeyFound();
166         }
167         break;
168     case getPHP:
169         {
170             QList<QNetworkCookie> cookieList = cookies->cookiesForUrl(QUrl(QString("http://") + GS_LISTEN));
171             foreach(QNetworkCookie cookie, cookieList)
172             {
173                 if(cookie.name() == "PHPSESSID")
174                 {
175                     phpSession = new QString(cookie.value());
176                 }
177             }
178             reply->readAll();
179             reply->close();
180             qDebug() << phpSession->toAscii();
181             firstR = false;
182             currentaction = getCommunicationToken;
183             getSessionKey();
184
185         }
186         break;
187     case getCommunicationToken:
188         {
189             bool ok;
190             QJson::Parser parser;
191             QVariantMap result = parser.parse(reply->readAll(),&ok).toMap();
192             if(!ok)
193                 qDebug("Error parsing request");
194             else
195             {
196                 sessionKey = new QString(result["result"].toString());
197                 qDebug() << sessionKey->toAscii();
198             }
199             currentaction = none;
200             reply->close();
201             emit finishedSearch();
202         }
203         break;
204     case(getSearchResults):
205         {
206             QJson::Parser parser;
207             bool ok;
208             QVariantMap result = parser.parse (reply->readAll(), &ok).toMap();
209             if (!ok) {
210               qFatal("An error occurred during parsing");
211               return;
212             }
213             if(result.contains("fault"))
214             {
215                 currentaction = getPHP;
216                 manager->get(QNetworkRequest(QUrl(QString("http://") + GS_LISTEN)));
217                 qDebug() << reply->readAll();
218                 reply->close();
219                 return;
220             }
221             model->clear();
222             model->setHorizontalHeaderLabels(
223                 QStringList() << "Song"
224                               << "Artist"
225                               << "Song Id");
226
227
228             foreach (QVariant plugin, result["result"].toList()) {
229               QList<QStandardItem *> items;
230               QVariantMap nestedMap = plugin.toMap();
231               items.append(new QStandardItem(nestedMap["Name"].toString()));
232               items.append(new QStandardItem(nestedMap["ArtistName"].toString()));
233               items.append(new QStandardItem(nestedMap["SongID"].toString()));
234               model->appendRow(items);
235             }
236             currentaction = none;
237             reply->close();
238             emit finishedSearch();
239         }
240         break;
241     default:
242         qDebug() << reply->readAll();
243         reply->close();
244         currentaction=none;
245     }
246
247 }
248 QStandardItemModel* gscom::getModel()
249 {
250     return model;
251 }
252 void gscom::addDebugMsg(QString debug)
253 {
254     QList<QStringList> rows = QList<QStringList>()
255         << (QStringList() << debug);
256     foreach (QStringList row, rows) {
257         QList<QStandardItem *> items;
258         foreach (QString text, row)
259             items.append(new QStandardItem(text));
260         model->appendRow(items);
261     }
262     return;
263 }
264 QString* gscom::getToken(gMETHOD meth)
265 {
266     QCryptographicHash *hasher = new QCryptographicHash(QCryptographicHash::Sha1);
267     //generate six random numbers
268     QString rnum =  QString(qrand() %9 + 48)
269                     + QString(qrand() %9 + 48)
270                     + QString(qrand() %9 + 48)
271                     + QString(qrand() %9 + 48)
272                     + QString(qrand() %9 + 48)
273                     + QString(qrand() %9 + 48);
274     QString *data = new QString();
275     QString *string = new QString();
276     switch(meth)
277     {
278     case(getSearchResults):
279         data->append("getSearchResults");
280         break;
281     case(getStreamKeyFromSongIDEx):
282         data->append("getStreamKeyFromSongIDEx");
283         break;
284     default:
285         data->append("getSearchResults");
286     }
287     string->append(data);
288     string->append(":");
289     string->append(sessionKey->toAscii());
290     string->append(":quitStealinMahShit:");
291     string->append(rnum);
292     hasher->addData(string->toAscii());
293     QString *rs = new QString();
294     rs->append(rnum);
295     rs->append(hasher->result().toHex());
296     return rs;
297 }
298 void gscom::getSong(QString songid)
299 {
300     if(currentaction != none)
301     {
302         return;
303     }
304     else
305     {
306         QString *token = getToken(getStreamKeyFromSongIDEx);
307         qDebug() << token->toAscii();
308         QNetworkRequest request;
309         request.setUrl(QUrl("http://cowbell.grooveshark.com/more.php?getStreamKeyFromSongIdEx"));
310         request.setHeader(request.ContentTypeHeader,QVariant("application/json"));
311         QVariantMap jlist;
312         QVariantMap header;
313         //header.insert("uuid","DEA8E133-2080-F666-4B38-9465187B20A9");
314         header.insert("session",phpSession->toUtf8());
315         header.insert("client","gslite");
316         header.insert("clientRevision","20100412.09");
317         header.insert("token",token->toAscii());
318         jlist.insert("method","getStreamKeyFromSongIDEx");
319         jlist.insertMulti("header",header);
320         QVariantMap param;
321         QVariantMap country;
322         country.insert("CC1","0");
323         country.insert("CC3","0");
324         country.insert("ID","223");
325         country.insert("CC2","0");
326         country.insert("CC4","1073741824");
327         param.insertMulti("country",country);
328         param.insert("mobile",false);
329         param.insert("songID",songid.toAscii());
330         param.insert("prefetch",false);
331         jlist.insertMulti("parameters",param);
332         QJson::Serializer *serializer = new QJson::Serializer();
333         //qDebug() << serializer->serialize(jlist);
334         manager->post(request,serializer->serialize(jlist));
335         currentaction = getStreamKeyFromSongIDEx;
336     }
337     return;
338 }
339
340 void gscom::getSessionKey()
341 {
342     QNetworkRequest request; // = new QNetworkRequest(QUrl("https://cowbell.grooveshark.com/service.php"));
343     request.setUrl(QUrl("https://cowbell.grooveshark.com/service.php"));
344     request.setHeader(request.ContentTypeHeader,QVariant("application/json"));
345     QVariantMap jlist;
346     QVariantMap header;
347     //header.insert("uuid","DEA8E133-2080-F666-4B38-9465187B20A9");
348     //header.insert("session",phpSession->toUtf8());
349     header.insert("client","gslite");
350     header.insert("clientRevision","20100412.09");
351     jlist.insert("method","getCommunicationToken");
352     jlist.insertMulti("header",header);
353     QVariantMap param;
354     QCryptographicHash *hasher = new QCryptographicHash(QCryptographicHash::Md5);
355     hasher->addData(phpSession->toUtf8());
356     param.insert("secretKey",hasher->result().toHex());
357     jlist.insertMulti("parameters",param);
358     QJson::Serializer *serializer = new QJson::Serializer();
359     manager->post(request,serializer->serialize(jlist));
360 }