{"action":"created","comment":{"url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments/58377799","id":58377799,"diff_hunk":"@@ -0,0 +1,305 @@\n+/*\n+ * Bittorrent Client using Qt and libtorrent.\n+ * Copyright (C) 2016 Eugene Shalygin <eugene.shalygin@gmail.com>\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License\n+ * as published by the Free Software Foundation; either version 2\n+ * of the License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program; if not, write to the Free Software\n+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n+ *\n+ * In addition, as a special exception, the copyright holders give permission to\n+ * link this program with the OpenSSL project's \"OpenSSL\" library (or with\n+ * modified versions of it that use the same license as the \"OpenSSL\" library),\n+ * and distribute the linked executables. You must obey the GNU General Public\n+ * License in all respects for all of the code used other than \"OpenSSL\".  If you\n+ * modify file(s), you may extend this exception to your version of the file(s),\n+ * but you are not obligated to do so. If you do not wish to do so, delete this\n+ * exception statement from your version.\n+ */\n+\n+#include \"piecesbar.h\"\n+#include <QApplication>\n+#include <QHelpEvent>\n+#include <QPainter>\n+#include <QTextStream>\n+#include <QToolTip>\n+#include \"base/bittorrent/torrenthandle.h\"\n+#include \"base/utils/misc.h\"\n+\n+namespace {\n+    class PieceIndexToImagePos\n+    {\n+    public:\n+        PieceIndexToImagePos(const BitTorrent::TorrentHandle * const torrent, const QImage& image)\n+            : m_piecesCount(torrent->info().piecesCount())\n+            , m_imageWidth(image.width())\n+        {\n+        }\n+\n+        int imagePos(int pieceIndex) const\n+        {\n+            return static_cast<float>(pieceIndex) / (m_piecesCount - 1) * (m_imageWidth - 1);\n+        }\n+\n+        int pieceIndex(int imagePos) const\n+        {\n+            return static_cast<float>(imagePos) / (m_imageWidth - 1) * (m_piecesCount - 1);\n+        }\n+\n+    private:\n+        const int m_piecesCount;\n+        const int m_imageWidth;\n+    };\n+}\n+\n+PiecesBar::PiecesBar(bool local, QWidget *parent)\n+    : QWidget(parent)\n+    , m_local{local}\n+    , m_torrent{nullptr}\n+    , m_image{}\n+    , m_borderColor{palette().color(QPalette::Dark)}\n+    , m_bgColor{Qt::white}\n+    , m_pieceColor{Qt::blue}\n+    , m_pieceColors{}\n+    , m_hovered{false}\n+    , m_highlitedRegion{}\n+{\n+    updatePieceColors();\n+    setMouseTracking(true);\n+}\n+\n+void PiecesBar::setTorrent(BitTorrent::TorrentHandle *torrent)\n+{\n+    m_torrent = torrent;\n+    if (!m_torrent)\n+        clear();\n+}\n+\n+void PiecesBar::clear()\n+{\n+    m_image = QImage();\n+    update();\n+}\n+\n+void PiecesBar::setColors(const QColor &background, const QColor &border, const QColor &complete)\n+{\n+    m_bgColor = background;\n+    m_borderColor = border;\n+    m_pieceColor = complete;\n+\n+    updatePieceColors();\n+    requestImageUpdate();\n+}\n+\n+bool PiecesBar::event(QEvent *e)\n+{\n+    if (e->type() == QEvent::ToolTip) {\n+        showToolTip(static_cast<QHelpEvent*>(e));\n+        return true;\n+    }\n+    else {\n+        return QWidget::event(e);\n+    }\n+}\n+\n+void PiecesBar::enterEvent(QEvent *e)\n+{\n+    m_hovered = true;\n+    base::enterEvent(e);\n+}\n+\n+void PiecesBar::leaveEvent(QEvent *e)\n+{\n+    m_hovered = false;\n+    m_highlitedRegion = QRect();\n+    requestImageUpdate();\n+    base::leaveEvent(e);\n+}\n+\n+void PiecesBar::mouseMoveEvent(QMouseEvent *e)\n+{\n+    // if user pointed to a piece which is a part of a single large file,\n+    // we highlight the space, occupied by this file\n+    highlightFile(e->pos().x() - borderWidth);\n+    base::mouseMoveEvent(e);\n+}\n+\n+void PiecesBar::paintEvent(QPaintEvent *)\n+{\n+    QPainter painter(this);\n+    QRect imageRect(borderWidth, borderWidth, width() - 2 * borderWidth, height() - 2 * borderWidth);\n+    if (m_image.isNull()) {\n+        painter.setBrush(Qt::white);\n+        painter.drawRect(imageRect);\n+    }\n+    else {\n+        if (m_image.width() != imageRect.width())\n+            updateImage(m_image);\n+        painter.drawImage(imageRect, m_image);\n+    }\n+\n+    if (!m_highlitedRegion.isNull()) {\n+        QColor highlightColor {this->palette().color(QPalette::Active, QPalette::Highlight)};\n+        highlightColor.setAlphaF(0.35);\n+        QRect targetHighlightRect {m_highlitedRegion.adjusted(borderWidth, borderWidth, borderWidth, height() - 2 * borderWidth)};\n+        painter.fillRect(targetHighlightRect, highlightColor);\n+    }\n+\n+    QPainterPath border;\n+    border.addRect(0, 0, width(), height());\n+    painter.setPen(m_borderColor);\n+    painter.drawPath(border);\n+}\n+\n+void PiecesBar::requestImageUpdate()\n+{\n+    if (updateImage(m_image))\n+        update();\n+}\n+\n+QRgb PiecesBar::mixTwoColors(QRgb rgb1, QRgb rgb2, float ratio)\n+{\n+    int r1 = qRed(rgb1);\n+    int g1 = qGreen(rgb1);\n+    int b1 = qBlue(rgb1);\n+\n+    int r2 = qRed(rgb2);\n+    int g2 = qGreen(rgb2);\n+    int b2 = qBlue(rgb2);\n+\n+    float ratio_n = 1.0 - ratio;\n+    int r = (r1 * ratio_n) + (r2 * ratio);\n+    int g = (g1 * ratio_n) + (g2 * ratio);\n+    int b = (b1 * ratio_n) + (b2 * ratio);\n+\n+    return qRgb(r, g, b);\n+}\n+\n+namespace {\n+#define TYPESET_FILELIST_AS_TABLE\n+\n+    class DetailedTooltipRenderer\n+    {\n+    public:\n+        DetailedTooltipRenderer(QTextStream& stream, const QString &header)\n+            : m_stream(stream)\n+        {\n+            m_stream << header\n+#ifdef TYPESET_FILELIST_AS_TABLE\n+                << R\"(<table style=\"width:100%; padding: 3px; vertical-align: middle;\">)\";\n+#else\n+                << \"<ul>\";\n+#endif\n+        }\n+\n+        ~DetailedTooltipRenderer()\n+        {\n+#ifdef TYPESET_FILELIST_AS_TABLE\n+            m_stream << \"</table>\";\n+#else\n+            m_stream << \"</ul>\";\n+#endif\n+        }\n+\n+        void operator()(const QString &size, const QString &path)\n+        {\n+#ifdef TYPESET_FILELIST_AS_TABLE\n+            m_stream << \"<tr><td>\" << size << \"</td><td>\" << path << \"</td></tr>\";\n+#else\n+            m_stream << \"<li>[\" << size << \"] \" << path << \"</li>\";\n+#endif\n+        }\n+\n+    private:\n+        QTextStream &m_stream;\n+    };\n+}\n+\n+void PiecesBar::showToolTip(const QHelpEvent *e)\n+{\n+    if (!m_torrent)\n+        return;\n+\n+    QString toolTipText;\n+    QTextStream stream(&toolTipText, QIODevice::WriteOnly);\n+    bool showDetailedInformation = QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier);\n+    if (!showDetailedInformation) {\n+        if (m_local) {\n+            stream << tr(\"White: Missing pieces\") << '\\n'\n+                   << tr(\"Green: Partial pieces\") << '\\n'\n+                   << tr(\"Blue: Completed pieces\") << '\\n';\n+        }\n+        else {\n+            stream << tr(\"White: Unavailable pieces\") << '\\n'\n+                   << tr(\"Blue: Available pieces\") << '\\n';\n+        }\n+        stream << '\\n' << tr(\"Hold Shift key for detailed information\");\n+    }\n+    else {\n+        stream << \"<html><body>\";\n+        const int imagePos = e->pos().x() - borderWidth;\n+        if (( imagePos >=0) && ( imagePos < m_image.width()) ) {\n+            PieceIndexToImagePos transform {m_torrent, m_image};","path":"src/gui/properties/piecesbar.cpp","position":251,"original_position":251,"commit_id":"e60d62acaaff0d4240e9c7a95b52d871aa8dea83","original_commit_id":"e60d62acaaff0d4240e9c7a95b52d871aa8dea83","user":{"login":"evsh","id":394621,"avatar_url":"https://avatars.githubusercontent.com/u/394621?v=3","gravatar_id":"","url":"https://api.github.com/users/evsh","html_url":"https://github.com/evsh","followers_url":"https://api.github.com/users/evsh/followers","following_url":"https://api.github.com/users/evsh/following{/other_user}","gists_url":"https://api.github.com/users/evsh/gists{/gist_id}","starred_url":"https://api.github.com/users/evsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evsh/subscriptions","organizations_url":"https://api.github.com/users/evsh/orgs","repos_url":"https://api.github.com/users/evsh/repos","events_url":"https://api.github.com/users/evsh/events{/privacy}","received_events_url":"https://api.github.com/users/evsh/received_events","type":"User","site_admin":false},"body":"You are welcome: issue #5075","created_at":"2016-04-04T13:50:22Z","updated_at":"2016-04-04T13:50:22Z","html_url":"https://github.com/qbittorrent/qBittorrent/pull/4994#discussion_r58377799","pull_request_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994","_links":{"self":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments/58377799"},"html":{"href":"https://github.com/qbittorrent/qBittorrent/pull/4994#discussion_r58377799"},"pull_request":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994"}}},"pull_request":{"url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994","id":63781134,"html_url":"https://github.com/qbittorrent/qBittorrent/pull/4994","diff_url":"https://github.com/qbittorrent/qBittorrent/pull/4994.diff","patch_url":"https://github.com/qbittorrent/qBittorrent/pull/4994.patch","issue_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/4994","number":4994,"state":"open","locked":false,"title":"Add availability column to torrent contents","user":{"login":"evsh","id":394621,"avatar_url":"https://avatars.githubusercontent.com/u/394621?v=3","gravatar_id":"","url":"https://api.github.com/users/evsh","html_url":"https://github.com/evsh","followers_url":"https://api.github.com/users/evsh/followers","following_url":"https://api.github.com/users/evsh/following{/other_user}","gists_url":"https://api.github.com/users/evsh/gists{/gist_id}","starred_url":"https://api.github.com/users/evsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evsh/subscriptions","organizations_url":"https://api.github.com/users/evsh/orgs","repos_url":"https://api.github.com/users/evsh/repos","events_url":"https://api.github.com/users/evsh/events{/privacy}","received_events_url":"https://api.github.com/users/evsh/received_events","type":"User","site_admin":false},"body":"Following the path of PR #2885 and #4936 this PR proposes a new column for the \"Contents\" tab of the torrent properties. This column show current availability of the files in the pool.\r\n\r\nOne of the probable use cases for this feature is  way to make a quick estimation whether a given file of folder can be downloaded using given torrent, or it is better to look for another collection.\r\n\r\nThis is WIP code, but I want to share it early, because there are a couple of design decision which need to be done, but I feel a lack of a good criterion. Here they are.\r\n\r\n1. Availability for files is computed in a different way comparing to the progress bar: if a piece is available from many different peers, it is counted only once. This seems to be logical, since we most likely need this information to decide whether the file can be downloaded complete under current conditions. \r\n2. As well as progress and size columns here we show availability values for folders. Shall we count files which are not downloaded? Libtorrent does not provide this information for files which are seeding. So the question is: what rules to use for computing the average availability value for a folder? \r\n\r\n","created_at":"2016-03-22T19:45:21Z","updated_at":"2016-04-04T13:50:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cc1097f1d97be572656f36cc2712fc6355a8672a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994/commits","review_comments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994/comments","review_comment_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments{/number}","comments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/4994/comments","statuses_url":"https://api.github.com/repos/qbittorrent/qBittorrent/statuses/e60d62acaaff0d4240e9c7a95b52d871aa8dea83","head":{"label":"evsh:availability-column","ref":"availability-column","sha":"e60d62acaaff0d4240e9c7a95b52d871aa8dea83","user":{"login":"evsh","id":394621,"avatar_url":"https://avatars.githubusercontent.com/u/394621?v=3","gravatar_id":"","url":"https://api.github.com/users/evsh","html_url":"https://github.com/evsh","followers_url":"https://api.github.com/users/evsh/followers","following_url":"https://api.github.com/users/evsh/following{/other_user}","gists_url":"https://api.github.com/users/evsh/gists{/gist_id}","starred_url":"https://api.github.com/users/evsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evsh/subscriptions","organizations_url":"https://api.github.com/users/evsh/orgs","repos_url":"https://api.github.com/users/evsh/repos","events_url":"https://api.github.com/users/evsh/events{/privacy}","received_events_url":"https://api.github.com/users/evsh/received_events","type":"User","site_admin":false},"repo":{"id":31520234,"name":"qBittorrent","full_name":"evsh/qBittorrent","owner":{"login":"evsh","id":394621,"avatar_url":"https://avatars.githubusercontent.com/u/394621?v=3","gravatar_id":"","url":"https://api.github.com/users/evsh","html_url":"https://github.com/evsh","followers_url":"https://api.github.com/users/evsh/followers","following_url":"https://api.github.com/users/evsh/following{/other_user}","gists_url":"https://api.github.com/users/evsh/gists{/gist_id}","starred_url":"https://api.github.com/users/evsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evsh/subscriptions","organizations_url":"https://api.github.com/users/evsh/orgs","repos_url":"https://api.github.com/users/evsh/repos","events_url":"https://api.github.com/users/evsh/events{/privacy}","received_events_url":"https://api.github.com/users/evsh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/evsh/qBittorrent","description":"qBittorrent BitTorrent client","fork":true,"url":"https://api.github.com/repos/evsh/qBittorrent","forks_url":"https://api.github.com/repos/evsh/qBittorrent/forks","keys_url":"https://api.github.com/repos/evsh/qBittorrent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/evsh/qBittorrent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/evsh/qBittorrent/teams","hooks_url":"https://api.github.com/repos/evsh/qBittorrent/hooks","issue_events_url":"https://api.github.com/repos/evsh/qBittorrent/issues/events{/number}","events_url":"https://api.github.com/repos/evsh/qBittorrent/events","assignees_url":"https://api.github.com/repos/evsh/qBittorrent/assignees{/user}","branches_url":"https://api.github.com/repos/evsh/qBittorrent/branches{/branch}","tags_url":"https://api.github.com/repos/evsh/qBittorrent/tags","blobs_url":"https://api.github.com/repos/evsh/qBittorrent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/evsh/qBittorrent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/evsh/qBittorrent/git/refs{/sha}","trees_url":"https://api.github.com/repos/evsh/qBittorrent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/evsh/qBittorrent/statuses/{sha}","languages_url":"https://api.github.com/repos/evsh/qBittorrent/languages","stargazers_url":"https://api.github.com/repos/evsh/qBittorrent/stargazers","contributors_url":"https://api.github.com/repos/evsh/qBittorrent/contributors","subscribers_url":"https://api.github.com/repos/evsh/qBittorrent/subscribers","subscription_url":"https://api.github.com/repos/evsh/qBittorrent/subscription","commits_url":"https://api.github.com/repos/evsh/qBittorrent/commits{/sha}","git_commits_url":"https://api.github.com/repos/evsh/qBittorrent/git/commits{/sha}","comments_url":"https://api.github.com/repos/evsh/qBittorrent/comments{/number}","issue_comment_url":"https://api.github.com/repos/evsh/qBittorrent/issues/comments{/number}","contents_url":"https://api.github.com/repos/evsh/qBittorrent/contents/{+path}","compare_url":"https://api.github.com/repos/evsh/qBittorrent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/evsh/qBittorrent/merges","archive_url":"https://api.github.com/repos/evsh/qBittorrent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/evsh/qBittorrent/downloads","issues_url":"https://api.github.com/repos/evsh/qBittorrent/issues{/number}","pulls_url":"https://api.github.com/repos/evsh/qBittorrent/pulls{/number}","milestones_url":"https://api.github.com/repos/evsh/qBittorrent/milestones{/number}","notifications_url":"https://api.github.com/repos/evsh/qBittorrent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/evsh/qBittorrent/labels{/name}","releases_url":"https://api.github.com/repos/evsh/qBittorrent/releases{/id}","deployments_url":"https://api.github.com/repos/evsh/qBittorrent/deployments","created_at":"2015-03-02T02:38:49Z","updated_at":"2016-02-27T17:20:24Z","pushed_at":"2016-04-04T00:10:17Z","git_url":"git://github.com/evsh/qBittorrent.git","ssh_url":"git@github.com:evsh/qBittorrent.git","clone_url":"https://github.com/evsh/qBittorrent.git","svn_url":"https://github.com/evsh/qBittorrent","homepage":"http://www.qbittorrent.org","size":121714,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"qbittorrent:master","ref":"master","sha":"93d8cadaaf521e1b8d138e6eea0fe66dca52cc2f","user":{"login":"qbittorrent","id":2131270,"avatar_url":"https://avatars.githubusercontent.com/u/2131270?v=3","gravatar_id":"","url":"https://api.github.com/users/qbittorrent","html_url":"https://github.com/qbittorrent","followers_url":"https://api.github.com/users/qbittorrent/followers","following_url":"https://api.github.com/users/qbittorrent/following{/other_user}","gists_url":"https://api.github.com/users/qbittorrent/gists{/gist_id}","starred_url":"https://api.github.com/users/qbittorrent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qbittorrent/subscriptions","organizations_url":"https://api.github.com/users/qbittorrent/orgs","repos_url":"https://api.github.com/users/qbittorrent/repos","events_url":"https://api.github.com/users/qbittorrent/events{/privacy}","received_events_url":"https://api.github.com/users/qbittorrent/received_events","type":"Organization","site_admin":false},"repo":{"id":3351871,"name":"qBittorrent","full_name":"qbittorrent/qBittorrent","owner":{"login":"qbittorrent","id":2131270,"avatar_url":"https://avatars.githubusercontent.com/u/2131270?v=3","gravatar_id":"","url":"https://api.github.com/users/qbittorrent","html_url":"https://github.com/qbittorrent","followers_url":"https://api.github.com/users/qbittorrent/followers","following_url":"https://api.github.com/users/qbittorrent/following{/other_user}","gists_url":"https://api.github.com/users/qbittorrent/gists{/gist_id}","starred_url":"https://api.github.com/users/qbittorrent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qbittorrent/subscriptions","organizations_url":"https://api.github.com/users/qbittorrent/orgs","repos_url":"https://api.github.com/users/qbittorrent/repos","events_url":"https://api.github.com/users/qbittorrent/events{/privacy}","received_events_url":"https://api.github.com/users/qbittorrent/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/qbittorrent/qBittorrent","description":"qBittorrent BitTorrent client","fork":false,"url":"https://api.github.com/repos/qbittorrent/qBittorrent","forks_url":"https://api.github.com/repos/qbittorrent/qBittorrent/forks","keys_url":"https://api.github.com/repos/qbittorrent/qBittorrent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/qbittorrent/qBittorrent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/qbittorrent/qBittorrent/teams","hooks_url":"https://api.github.com/repos/qbittorrent/qBittorrent/hooks","issue_events_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/events{/number}","events_url":"https://api.github.com/repos/qbittorrent/qBittorrent/events","assignees_url":"https://api.github.com/repos/qbittorrent/qBittorrent/assignees{/user}","branches_url":"https://api.github.com/repos/qbittorrent/qBittorrent/branches{/branch}","tags_url":"https://api.github.com/repos/qbittorrent/qBittorrent/tags","blobs_url":"https://api.github.com/repos/qbittorrent/qBittorrent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/qbittorrent/qBittorrent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/qbittorrent/qBittorrent/git/refs{/sha}","trees_url":"https://api.github.com/repos/qbittorrent/qBittorrent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/qbittorrent/qBittorrent/statuses/{sha}","languages_url":"https://api.github.com/repos/qbittorrent/qBittorrent/languages","stargazers_url":"https://api.github.com/repos/qbittorrent/qBittorrent/stargazers","contributors_url":"https://api.github.com/repos/qbittorrent/qBittorrent/contributors","subscribers_url":"https://api.github.com/repos/qbittorrent/qBittorrent/subscribers","subscription_url":"https://api.github.com/repos/qbittorrent/qBittorrent/subscription","commits_url":"https://api.github.com/repos/qbittorrent/qBittorrent/commits{/sha}","git_commits_url":"https://api.github.com/repos/qbittorrent/qBittorrent/git/commits{/sha}","comments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/comments{/number}","issue_comment_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/comments{/number}","contents_url":"https://api.github.com/repos/qbittorrent/qBittorrent/contents/{+path}","compare_url":"https://api.github.com/repos/qbittorrent/qBittorrent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/qbittorrent/qBittorrent/merges","archive_url":"https://api.github.com/repos/qbittorrent/qBittorrent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/qbittorrent/qBittorrent/downloads","issues_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues{/number}","pulls_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls{/number}","milestones_url":"https://api.github.com/repos/qbittorrent/qBittorrent/milestones{/number}","notifications_url":"https://api.github.com/repos/qbittorrent/qBittorrent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/qbittorrent/qBittorrent/labels{/name}","releases_url":"https://api.github.com/repos/qbittorrent/qBittorrent/releases{/id}","deployments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/deployments","created_at":"2012-02-04T09:37:46Z","updated_at":"2016-04-04T11:06:51Z","pushed_at":"2016-04-04T11:03:44Z","git_url":"git://github.com/qbittorrent/qBittorrent.git","ssh_url":"git@github.com:qbittorrent/qBittorrent.git","clone_url":"https://github.com/qbittorrent/qBittorrent.git","svn_url":"https://github.com/qbittorrent/qBittorrent","homepage":"http://www.qbittorrent.org","size":130502,"stargazers_count":1648,"watchers_count":1648,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":459,"mirror_url":null,"open_issues_count":1467,"forks":459,"open_issues":1467,"watchers":1648,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994"},"html":{"href":"https://github.com/qbittorrent/qBittorrent/pull/4994"},"issue":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/4994"},"comments":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/4994/comments"},"review_comments":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994/comments"},"review_comment":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/4994/commits"},"statuses":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/statuses/e60d62acaaff0d4240e9c7a95b52d871aa8dea83"}}}}