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