]> git.sur5r.net Git - minitube/commitdiff
Removed synchronous http request
authorFlavio Tordini <flavio.tordini@gmail.com>
Wed, 24 Jun 2009 07:58:41 +0000 (09:58 +0200)
committerFlavio Tordini <flavio.tordini@gmail.com>
Wed, 24 Jun 2009 07:58:41 +0000 (09:58 +0200)
This fixes the search'n'stop crash

src/ListModel.cpp
src/ListModel.h
src/MediaView.cpp
src/MediaView.h
src/video.cpp
src/video.h

index ac97835bb325b72311fde92da643df48fe252ede..e794d3de3ddf68ef35419f45e27221669ac7fbf0 100755 (executable)
@@ -89,8 +89,8 @@ QVariant ListModel::data(const QModelIndex &index, int role) const {
             return tooltip;
             */
         
-         case StreamUrlRole:
-        return video->streamUrl();
+        // case StreamUrlRole:
+        // return video->streamUrl();
     }
     
     return QVariant();
index 5b1c9bff28caa030795726d39abfb4b9cdbdc6ad..1d6228be42725bc829df27d6e20a4eedaecbfbce 100755 (executable)
@@ -8,7 +8,6 @@
 enum DataRoles {
     ItemTypeRole = Qt::UserRole,
     VideoRole,
-    StreamUrlRole,
     ActiveTrackRole
 };
 
@@ -44,7 +43,7 @@ public:
     // custom methods
     void setActiveRow( int row );
     bool rowExists( int row ) const { return (( row >= 0 ) && ( row < videos.size() ) ); }
-    // int activeRow() const { return m_activeRow; } // returns -1 if there is no active row
+    int activeRow() const { return m_activeRow; } // returns -1 if there is no active row
     int nextRow() const;
     void removeIndexes(QModelIndexList &indexes);
     int rowForVideo(Video* video);
index c6c47df82023aeb5ec6b858ce213ee85f0008778..99641ecd5e12a4a67413abf1123cb89a45195bdd 100644 (file)
@@ -211,8 +211,16 @@ void MediaView::activeRowChanged(int row) {
     loadingWidget->setVideo(video);
     loadingWidget->show();
 
-    QUrl streamUrl = video->streamUrl();
-    // qDebug() << "setCurrentSource" << streamUrl.toString();
+    mediaObject->pause();
+
+    connect(video, SIGNAL(gotStreamUrl(QUrl)), SLOT(gotStreamUrl(QUrl)));
+    video->loadStreamUrl();
+
+    // see you in gotStreamUrl...
+
+}
+
+void MediaView::gotStreamUrl(QUrl streamUrl) {
 
     // go!
     mediaObject->setCurrentSource(streamUrl);
@@ -222,8 +230,11 @@ void MediaView::activeRowChanged(int row) {
     listModel->searchNeeded();
 
     // ensure active item is visible
-    QModelIndex index = listModel->index(row, 0, QModelIndex());
-    listView->scrollTo(index, QAbstractItemView::EnsureVisible);
+    int row = listModel->activeRow();
+    if (row != -1) {
+        QModelIndex index = listModel->index(row, 0, QModelIndex());
+        listView->scrollTo(index, QAbstractItemView::EnsureVisible);
+    }
 }
 
 void MediaView::itemActivated(const QModelIndex &index) {
index 9f6e5d6d88f6760de652fda19fb6f00e240338b2..f39097cbf13078a91a522641aa9bfb7342609840 100644 (file)
@@ -57,6 +57,7 @@ private slots:
     void aboutToFinish();
     void currentSourceChanged(const Phonon::MediaSource source);
     void showVideoContextMenu(QPoint point);
+    void gotStreamUrl(QUrl streamUrl);
     // bar
     void searchMostRelevant();
     void searchMostRecent();
index 96bb81f515bb12f66fb86d7cdce457b0c7190cb6..0e8d86021b9b3ca15ed35d12afc9aa88521d7f62 100644 (file)
@@ -26,12 +26,11 @@ const QImage Video::thumbnail() const {
     return m_thumbnail;
 }
 
-bool Video::getVideoUrl() {
+void Video::scrapeStreamUrl() {
 
     // https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/flashscraper.py
 
-    QUrl webpage = m_webpage;\
-    // if (webpage == ) return false;
+    QUrl webpage = m_webpage;
     // qDebug() << webpage.toString();
 
     // Get Video ID
@@ -39,8 +38,8 @@ bool Video::getVideoUrl() {
     // QRegExp re("^((?:http://)?(?:\\w+\\.)?youtube\\.com/(?:(?:v/)|(?:(?:watch(?:\\.php)?)?\\?(?:.+&)?v=)))?([0-9A-Za-z_-]+)(?(1).+)?$");
     QRegExp re("^http://www\\.youtube\\.com/watch\\?v=([0-9A-Za-z_-]+)$");
     bool match = re.exactMatch(webpage.toString());
-    if (!match || re.numCaptures() < 1) return false;
-    QString videoId = re.cap(1);
+    // if (!match || re.numCaptures() < 1) return false;
+    videoId = re.cap(1);
     // if (!videoId) return false;
     // qDebug() << videoId;
 
@@ -48,45 +47,12 @@ bool Video::getVideoUrl() {
     QUrl normalizedUrl = QUrl(QString("http://www.youtube.com/get_video_info?video_id=")
                               .append(videoId).append("&el=embedded&ps=default&eurl="));
 
-    /*
     QObject *reply = The::http()->get(normalizedUrl);
     connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray)));
-    return true;
-    */
 
-    QString videoInfo = The::http()->syncGetString(normalizedUrl);
-    // qDebug() << videoInfo;
-    re = QRegExp("^.*&token=([^&]+).*$");
-    match = re.exactMatch(videoInfo);
-    if (!match || re.numCaptures() < 1) return false;
-    QString videoToken = re.cap(1);
-    // FIXME proper decode
-    videoToken = videoToken.replace("%3D", "=");
-    // qDebug() << "token" << videoToken;
-
-    m_streamUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=")
-                         .append(videoId)
-                         .append("&t=").append(videoToken)
-                         .append("&eurl=&el=embedded&ps=default&fmt=18"));
-
-    // qDebug() << videoUrl;
-
-    // follow redirects
-    /*
-    while (true) {
-        QHttpResponseHeader headers = syncHttp->head(videoUrl);
-        qDebug() << headers.values();
-        if (headers.hasKey("Location")) {
-            videoUrl = QUrl(headers.value("Location"), QUrl::StrictMode);
-            // qDebug() << videoUrl;
-        } else break;
-    }*/
-
-    return true;
+    // see you in gotVideoInfo...
 }
 
-
-/*
 void  Video::gotVideoInfo(QByteArray data) {
     QString videoInfo = QString::fromUtf8(data);
     // qDebug() << videoInfo;
@@ -104,5 +70,6 @@ void  Video::gotVideoInfo(QByteArray data) {
                          .append("&eurl=&el=embedded&ps=default&fmt=18"));
 
     m_streamUrl = videoUrl;
+
+    emit gotStreamUrl(videoUrl);
 }
-*/
index 060305ae04a14c5454db2e89cedb803dd6115bc7..81e07346ca24a2e505b27eaf45bcd3b375eb4f00 100644 (file)
@@ -23,12 +23,11 @@ public:
     const QUrl webpage() const { return m_webpage; }
     void setWebpage( QUrl webpage ) { m_webpage = webpage; }
 
-    const QUrl streamUrl() {
+    void loadStreamUrl() {
         if (m_streamUrl.isEmpty())
-            this->getVideoUrl();
-        return m_streamUrl;
+            this->scrapeStreamUrl();
+        else emit gotStreamUrl(m_streamUrl);
     }
-    void setStreamUrl( QUrl streamUrl ) { m_streamUrl = streamUrl; }
 
     QList<QUrl> thumbnailUrls() const { return m_thumbnailUrls; }
     void addThumbnailUrl(QUrl url) {
@@ -52,12 +51,13 @@ public slots:
 
 signals:
     void gotThumbnail();
+    void gotStreamUrl(QUrl streamUrl);
 
 private slots:
-       // void gotVideoInfo(QByteArray);
+    void gotVideoInfo(QByteArray);
 
 private:
-    bool getVideoUrl();
+    void scrapeStreamUrl();
 
     QString m_title;
     QString m_description;
@@ -72,6 +72,9 @@ private:
     QDateTime m_published;
     int m_viewCount;
 
+    // The YouTube video id
+    // This is needed by the gotVideoInfo callback
+    QString videoId;
 };
 
 // This is required in order to use QPointer<Video> as a QVariant