Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

radio.cpp 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include "radio.h"
  2. #include "yaml-cpp/yaml.h"
  3. #include <QDebug>
  4. #include <QUrlQuery>
  5. Radio::Radio(QObject *parent) : QObject(parent), logo(0, 0)
  6. {
  7. mgr = 0;
  8. logoTries = 0;
  9. currentSong = 0;
  10. songsTries = 0;
  11. streamTries = 0;
  12. stream = 0;
  13. songTimer = new QTimer(this);
  14. songTimer->setSingleShot(true);
  15. connect(songTimer, SIGNAL(timeout()), this, SLOT(songEnded()));
  16. }
  17. QString Radio::getName()
  18. {
  19. return name;
  20. }
  21. QString Radio::getClaim()
  22. {
  23. return claim;
  24. }
  25. QColor Radio::getTextColor()
  26. {
  27. return textColor;
  28. }
  29. QUrl Radio::getLogoUrl()
  30. {
  31. return logoUrl;
  32. }
  33. QUrl Radio::getStreamUrl()
  34. {
  35. return streamUrl;
  36. }
  37. int Radio::getId()
  38. {
  39. return id;
  40. }
  41. QUrl Radio::getApiBase()
  42. {
  43. return apiBase;
  44. }
  45. QUrl Radio::getCoverBase()
  46. {
  47. return coverBase;
  48. }
  49. Song *Radio::getCurrentSong()
  50. {
  51. return currentSong;
  52. }
  53. QNetworkReply *Radio::getStream()
  54. {
  55. return stream;
  56. }
  57. void Radio::setName(QString n)
  58. {
  59. name = n;
  60. }
  61. void Radio::setClaim(QString c)
  62. {
  63. claim = c;
  64. }
  65. void Radio::setTextColor(QColor c)
  66. {
  67. textColor = c;
  68. }
  69. void Radio::setLogoUrl(QUrl u)
  70. {
  71. logoUrl = u;
  72. }
  73. void Radio::setStreamUrl(QUrl u)
  74. {
  75. streamUrl = u;
  76. }
  77. void Radio::setId(int i)
  78. {
  79. id = i;
  80. }
  81. void Radio::setApiBase(QUrl u)
  82. {
  83. apiBase = u;
  84. }
  85. void Radio::setCoverBase(QUrl u)
  86. {
  87. coverBase = u;
  88. }
  89. void Radio::setCurrentSong(Song *s)
  90. {
  91. if(currentSong != 0)
  92. currentSong->deleteLater();
  93. currentSong = s;
  94. songTimer->stop();
  95. if(s->getDuration() < 0)
  96. qDebug()<<s->getDuration()<<name;
  97. songTimer->setInterval(s->getDuration());
  98. songTimer->start();
  99. nextSongs.removeOne(currentSong);
  100. updateNextSongs();
  101. emit songChanged(currentSong);
  102. }
  103. void Radio::updateNextSongs()
  104. {
  105. songsTries = 0;
  106. QUrl url = apiBase;
  107. QUrlQuery query;
  108. query.addQueryItem("act", "get_plist");
  109. query.addQueryItem("id_wr", QString::number(id));
  110. url.setQuery(query);
  111. QNetworkReply* reply = mgr->get(QNetworkRequest(url));
  112. connect(reply, SIGNAL(finished()), this, SLOT(songsFinished()));
  113. connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(songsError(QNetworkReply::NetworkError)));
  114. }
  115. void Radio::downloadLogo()
  116. {
  117. if(logo.isNull())
  118. {
  119. logoTries = 0;
  120. QNetworkReply* reply = mgr->get(QNetworkRequest(logoUrl));
  121. connect(reply, SIGNAL(finished()), this, SLOT(logoFinished()));
  122. connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(logoError(QNetworkReply::NetworkError)));
  123. }
  124. else
  125. emit logoDownloaded(logo);
  126. }
  127. void Radio::startStream()
  128. {
  129. stopStream();
  130. streamTries = 0;
  131. stream = mgr->get(QNetworkRequest(streamUrl));
  132. stream->setReadBufferSize(128);
  133. connect(stream, SIGNAL(readyRead()), this, SLOT(streamRead()));
  134. emit streamChanged(stream);
  135. }
  136. void Radio::stopStream()
  137. {
  138. if(stream != 0)
  139. {
  140. stream->abort();
  141. stream->deleteLater();
  142. stream = 0;
  143. }
  144. }
  145. void Radio::logoFinished()
  146. {
  147. QNetworkReply* reply = (QNetworkReply*)sender();
  148. if(logo.loadFromData(reply->readAll()) && !logo.isNull())
  149. emit logoDownloaded(logo);
  150. }
  151. void Radio::logoError(QNetworkReply::NetworkError)
  152. {
  153. if(logoTries < 3)
  154. {
  155. ++logoTries;
  156. downloadLogo();
  157. }
  158. }
  159. void Radio::songsFinished()
  160. {
  161. QNetworkReply* reply = (QNetworkReply*)sender();
  162. YAML::Node itms = YAML::Load(reply->readAll().constData())["itms"];
  163. qDeleteAll(nextSongs);
  164. for(unsigned i = 1;i < itms.size(); ++i)
  165. {
  166. YAML::Node itm = itms[i];
  167. if(itm["id"].as<int>() == -1)
  168. continue;
  169. Song* song = new Song(this);
  170. song->setDuration(itm["t_dur"].as<int>());
  171. song->setArtist(itm["art"].as<std::string>().c_str());
  172. song->setTitle(itm["tit"].as<std::string>().c_str());
  173. QUrl url = coverBase;
  174. url.setPath(url.path() + itm["cov"].as<std::string>().c_str());
  175. song->setCoverUrl(url);
  176. nextSongs.append(song);
  177. }
  178. }
  179. void Radio::songsError(QNetworkReply::NetworkError)
  180. {
  181. if(songsTries < 3)
  182. {
  183. ++songsTries;
  184. updateNextSongs();
  185. }
  186. }
  187. void Radio::streamRead()
  188. {
  189. if(stream->header(QNetworkRequest::LocationHeader).toUrl().isEmpty())
  190. emit streamData(stream->readAll());
  191. else
  192. {
  193. streamUrl = stream->header(QNetworkRequest::LocationHeader).toUrl();
  194. stopStream();
  195. startStream();
  196. }
  197. }
  198. void Radio::streamError()
  199. {
  200. if(streamTries < 3)
  201. {
  202. ++streamTries;
  203. stopStream();
  204. startStream();
  205. }
  206. }
  207. void Radio::songEnded()
  208. {
  209. if(!nextSongs.isEmpty())
  210. setCurrentSong(nextSongs.at(0));
  211. }
  212. void Radio::setNetworkManager(QNetworkAccessManager *m)
  213. {
  214. mgr = m;
  215. }