X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=playlist.cpp;h=38eb57992335306bb64662cd2350fdf05693f77a;hb=21d90a736479e9eb1615db46297dca25115d5ea0;hp=10e1e26c618260f38af03a1ed05c323a6f0e76ea;hpb=14150f99aab8f21958b2698ceb97c38c6d478338;p=groove diff --git a/playlist.cpp b/playlist.cpp index 10e1e26..38eb579 100644 --- a/playlist.cpp +++ b/playlist.cpp @@ -6,11 +6,106 @@ playlist::playlist(QObject *parent) : manager = new QNetworkAccessManager(); this->currentdownloaditem = -1; pList = new QList; + this->currentplayingitem = -1; + this->currentSkeyItem = -1; + this->reply = NULL; } +void playlist::markPlayed(int position) +{ + if(0 <= position && position < pList->size()) + { + pList->at(position)->played = true; + this->freeMemory(position); + } +} +void playlist::freeMemory(int position) +{ + pList->at(position)->downloaded = false; + pList->at(position)->bufferready = false; + delete pList->at(position)->buffer; + pList->at(position)->buffer = new QBuffer(); +} +bool playlist::existAt(int position) +{ + if(position < 0) + return false; + return (pList->size() > position); +} + +int playlist::currentplaying() +{ + return this->currentplayingitem; +} +bool playlist::bReady(int b) +{ + if(pList->size() > b) + return pList->at(b)->bufferready; + else + return false; +} +void playlist::setBufferRdy(int b) +{ + pList->at(b)->bufferready = true; +} +void playlist::setCurrentPlaying(int position) +{ + if(this->existAt(position)) + { + this->currentplayingitem = position; + if(!pList->at(position)->downloaded && this->currentdownloaditem != this->currentplayingitem) + this->beginDownload(position); + /*if(pList->at(position)->bufferready == false &&) + { + if(!pList->at(position)->downloaded) + this->beginDownload(position); + } + else + emit this->bufferReady(position); + */ + return; + } + else + { + if(position == -1) + { + this->currentplayingitem = -1; + } + else + return; + } +} +QIODevice * playlist::getBuffer(int position) +{ + return pList->at(position)->buffer; +} + void playlist::beginDownload(int position) { - startStreamT = QTime::currentTime(); this->currentdownloaditem = position; + qDebug() << "StartDownlaod:" << pList->at(position)->songId; + QNetworkRequest req; + req.setUrl(*pList->at(currentdownloaditem)->server); + qDebug() << pList->at(currentdownloaditem)->server; + req.setHeader(req.ContentTypeHeader,QVariant("application/x-www-form-urlencoded")); + if(reply) + { + reply->disconnect(); + reply->deleteLater(); + } + reply = manager->post(req,QString("streamKey=" + pList->at(this->currentdownloaditem)->streamkey->toAscii()).toAscii()); + pList->at(this->currentdownloaditem)->buffer->open(QBuffer::ReadWrite | QBuffer::Truncate); + connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64))); + connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish())); + connect(this,SIGNAL(downloadComplete(int)),this,SLOT(downloadDone(int))); + connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError))); + startStreamT = QTime::currentTime(); +} +void playlist::getNError(QNetworkReply::NetworkError error) +{ + qDebug() << "Network Error (if this is 99 then it will retry" << error; + if(error == QNetworkReply::UnknownNetworkError && this->currentdownloaditem != -1) + beginDownload(this->currentdownloaditem); + } void playlist::setGscom(gscom *comm) @@ -20,87 +115,90 @@ void playlist::setGscom(gscom *comm) } void playlist::skeyFound() { - emit this->unfreeze(); + emit this->freeze(false); pList->at(this->currentSkeyItem)->streamkey = new QString(gs->streamID); pList->at(this->currentSkeyItem)->server = new QUrl(gs->sku); if(this->currentdownloaditem == -1) this->beginDownload(this->currentSkeyItem); + else + if(this->currentplaying() == this->currentSkeyItem) + this->beginDownload(this->currentSkeyItem); + this->currentSkeyItem = -1; } -void playlist::addSong(QStandardItem item) +int playlist::addSong(QStandardItem *item) { - playlist::songElement *newelement = new playlist::songElement; newelement->buffer = new QBuffer(); newelement->downloaded =false; - newelement->songId = new QString(item.text()); + newelement->songId = new QString(item->text()); newelement->played = false; newelement->server = new QUrl(); newelement->streamkey = new QString("noneatm"); newelement->bufferready = false; newelement->type = playlist::EStream; pList->append(newelement); - gs->getSong(item.text()); - emit this->freeze(); - //this->currentdownloaditem = pList->size()-1; + gs->getSong(item->text()); + + this->currentSkeyItem = pList->size()-1; + emit this->freeze(true); + return pList->size()-1; } void playlist::downloadDone(int position) { - if(pList->size() < position+1) + if(this->existAt(position+1) && this->currentSkeyItem == -1 && !pList->at(position+1)->downloaded && this->currentdownloaditem != position+1) beginDownload(position+1); else this->currentdownloaditem = -1; pList->at(position)->downloaded = true; } - -void playlist::downloadSlot(qint64 b, qint64 t) +void playlist::networkReplyFinish() { - //qDebug() << "Download: " << b << "Total: " << t; - if(b == 0 && t == 0) + qDebug() << "finish"; + QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); + if(url.toUrl().isValid()) { - QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - if(url.toUrl().isValid()) - { - QNetworkRequest req; - req.setUrl(url.toUrl()); - qDebug() << url; - reply = manager->get(req); - startStreamT = QTime::currentTime(); - //connect(reply,SIGNAL(finished()),this,SLOT(start())); - connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64))); - } - else + QNetworkRequest req; + req.setUrl(url.toUrl()); + qDebug() << url; + if(reply) { - //buffer->close(); - emit this->sFailure(this->currentdownloaditem,playlist::Other); - reply->close(); + reply->disconnect(); + reply->deleteLater(); } + reply = manager->get(req); + startStreamT = QTime::currentTime(); + //connect(reply,SIGNAL(finished()),this,SLOT(start())); + connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64))); + connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish())); + connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError))); } - else +} + +void playlist::downloadSlot(qint64 b, qint64 t) +{ + //qDebug() << "Download: " << b << "Total: " << t; + if(t != 0) { emit this->downloadProgress(this->currentdownloaditem,b,t); - pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll()); - //qDebug() << buffer->bytesAvailable(); - - /* - //buffer->seek(b); - qint64 last = buffer->pos(); - buffer->seek(buffer->bytesAvailable()+buffer->pos()); - qDebug() << buffer->write(reply->readAll()); - qDebug() << buffer->pos(); - //buffer->putChar() - buffer->seek(last); - //buffer->data().append(reply->readAll());*/ - //qDebug() << "Download speed (KB/S): " << b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024; - if ( b >= t*0.05 && !pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10) - { - emit this->bufferReady(this->currentdownloaditem); - qDebug() << "Buffer Ready"; - } - if (b==t) + if(existAt(this->currentdownloaditem)) { + pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll()); + //qDebug() << !pList->at(this->currentdownloaditem)->bufferready << this->currentdownloaditem; + if ( b >= t*0.05 && !pList->at(this->currentdownloaditem)->bufferready) + //if(!pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10) + { + this->setBufferRdy(this->currentdownloaditem); + emit this->bufferReady(this->currentdownloaditem); + + qDebug() << "Buffer Ready"; + } + if (b==t) + { emit this->downloadComplete(this->currentdownloaditem); + //emit this->bufferReady(this->currentdownloaditem); + } } } }