{"action":"created","comment":{"url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments/61516641","id":61516641,"diff_hunk":"@@ -28,254 +28,350 @@\n  * Contact : chris@qbittorrent.org\n  */\n \n+#include \"torrentcreatordlg.h\"\n+\n+#include <QCloseEvent>\n #include <QDebug>\n #include <QFileDialog>\n #include <QMessageBox>\n+#include <QMimeData>\n+#include <QUrl>\n \n-#include \"torrentcreatordlg.h\"\n-#include \"base/utils/fs.h\"\n-#include \"base/utils/misc.h\"\n-#include \"base/preferences.h\"\n-#include \"guiiconprovider.h\"\n #include \"base/bittorrent/session.h\"\n #include \"base/bittorrent/torrentinfo.h\"\n #include \"base/bittorrent/torrentcreatorthread.h\"\n+#include \"base/settingsstorage.h\"\n+#include \"base/utils/fs.h\"\n+#include \"guiiconprovider.h\"\n \n-const uint NB_PIECES_MIN = 1200;\n-const uint NB_PIECES_MAX = 2200;\n+#include \"ui_torrentcreatordlg.h\"\n \n-TorrentCreatorDlg::TorrentCreatorDlg(QWidget *parent)\n-    : QDialog(parent)\n-    , m_creatorThread(0)\n+namespace\n {\n-    setupUi(this);\n-    // Icons\n-    addFile_button->setIcon(GuiIconProvider::instance()->getIcon(\"document-new\"));\n-    addFolder_button->setIcon(GuiIconProvider::instance()->getIcon(\"folder-new\"));\n-    createButton->setIcon(GuiIconProvider::instance()->getIcon(\"document-save\"));\n-    cancelButton->setIcon(GuiIconProvider::instance()->getIcon(\"dialog-cancel\"));\n+#define SETTINGS_KEY(name) \"TorrentCreator/\" name\n+    const QString KEY_DIALOG_SIZE = SETTINGS_KEY(\"Dimension\");\n+\n+    const QString KEY_PIECE_SIZE = SETTINGS_KEY(\"SettingPieceSize\");\n+    const QString KEY_PRIVATE_TORRENT = SETTINGS_KEY(\"SettingPrivateTorrent\");\n+    const QString KEY_START_SEEDING = SETTINGS_KEY(\"SettingStartSeeding\");\n+    const QString KEY_SETTING_IGNORE_RATIO = SETTINGS_KEY(\"SettingIgnoreRatio\");\n+\n+    const QString KEY_LAST_ADD_PATH = SETTINGS_KEY(\"LastAddPath\");\n+    const QString KEY_TRACKER_LIST = SETTINGS_KEY(\"TrackerList\");\n+    const QString KEY_WEB_SEED_LIST = SETTINGS_KEY(\"WebSeedList\");\n+    const QString KEY_COMMENTS = SETTINGS_KEY(\"Comments\");\n+    const QString KEY_LAST_SAVE_PATH = SETTINGS_KEY(\"LastSavePath\");\n \n+    SettingsStorage *settings() { return  SettingsStorage::instance(); }\n+}\n+\n+TorrentCreatorDlg::TorrentCreatorDlg(QWidget *parent, const QString &defaultPath)\n+    : QDialog(parent)\n+    , ui(new Ui::TorrentCreatorDlg)\n+    , m_creatorThread(nullptr)\n+    , m_defaultPath(defaultPath)\n+{\n+    ui->setupUi(this);\n     setAttribute(Qt::WA_DeleteOnClose);\n     setModal(true);\n+\n     showProgressBar(false);\n-    loadTrackerList();\n-    // Piece sizes\n-    m_pieceSizes << 16 << 32 << 64 << 128 << 256 << 512 << 1024 << 2048 << 4096 << 8192 << 16384;\n+    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"Create Torrent\"));\n+\n+    connect(ui->addFile_button, SIGNAL(clicked(bool)), SLOT(onAddFileButtonClicked()));\n+    connect(ui->addFolder_button, SIGNAL(clicked(bool)), SLOT(onAddFolderButtonClicked()));\n+    connect(ui->buttonBox, SIGNAL(accepted()), SLOT(onCreateButtonClicked()));\n+\n     loadSettings();\n     show();\n }\n \n TorrentCreatorDlg::~TorrentCreatorDlg()\n {\n-    if (m_creatorThread)\n+    saveSettings();\n+\n+    // End torrent creation thread\n+    if (m_creatorThread) {\n+        if (m_creatorThread->isRunning()) {\n+            m_creatorThread->abortCreation();\n+            m_creatorThread->terminate();\n+            // Wait for termination\n+            m_creatorThread->wait();\n+        }\n         delete m_creatorThread;\n+    }\n+\n+    delete ui;\n }\n \n-void TorrentCreatorDlg::on_addFolder_button_clicked()\n+void TorrentCreatorDlg::onAddFolderButtonClicked()\n {\n-    Preferences* const pref = Preferences::instance();\n-    QString lastPath = pref->getCreateTorLastAddPath();\n-    QString dir = QFileDialog::getExistingDirectory(this, tr(\"Select a folder to add to the torrent\"), lastPath, QFileDialog::ShowDirsOnly);\n-    if (!dir.isEmpty()) {\n-        pref->setCreateTorLastAddPath(dir);\n-        textInputPath->setText(Utils::Fs::toNativePath(dir));\n-        // Update piece size\n-        if (checkAutoPieceSize->isChecked())\n-            updateOptimalPieceSize();\n-    }\n+    QString oldPath = Utils::Fs::fromNativePath(ui->textInputPath->text());\n+    QString path = QFileDialog::getExistingDirectory(this, tr(\"Select folder\"), oldPath);\n+    if (!path.isEmpty())\n+        ui->textInputPath->setText(Utils::Fs::toNativePath(path));\n }\n \n-void TorrentCreatorDlg::on_addFile_button_clicked()\n+void TorrentCreatorDlg::onAddFileButtonClicked()\n {\n-    Preferences* const pref = Preferences::instance();\n-    QString lastPath = pref->getCreateTorLastAddPath();\n-    QString file = QFileDialog::getOpenFileName(this, tr(\"Select a file to add to the torrent\"), lastPath);\n-    if (!file.isEmpty()) {\n-        pref->setCreateTorLastAddPath(Utils::Fs::branchPath(file));\n-        textInputPath->setText(Utils::Fs::toNativePath(file));\n-        // Update piece size\n-        if (checkAutoPieceSize->isChecked())\n-            updateOptimalPieceSize();\n-    }\n+    QString oldPath = Utils::Fs::fromNativePath(ui->textInputPath->text());\n+    QString path = QFileDialog::getOpenFileName(this, tr(\"Select file\"), oldPath);\n+    if (!path.isEmpty())\n+        ui->textInputPath->setText(Utils::Fs::toNativePath(path));\n }\n \n int TorrentCreatorDlg::getPieceSize() const\n {\n-    return m_pieceSizes.at(comboPieceSize->currentIndex()) * 1024;\n+    const int pieceSizes[] = {0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384};  // base unit in KiB\n+    return pieceSizes[ui->comboPieceSize->currentIndex()] * 1024;\n+}\n+\n+void TorrentCreatorDlg::dropEvent(QDropEvent *event)\n+{\n+    event->acceptProposedAction();\n+\n+    if (event->mimeData()->hasUrls()) {\n+        // only take the first one\n+        QUrl firstItem = event->mimeData()->urls().first();\n+        QString path = (firstItem.scheme().compare(\"file\", Qt::CaseInsensitive) == 0) ?\n+                        firstItem.toLocalFile() : firstItem.toString();\n+        ui->textInputPath->setText(path);\n+    }\n+}\n+\n+void TorrentCreatorDlg::dragEnterEvent(QDragEnterEvent *event)\n+{\n+    if (event->mimeData()->hasFormat(\"text/plain\") || event->mimeData()->hasFormat(\"text/uri-list\"))\n+        event->acceptProposedAction();\n }\n \n // Main function that create a .torrent file\n-void TorrentCreatorDlg::on_createButton_clicked()\n+void TorrentCreatorDlg::onCreateButtonClicked()\n {\n-    QString input = Utils::Fs::fromNativePath(textInputPath->text()).trimmed();\n-    if (input.endsWith(\"/\"))\n-        input.chop(1);\n-    if (input.isEmpty()) {\n-        QMessageBox::critical(0, tr(\"No input path set\"), tr(\"Please type an input path first\"));\n+    QString input = Utils::Fs::fromNativePath(ui->textInputPath->text()).trimmed();\n+\n+    // test if readable\n+    QFileInfo fi(input);\n+    if (!fi.isReadable()) {\n+        QMessageBox::critical(this, tr(\"Torrent creator failed\"), tr(\"Reason: Path to file/folder is not readable.\"));\n         return;\n     }\n-    QStringList trackers = trackers_list->toPlainText().split(\"\\n\");\n-    if (!trackers_list->toPlainText().trimmed().isEmpty())\n-        saveTrackerList();\n-\n-    Preferences* const pref = Preferences::instance();\n-    QString lastPath = pref->getCreateTorLastSavePath();\n+    input = fi.canonicalFilePath();\n \n-    QString destination = QFileDialog::getSaveFileName(this, tr(\"Select destination torrent file\"), lastPath, tr(\"Torrent Files (*.torrent)\"));\n+    // get save path\n+    QString lastPath = getLastSavePath();\n+    QString destination = QFileDialog::getSaveFileName(this, tr(\"Select where to save the new torrent\"), lastPath, tr(\"Torrent Files (*.torrent)\"));\n     if (destination.isEmpty())\n         return;\n+    if (!destination.endsWith(\".torrent\", Qt::CaseInsensitive))\n+        destination += \".torrent\";\n+    setLastSavePath(Utils::Fs::branchPath(destination));\n \n-    pref->setCreateTorLastSavePath(Utils::Fs::branchPath(destination));\n-    if (!destination.toUpper().endsWith(\".TORRENT\"))\n-        destination += QString::fromUtf8(\".torrent\");\n-\n-    // Disable dialog\n+    // Disable dialog & set busy cursor\n     setInteractionEnabled(false);\n     showProgressBar(true);\n-    // Set busy cursor\n     setCursor(QCursor(Qt::WaitCursor));\n-    // Actually create the torrent\n-    QStringList urlSeeds = URLSeeds_list->toPlainText().split(\"\\n\");\n-    QString comment = txt_comment->toPlainText();\n+\n+    QStringList trackers = ui->trackers_list->toPlainText().split(\"\\n\");","path":"src/gui/torrentcreatordlg.cpp","position":213,"original_position":213,"commit_id":"bdc90d564d00a1c45d27be2782f3a70016bff950","original_commit_id":"bdc90d564d00a1c45d27be2782f3a70016bff950","user":{"login":"Chocobo1","id":9395168,"avatar_url":"https://avatars.githubusercontent.com/u/9395168?v=3","gravatar_id":"","url":"https://api.github.com/users/Chocobo1","html_url":"https://github.com/Chocobo1","followers_url":"https://api.github.com/users/Chocobo1/followers","following_url":"https://api.github.com/users/Chocobo1/following{/other_user}","gists_url":"https://api.github.com/users/Chocobo1/gists{/gist_id}","starred_url":"https://api.github.com/users/Chocobo1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Chocobo1/subscriptions","organizations_url":"https://api.github.com/users/Chocobo1/orgs","repos_url":"https://api.github.com/users/Chocobo1/repos","events_url":"https://api.github.com/users/Chocobo1/events{/privacy}","received_events_url":"https://api.github.com/users/Chocobo1/received_events","type":"User","site_admin":false},"body":"It appear to do some tricks at: https://github.com/qbittorrent/qBittorrent/blob/master/src/base/bittorrent/torrentcreatorthread.cpp#L121","created_at":"2016-04-28T23:06:03Z","updated_at":"2016-04-28T23:06:03Z","html_url":"https://github.com/qbittorrent/qBittorrent/pull/5196#discussion_r61516641","pull_request_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196","_links":{"self":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments/61516641"},"html":{"href":"https://github.com/qbittorrent/qBittorrent/pull/5196#discussion_r61516641"},"pull_request":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196"}}},"pull_request":{"url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196","id":68203040,"html_url":"https://github.com/qbittorrent/qBittorrent/pull/5196","diff_url":"https://github.com/qbittorrent/qBittorrent/pull/5196.diff","patch_url":"https://github.com/qbittorrent/qBittorrent/pull/5196.patch","issue_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/5196","number":5196,"state":"open","locked":false,"title":"Revamp Torrent creator","user":{"login":"Chocobo1","id":9395168,"avatar_url":"https://avatars.githubusercontent.com/u/9395168?v=3","gravatar_id":"","url":"https://api.github.com/users/Chocobo1","html_url":"https://github.com/Chocobo1","followers_url":"https://api.github.com/users/Chocobo1/followers","following_url":"https://api.github.com/users/Chocobo1/following{/other_user}","gists_url":"https://api.github.com/users/Chocobo1/gists{/gist_id}","starred_url":"https://api.github.com/users/Chocobo1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Chocobo1/subscriptions","organizations_url":"https://api.github.com/users/Chocobo1/orgs","repos_url":"https://api.github.com/users/Chocobo1/repos","events_url":"https://api.github.com/users/Chocobo1/events{/privacy}","received_events_url":"https://api.github.com/users/Chocobo1/received_events","type":"User","site_admin":false},"body":"* All settings/text field in Torrent creator & dialog size are now remembered.\r\n* Support drag and drop in Torrent creator.\r\n* Support drag and drop to open Torrent creator in mainwindow.\r\n* Revised popup messages.\r\n\r\nscrnshot: [old](https://cloud.githubusercontent.com/assets/9395168/14884053/ea122c40-0d74-11e6-9790-7915a2d24973.png), [new](https://cloud.githubusercontent.com/assets/9395168/14892622/3e1a0e38-0d9e-11e6-9b30-dddc892c0d28.png)","created_at":"2016-04-28T11:12:37Z","updated_at":"2016-04-28T23:06:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6506b45386cdc67d5f7392f802149ab1e26fe003","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196/commits","review_comments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196/comments","review_comment_url":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments{/number}","comments_url":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/5196/comments","statuses_url":"https://api.github.com/repos/qbittorrent/qBittorrent/statuses/bdc90d564d00a1c45d27be2782f3a70016bff950","head":{"label":"Chocobo1:creator_pr","ref":"creator_pr","sha":"bdc90d564d00a1c45d27be2782f3a70016bff950","user":{"login":"Chocobo1","id":9395168,"avatar_url":"https://avatars.githubusercontent.com/u/9395168?v=3","gravatar_id":"","url":"https://api.github.com/users/Chocobo1","html_url":"https://github.com/Chocobo1","followers_url":"https://api.github.com/users/Chocobo1/followers","following_url":"https://api.github.com/users/Chocobo1/following{/other_user}","gists_url":"https://api.github.com/users/Chocobo1/gists{/gist_id}","starred_url":"https://api.github.com/users/Chocobo1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Chocobo1/subscriptions","organizations_url":"https://api.github.com/users/Chocobo1/orgs","repos_url":"https://api.github.com/users/Chocobo1/repos","events_url":"https://api.github.com/users/Chocobo1/events{/privacy}","received_events_url":"https://api.github.com/users/Chocobo1/received_events","type":"User","site_admin":false},"repo":{"id":30459428,"name":"qBittorrent","full_name":"Chocobo1/qBittorrent","owner":{"login":"Chocobo1","id":9395168,"avatar_url":"https://avatars.githubusercontent.com/u/9395168?v=3","gravatar_id":"","url":"https://api.github.com/users/Chocobo1","html_url":"https://github.com/Chocobo1","followers_url":"https://api.github.com/users/Chocobo1/followers","following_url":"https://api.github.com/users/Chocobo1/following{/other_user}","gists_url":"https://api.github.com/users/Chocobo1/gists{/gist_id}","starred_url":"https://api.github.com/users/Chocobo1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Chocobo1/subscriptions","organizations_url":"https://api.github.com/users/Chocobo1/orgs","repos_url":"https://api.github.com/users/Chocobo1/repos","events_url":"https://api.github.com/users/Chocobo1/events{/privacy}","received_events_url":"https://api.github.com/users/Chocobo1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Chocobo1/qBittorrent","description":"qBittorrent BitTorrent client","fork":true,"url":"https://api.github.com/repos/Chocobo1/qBittorrent","forks_url":"https://api.github.com/repos/Chocobo1/qBittorrent/forks","keys_url":"https://api.github.com/repos/Chocobo1/qBittorrent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Chocobo1/qBittorrent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Chocobo1/qBittorrent/teams","hooks_url":"https://api.github.com/repos/Chocobo1/qBittorrent/hooks","issue_events_url":"https://api.github.com/repos/Chocobo1/qBittorrent/issues/events{/number}","events_url":"https://api.github.com/repos/Chocobo1/qBittorrent/events","assignees_url":"https://api.github.com/repos/Chocobo1/qBittorrent/assignees{/user}","branches_url":"https://api.github.com/repos/Chocobo1/qBittorrent/branches{/branch}","tags_url":"https://api.github.com/repos/Chocobo1/qBittorrent/tags","blobs_url":"https://api.github.com/repos/Chocobo1/qBittorrent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Chocobo1/qBittorrent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Chocobo1/qBittorrent/git/refs{/sha}","trees_url":"https://api.github.com/repos/Chocobo1/qBittorrent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Chocobo1/qBittorrent/statuses/{sha}","languages_url":"https://api.github.com/repos/Chocobo1/qBittorrent/languages","stargazers_url":"https://api.github.com/repos/Chocobo1/qBittorrent/stargazers","contributors_url":"https://api.github.com/repos/Chocobo1/qBittorrent/contributors","subscribers_url":"https://api.github.com/repos/Chocobo1/qBittorrent/subscribers","subscription_url":"https://api.github.com/repos/Chocobo1/qBittorrent/subscription","commits_url":"https://api.github.com/repos/Chocobo1/qBittorrent/commits{/sha}","git_commits_url":"https://api.github.com/repos/Chocobo1/qBittorrent/git/commits{/sha}","comments_url":"https://api.github.com/repos/Chocobo1/qBittorrent/comments{/number}","issue_comment_url":"https://api.github.com/repos/Chocobo1/qBittorrent/issues/comments{/number}","contents_url":"https://api.github.com/repos/Chocobo1/qBittorrent/contents/{+path}","compare_url":"https://api.github.com/repos/Chocobo1/qBittorrent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Chocobo1/qBittorrent/merges","archive_url":"https://api.github.com/repos/Chocobo1/qBittorrent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Chocobo1/qBittorrent/downloads","issues_url":"https://api.github.com/repos/Chocobo1/qBittorrent/issues{/number}","pulls_url":"https://api.github.com/repos/Chocobo1/qBittorrent/pulls{/number}","milestones_url":"https://api.github.com/repos/Chocobo1/qBittorrent/milestones{/number}","notifications_url":"https://api.github.com/repos/Chocobo1/qBittorrent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Chocobo1/qBittorrent/labels{/name}","releases_url":"https://api.github.com/repos/Chocobo1/qBittorrent/releases{/id}","deployments_url":"https://api.github.com/repos/Chocobo1/qBittorrent/deployments","created_at":"2015-02-07T15:14:20Z","updated_at":"2016-01-26T19:54:31Z","pushed_at":"2016-04-28T16:05:55Z","git_url":"git://github.com/Chocobo1/qBittorrent.git","ssh_url":"git@github.com:Chocobo1/qBittorrent.git","clone_url":"https://github.com/Chocobo1/qBittorrent.git","svn_url":"https://github.com/Chocobo1/qBittorrent","homepage":"http://www.qbittorrent.org","size":127028,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"qbittorrent:master","ref":"master","sha":"ef6e848756e22c507b7f1a599496c93c12baa52f","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-28T21:10:00Z","pushed_at":"2016-04-28T16:05:56Z","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":137150,"stargazers_count":1706,"watchers_count":1706,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":465,"mirror_url":null,"open_issues_count":1502,"forks":465,"open_issues":1502,"watchers":1706,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196"},"html":{"href":"https://github.com/qbittorrent/qBittorrent/pull/5196"},"issue":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/5196"},"comments":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/issues/5196/comments"},"review_comments":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196/comments"},"review_comment":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/pulls/5196/commits"},"statuses":{"href":"https://api.github.com/repos/qbittorrent/qBittorrent/statuses/bdc90d564d00a1c45d27be2782f3a70016bff950"}}}}