Browse Source

- FEATURE: Make use of torrent enclosure in RSS feeds for direct download

- FEATURE: Implemented a RSS feed downloader with filter support
- FEATURE: Save old RSS item to hard disk to remember them on start up
- FEATURE: RSS Feeds can now be copied to the clipboard
adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
0b9c05d41b
  1. 5
      Changelog
  2. 2
      qcm/libtorrent-rasterbar.qcm
  3. 331
      src/FeedDownloader.h
  4. 377
      src/FeedDownloader.ui
  5. 6
      src/GUI.cpp
  6. BIN
      src/Icons/oxygen/list-add.png
  7. BIN
      src/Icons/oxygen/list-remove.png
  8. BIN
      src/Icons/oxygen/subscribe.png
  9. BIN
      src/Icons/oxygen/subscribe16.png
  10. BIN
      src/Icons/skin/add.png
  11. BIN
      src/Icons/skin/remove.png
  12. BIN
      src/Icons/url.png
  13. 50
      src/bittorrent.cpp
  14. 4
      src/bittorrent.h
  15. 332
      src/createtorrent.ui
  16. 2
      src/engineSelectDlg.cpp
  17. 4
      src/icons.qrc
  18. BIN
      src/lang/qbittorrent_bg.qm
  19. 566
      src/lang/qbittorrent_bg.ts
  20. BIN
      src/lang/qbittorrent_ca.qm
  21. 571
      src/lang/qbittorrent_ca.ts
  22. BIN
      src/lang/qbittorrent_cs.qm
  23. 566
      src/lang/qbittorrent_cs.ts
  24. BIN
      src/lang/qbittorrent_da.qm
  25. 571
      src/lang/qbittorrent_da.ts
  26. BIN
      src/lang/qbittorrent_de.qm
  27. 566
      src/lang/qbittorrent_de.ts
  28. BIN
      src/lang/qbittorrent_el.qm
  29. 566
      src/lang/qbittorrent_el.ts
  30. 567
      src/lang/qbittorrent_en.ts
  31. BIN
      src/lang/qbittorrent_es.qm
  32. 569
      src/lang/qbittorrent_es.ts
  33. BIN
      src/lang/qbittorrent_fi.qm
  34. 566
      src/lang/qbittorrent_fi.ts
  35. BIN
      src/lang/qbittorrent_fr.qm
  36. 566
      src/lang/qbittorrent_fr.ts
  37. BIN
      src/lang/qbittorrent_hu.qm
  38. 566
      src/lang/qbittorrent_hu.ts
  39. BIN
      src/lang/qbittorrent_it.qm
  40. 566
      src/lang/qbittorrent_it.ts
  41. BIN
      src/lang/qbittorrent_ja.qm
  42. 569
      src/lang/qbittorrent_ja.ts
  43. BIN
      src/lang/qbittorrent_ko.qm
  44. 566
      src/lang/qbittorrent_ko.ts
  45. BIN
      src/lang/qbittorrent_nb.qm
  46. 571
      src/lang/qbittorrent_nb.ts
  47. BIN
      src/lang/qbittorrent_nl.qm
  48. 569
      src/lang/qbittorrent_nl.ts
  49. BIN
      src/lang/qbittorrent_pl.qm
  50. 569
      src/lang/qbittorrent_pl.ts
  51. BIN
      src/lang/qbittorrent_pt.qm
  52. 69
      src/lang/qbittorrent_pt.ts
  53. BIN
      src/lang/qbittorrent_pt_BR.qm
  54. 69
      src/lang/qbittorrent_pt_BR.ts
  55. BIN
      src/lang/qbittorrent_ro.qm
  56. 69
      src/lang/qbittorrent_ro.ts
  57. BIN
      src/lang/qbittorrent_ru.qm
  58. 69
      src/lang/qbittorrent_ru.ts
  59. BIN
      src/lang/qbittorrent_sk.qm
  60. 69
      src/lang/qbittorrent_sk.ts
  61. BIN
      src/lang/qbittorrent_sv.qm
  62. 69
      src/lang/qbittorrent_sv.ts
  63. BIN
      src/lang/qbittorrent_tr.qm
  64. 69
      src/lang/qbittorrent_tr.ts
  65. BIN
      src/lang/qbittorrent_uk.qm
  66. 72
      src/lang/qbittorrent_uk.ts
  67. BIN
      src/lang/qbittorrent_zh.qm
  68. 69
      src/lang/qbittorrent_zh.ts
  69. BIN
      src/lang/qbittorrent_zh_TW.qm
  70. 69
      src/lang/qbittorrent_zh_TW.ts
  71. 4
      src/misc.h
  72. 2
      src/options.ui
  73. 8
      src/properties_imp.cpp
  74. 1552
      src/rss.h
  75. 174
      src/rss.ui
  76. 668
      src/rss_imp.cpp
  77. 10
      src/rss_imp.h
  78. 8
      src/src.pro
  79. 8
      src/torrentPersistentData.h

5
Changelog

@ -1,7 +1,12 @@
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0 * Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
- FEATURE: Added Magnet URI support - FEATURE: Added Magnet URI support
- FEATURE: Make use of torrent enclosure in RSS feeds for direct download
- FEATURE: Implemented a RSS feed downloader with filter support
- FEATURE: Save old RSS item to hard disk to remember them on start up
- FEATURE: Display free disk space in torrent addition dialog - FEATURE: Display free disk space in torrent addition dialog
- FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL - FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL
- FEATURE: RSS Feeds URLs can now be copied to clipboard
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too [TODO]
- BUGFIX: torrent resume code rewrited - BUGFIX: torrent resume code rewrited
* Thu Aug 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.0 * Thu Aug 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.0

2
qcm/libtorrent-rasterbar.qcm

@ -23,7 +23,7 @@ public:
if(!libs.isEmpty()) if(!libs.isEmpty())
conf->addLib(libs); conf->addLib(libs);
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other)) if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toUtf8().data(), adv_ver.toUtf8().data()); printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
return true; return true;
} }
}; };

331
src/FeedDownloader.h

@ -0,0 +1,331 @@
/*
* Bittorrent Client using Qt4 and libtorrent.
* Copyright (C) 2006 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give permission to
* link this program with the OpenSSL project's "OpenSSL" library (or with
* modified versions of it that use the same license as the "OpenSSL" library),
* and distribute the linked executables. You must obey the GNU General Public
* License in all respects for all of the code used other than "OpenSSL". If you
* modify file(s), you may extend this exception to your version of the file(s),
* but you are not obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*
* Contact : chris@qbittorrent.org
*/
#ifndef FEEDDOWNLOADER_H
#define FEEDDOWNLOADER_H
#include <QString>
#include <QHash>
#include <QSettings>
#include <QListWidget>
#include <QListWidgetItem>
#include <QInputDialog>
#include <QMessageBox>
#include <QRegExp>
#include "bittorrent.h"
#include "ui_FeedDownloader.h"
class FeedFilter: public QHash<QString, QVariant> {
private:
bool valid;
public:
FeedFilter():valid(true) {}
FeedFilter(bool valid): valid(valid) {}
FeedFilter(QHash<QString, QVariant> filter): QHash<QString, QVariant>(filter), valid(true) {}
bool matches(QString s) {
QStringList tokens = getMatchingTokens();
foreach(const QString& token, tokens) {
QRegExp reg(token, Qt::CaseInsensitive);
if(reg.indexIn(s) < 0) return false;
}
return true;
}
bool isValid() const {
return valid;
}
QStringList getMatchingTokens() const {
QString matches = this->value("matches", "*").toString();
return matches.split(" ");
}
QString getMatchingTokens_str() const {
return this->value("matches", "*").toString();
}
void setMatchingTokens(QString tokens) {
tokens = tokens.trimmed();
if(tokens.isEmpty())
(*this)["matches"] = "*";
else
(*this)["matches"] = tokens;
}
QStringList getNotMatchingTokens() const {
QString notmatching = this->value("not", "").toString();
return notmatching.split(" ");
}
QString getNotMatchingTokens_str() const {
return this->value("not", "").toString();
}
void setNotMatchingTokens(QString tokens) {
(*this)["not"] = tokens.trimmed();
}
QString getSavePath() const {
return this->value("save_path", "").toString();
}
void setSavePath(QString save_path) {
(*this)["save_path"] = save_path;
}
};
class FeedFilters : public QHash<QString, QVariant> {
private:
QString feed_url;
public:
FeedFilters() {}
FeedFilters(QString feed_url, QHash<QString, QVariant> filters): QHash<QString, QVariant>(filters), feed_url(feed_url) {}
bool hasFilter(QString name) const {
return this->contains(name);
}
FeedFilter* matches(QString s) {
if(!isDownloadingEnabled()) return 0;
if(this->size() == 0) return new FeedFilter(false);
foreach(QVariant var_hash_filter, this->values()) {
QHash<QString, QVariant> hash_filter = var_hash_filter.toHash();
FeedFilter *filter = new FeedFilter(hash_filter);
if(filter->matches(s))
return filter;
else
delete filter;
}
return 0;
}
QStringList names() const {
return this->keys();
}
FeedFilter getFilter(QString name) const {
if(this->contains(name))
return FeedFilter(this->value(name).toHash());
return FeedFilter();
}
void setFilter(QString name, FeedFilter f) {
(*this)[name] = f;
}
bool isDownloadingEnabled() const {
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
return feeds_w_downloader.value(feed_url, false).toBool();
}
void setDownloadingEnabled(bool enabled) {
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
feeds_w_downloader[feed_url] = enabled;
qBTRSS.setValue("downloader_on", feeds_w_downloader);
}
static FeedFilters getFeedFilters(QString url) {
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
return FeedFilters(url, all_feeds_filters.value(url, QHash<QString, QVariant>()).toHash());
}
void save() {
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
qDebug("Saving filters for feed: %s (%d filters)", feed_url.toLocal8Bit().data(), (*this).size());
all_feeds_filters[feed_url] = *this;
qBTRSS.setValue("feed_filters", all_feeds_filters);
}
};
class FeedDownloaderDlg : public QDialog, private Ui_FeedDownloader{
Q_OBJECT
private:
QString feed_url;
QString feed_name;
FeedFilters filters;
bittorrent *BTSession;
QString selected_filter; // name
public:
FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){
setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
Q_ASSERT(!feed_name.isEmpty());
rssfeed_lbl->setText(feed_name);
filters = FeedFilters::getFeedFilters(feed_url);
// Connect Signals/Slots
connect(filtersList, SIGNAL(currentItemChanged(QListWidgetItem* , QListWidgetItem *)), this, SLOT(showFilterSettings(QListWidgetItem *)));
connect(del_button, SIGNAL(clicked(bool)), this, SLOT(deleteFilter()));
connect(add_button, SIGNAL(clicked(bool)), this, SLOT(addFilter()));
connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int)));
// Restore saved info
enableDl_cb->setChecked(filters.isDownloadingEnabled());
// Fill filter list
foreach(QString filter_name, filters.names()) {
new QListWidgetItem(filter_name, filtersList);
}
if(filters.size() > 0) {
// Select first filter
filtersList->setCurrentItem(filtersList->item(0));
//showFilterSettings(filtersList->item(0));
}
// Show
show();
}
~FeedDownloaderDlg() {
// Make sure we save everything
saveCurrentFilterSettings();
filters.save();
}
protected slots:
void saveCurrentFilterSettings() {
if(!selected_filter.isEmpty()) {
FeedFilter filter = filters.getFilter(selected_filter);
filter.setMatchingTokens(match_line->text());
filter.setNotMatchingTokens(notmatch_line->text());
QString save_path = savepath_line->text().trimmed();
if(save_path.isEmpty())
save_path = BTSession->getDefaultSavePath();
filter.setSavePath(save_path);
// Save updated filter
filters.setFilter(selected_filter, filter);
}
}
void showFilterSettings(QListWidgetItem *item) {
// First, save current filter settings
saveCurrentFilterSettings();
if(!item) {
qDebug("No new selected item");
return;
}
// Actually show filter settings
QString filter_name = item->text();
FeedFilter filter = filters.getFilter(filter_name);
filterSettingsBox->setEnabled(true);
match_line->setText(filter.getMatchingTokens_str());
notmatch_line->setText(filter.getNotMatchingTokens_str());
QString save_path = filter.getSavePath();
if(save_path.isEmpty())
save_path = BTSession->getDefaultSavePath();
savepath_line->setText(save_path);
// Update selected filter
selected_filter = filter_name;
}
void deleteFilter() {
QList<QListWidgetItem *> items = filtersList->selectedItems();
if(items.size() == 1) {
filters.remove(selected_filter);
selected_filter = QString::null;
QListWidgetItem * item = items.first();
delete item;
// Reset Filter settings view
if(filters.size() == 0) {
clearFields();
filterSettingsBox->setEnabled(false);
}
}
}
void enableFilterBox(int state) {
if(state == Qt::Checked) {
filtersBox->setEnabled(true);
filters.setDownloadingEnabled(true);
} else {
filtersBox->setEnabled(false);
filters.setDownloadingEnabled(false);
}
}
QString askFilterName(QString name=QString::null) {
QString name_prop;
if(name.isEmpty())
name_prop = tr("New filter");
else
name_prop = name;
QString new_name;
bool validated = false;
do {
bool ok;
new_name = QInputDialog::getText(this, tr("Please choose a name for this filter"), tr("Filter name:"), QLineEdit::Normal, name_prop, &ok);
if(!ok) {
return QString::null;
}
// Validate filter name
new_name = new_name.trimmed();
if(new_name.isEmpty()) {
// Cannot be left empty
QMessageBox::critical(0, tr("Invalid filter name"), tr("The filter name cannot be left empty."));
} else {
validated = true;
}
} while(!validated);
return new_name;
}
void addFilter() {
QString filter_name = QString::null;
bool validated = false;
do {
filter_name = askFilterName();
if(filters.hasFilter(filter_name)) {
// Filter alread exists
QMessageBox::critical(0, tr("Invalid filter name"), tr("This filter name is already in use."));
} else {
validated = true;
}
}while(!validated);
QListWidgetItem *it = new QListWidgetItem(filter_name, filtersList);
filtersList->setCurrentItem(it);
//showFilterSettings(it);
}
void clearFields() {
match_line->clear();
notmatch_line->clear();
savepath_line->clear();
}
};
#endif // FEEDDOWNLOADER_H

377
src/FeedDownloader.ui

@ -0,0 +1,377 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FeedDownloader</class>
<widget class="QDialog" name="FeedDownloader">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>737</width>
<height>392</height>
</rect>
</property>
<property name="windowTitle">
<string>RSS Feed downloader</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>RSS feed:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="rssfeed_lbl">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Feed name</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="enableDl_cb">
<property name="text">
<string>Automatically download torrents from this feed</string>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="filtersBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="title">
<string>Download filters</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Filters:</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="filtersList"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="del_button">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="add_button">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="filterSettingsBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string/>
</property>
<property name="title">
<string>Filter settings</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Matches:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Does not match:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Destination folder:</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLineEdit" name="match_line">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="notmatch_line"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="savepath_line">
<property name="minimumSize">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="browse_button">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="icons.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>FeedDownloader</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>FeedDownloader</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

6
src/GUI.cpp

@ -315,7 +315,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
if(enable) { if(enable) {
// RSS tab // RSS tab
if(rssWidget == 0) { if(rssWidget == 0) {
rssWidget = new RSSImp(); rssWidget = new RSSImp(BTSession);
tabs->addTab(rssWidget, tr("RSS")); tabs->addTab(rssWidget, tr("RSS"));
tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png")));
} }
@ -450,8 +450,8 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
} }
void GUI::setPaused(QTorrentHandle &h) const { void GUI::setPaused(QTorrentHandle &h) const {
Q_ASSERT(h.is_paused()); if(!h.is_paused()) return;
qDebug("Marking torrent %s as paused", h.hash().toUtf8().data()); qDebug("Marking torrent %s as paused", h.hash().toLocal8Bit().data());
if(h.is_seed()) { if(h.is_seed()) {
// In finished list // In finished list
qDebug("Automatically paused torrent was in finished list"); qDebug("Automatically paused torrent was in finished list");

BIN
src/Icons/oxygen/list-add.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

BIN
src/Icons/oxygen/list-remove.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

BIN
src/Icons/oxygen/subscribe.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
src/Icons/oxygen/subscribe16.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 739 B

After

Width:  |  Height:  |  Size: 752 B

BIN
src/Icons/skin/add.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 842 B

BIN
src/Icons/skin/remove.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/Icons/url.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 629 B

After

Width:  |  Height:  |  Size: 722 B

50
src/bittorrent.cpp

@ -179,6 +179,12 @@ void bittorrent::setUploadLimit(QString hash, long val) {
void bittorrent::handleDownloadFailure(QString url, QString reason) { void bittorrent::handleDownloadFailure(QString url, QString reason) {
emit downloadFromUrlFailure(url, reason); emit downloadFromUrlFailure(url, reason);
// Clean up
int index = url_skippingDlg.indexOf(url);
if(index >= 0)
url_skippingDlg.removeAt(index);
if(savepath_fromurl.contains(url))
savepath_fromurl.remove(url);
} }
void bittorrent::startTorrentsInPause(bool b) { void bittorrent::startTorrentsInPause(bool b) {
@ -368,7 +374,7 @@ QTorrentHandle bittorrent::addMagnetUri(QString magnet_uri, bool resumed) {
return h; return h;
} }
if(resumed) { if(resumed) {
qDebug("Resuming magnet URI: %s", hash.toUtf8().data()); qDebug("Resuming magnet URI: %s", hash.toLocal8Bit().data());
} else { } else {
qDebug("Adding new magnet URI"); qDebug("Adding new magnet URI");
} }
@ -386,7 +392,7 @@ QTorrentHandle bittorrent::addMagnetUri(QString magnet_uri, bool resumed) {
} }
// Check if torrent is already in download list // Check if torrent is already in download list
if(s->find_torrent(sha1_hash(hash.toUtf8().data())).is_valid()) { if(s->find_torrent(sha1_hash(hash.toLocal8Bit().data())).is_valid()) {
qDebug("/!\\ Torrent is already in download list"); qDebug("/!\\ Torrent is already in download list");
// Update info Bar // Update info Bar
addConsoleMessage(tr("'%1' is already in download list.", "e.g: 'xxx.avi' is already in download list.").arg(magnet_uri)); addConsoleMessage(tr("'%1' is already in download list.", "e.g: 'xxx.avi' is already in download list.").arg(magnet_uri));
@ -405,7 +411,7 @@ QTorrentHandle bittorrent::addMagnetUri(QString magnet_uri, bool resumed) {
} }
} }
QString savePath = getSavePath(hash); QString savePath = getSavePath(hash);
qDebug("addMagnetURI: using save_path: %s", savePath.toUtf8().data()); qDebug("addMagnetURI: using save_path: %s", savePath.toLocal8Bit().data());
if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) { if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) {
p.save_path = savePath.toLocal8Bit().data(); p.save_path = savePath.toLocal8Bit().data();
} else { } else {
@ -455,12 +461,12 @@ QTorrentHandle bittorrent::addMagnetUri(QString magnet_uri, bool resumed) {
} }
// Save persistent data for new torrent // Save persistent data for new torrent
Q_ASSERT(h.is_valid()); Q_ASSERT(h.is_valid());
qDebug("addMagnetUri: hash: %s", h.hash().toUtf8().data()); qDebug("addMagnetUri: hash: %s", h.hash().toLocal8Bit().data());
TorrentPersistentData::saveTorrentPersistentData(h, true); TorrentPersistentData::saveTorrentPersistentData(h, true);
qDebug("Persistent data saved"); qDebug("Persistent data saved");
// Save save_path // Save save_path
if(!defaultTempPath.isEmpty()) { if(!defaultTempPath.isEmpty()) {
qDebug("addMagnetUri: Saving save_path in persistent data: %s", savePath.toUtf8().data()); qDebug("addMagnetUri: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data());
TorrentPersistentData::saveSavePath(hash, savePath); TorrentPersistentData::saveSavePath(hash, savePath);
} }
} }
@ -555,8 +561,14 @@ QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString fr
qDebug("Successfuly loaded"); qDebug("Successfuly loaded");
} }
} }
QString savePath = getSavePath(hash); QString savePath;
qDebug("addTorrent: using save_path: %s", savePath.toUtf8().data()); if(!from_url.isEmpty() && savepath_fromurl.contains(from_url)) {
// Enforcing the save path defined before URL download (from RSS for example)
savePath = savepath_fromurl.take(from_url);
} else {
savePath = getSavePath(hash);
}
qDebug("addTorrent: using save_path: %s", savePath.toLocal8Bit().data());
if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) { if(defaultTempPath.isEmpty() || (resumed && TorrentPersistentData::isSeed(hash))) {
p.save_path = savePath.toLocal8Bit().data(); p.save_path = savePath.toLocal8Bit().data();
} else { } else {
@ -609,7 +621,7 @@ QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString fr
TorrentPersistentData::saveTorrentPersistentData(h); TorrentPersistentData::saveTorrentPersistentData(h);
// Save save_path // Save save_path
if(!defaultTempPath.isEmpty()) { if(!defaultTempPath.isEmpty()) {
qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toUtf8().data()); qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data());
TorrentPersistentData::saveSavePath(hash, savePath); TorrentPersistentData::saveSavePath(hash, savePath);
} }
} }
@ -1002,6 +1014,10 @@ void bittorrent::setDefaultSavePath(QString savepath) {
defaultSavePath = savepath; defaultSavePath = savepath;
} }
QString bittorrent::getDefaultSavePath() const {
return defaultSavePath;
}
bool bittorrent::useTemporaryFolder() const { bool bittorrent::useTemporaryFolder() const {
return !defaultTempPath.isEmpty(); return !defaultTempPath.isEmpty();
} }
@ -1256,7 +1272,7 @@ void bittorrent::readAlerts() {
else if (metadata_received_alert* p = dynamic_cast<metadata_received_alert*>(a.get())) { else if (metadata_received_alert* p = dynamic_cast<metadata_received_alert*>(a.get())) {
QTorrentHandle h(p->handle); QTorrentHandle h(p->handle);
if(h.is_valid()) { if(h.is_valid()) {
qDebug("Received metadata for %s", h.hash().toUtf8().data()); qDebug("Received metadata for %s", h.hash().toLocal8Bit().data());
emit metadataReceived(h); emit metadataReceived(h);
if(h.is_paused()) { if(h.is_paused()) {
// XXX: Unfortunately libtorrent-rasterbar does not send a torrent_paused_alert // XXX: Unfortunately libtorrent-rasterbar does not send a torrent_paused_alert
@ -1279,7 +1295,7 @@ void bittorrent::readAlerts() {
} }
else if (torrent_paused_alert* p = dynamic_cast<torrent_paused_alert*>(a.get())) { else if (torrent_paused_alert* p = dynamic_cast<torrent_paused_alert*>(a.get())) {
QTorrentHandle h(p->handle); QTorrentHandle h(p->handle);
qDebug("Received a torrent_paused_alert for %s", h.hash().toUtf8().data()); qDebug("Received a torrent_paused_alert for %s", h.hash().toLocal8Bit().data());
if(h.is_valid()) { if(h.is_valid()) {
emit torrentPaused(h); emit torrentPaused(h);
} }
@ -1379,14 +1395,14 @@ QString bittorrent::getSavePath(QString hash) {
QString savePath; QString savePath;
if(TorrentTempData::hasTempData(hash)) { if(TorrentTempData::hasTempData(hash)) {
savePath = TorrentTempData::getSavePath(hash); savePath = TorrentTempData::getSavePath(hash);
qDebug("getSavePath, got save_path from temp data: %s", savePath.toUtf8().data()); qDebug("getSavePath, got save_path from temp data: %s", savePath.toLocal8Bit().data());
} else { } else {
savePath = TorrentPersistentData::getSavePath(hash); savePath = TorrentPersistentData::getSavePath(hash);
qDebug("getSavePath, got save_path from persistent data: %s", savePath.toUtf8().data()); qDebug("getSavePath, got save_path from persistent data: %s", savePath.toLocal8Bit().data());
} }
if(savePath.isEmpty()) { if(savePath.isEmpty()) {
// use default save path if no other can be found // use default save path if no other can be found
qDebug("Using default save path because none was set: %s", defaultSavePath.toUtf8().data()); qDebug("Using default save path because none was set: %s", defaultSavePath.toLocal8Bit().data());
savePath = defaultSavePath; savePath = defaultSavePath;
} }
// Checking if savePath Dir exists // Checking if savePath Dir exists
@ -1412,8 +1428,10 @@ void bittorrent::downloadFromUrl(QString url) {
downloader->downloadUrl(url); downloader->downloadUrl(url);
} }
void bittorrent::downloadUrlAndSkipDialog(QString url) { void bittorrent::downloadUrlAndSkipDialog(QString url, QString save_path) {
//emit aboutToDownloadFromUrl(url); //emit aboutToDownloadFromUrl(url);
if(!save_path.isEmpty())
savepath_fromurl[url] = save_path;
url_skippingDlg << url; url_skippingDlg << url;
// Launch downloader thread // Launch downloader thread
downloader->downloadUrl(url); downloader->downloadUrl(url);
@ -1491,7 +1509,7 @@ void bittorrent::startUpTorrents() {
QPair<int, QString> couple; QPair<int, QString> couple;
foreach(couple, hashes) { foreach(couple, hashes) {
QString hash = couple.second; QString hash = couple.second;
qDebug("Starting up torrent %s", hash.toUtf8().data()); qDebug("Starting up torrent %s", hash.toLocal8Bit().data());
if(TorrentPersistentData::isMagnet(hash)) { if(TorrentPersistentData::isMagnet(hash)) {
addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true); addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true);
} else { } else {
@ -1501,7 +1519,7 @@ void bittorrent::startUpTorrents() {
} else { } else {
// Resume downloads // Resume downloads
foreach(const QString &hash, known_torrents) { foreach(const QString &hash, known_torrents) {
qDebug("Starting up torrent %s", hash.toUtf8().data()); qDebug("Starting up torrent %s", hash.toLocal8Bit().data());
if(TorrentPersistentData::isMagnet(hash)) if(TorrentPersistentData::isMagnet(hash))
addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true); addMagnetUri(TorrentPersistentData::getMagnetUri(hash), true);
else else

4
src/bittorrent.h

@ -76,6 +76,7 @@ class bittorrent : public QObject {
QString filterPath; QString filterPath;
bool queueingEnabled; bool queueingEnabled;
QStringList url_skippingDlg; QStringList url_skippingDlg;
QHash<QString, QString> savepath_fromurl;
protected: protected:
QString getSavePath(QString hash); QString getSavePath(QString hash);
@ -108,6 +109,7 @@ class bittorrent : public QObject {
QStringList getPeerBanMessages() const; QStringList getPeerBanMessages() const;
qlonglong getETA(QString hash) const; qlonglong getETA(QString hash) const;
bool useTemporaryFolder() const; bool useTemporaryFolder() const;
QString getDefaultSavePath() const;
public slots: public slots:
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false); QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
@ -137,7 +139,7 @@ class bittorrent : public QObject {
void loadWebSeeds(QString fileHash); void loadWebSeeds(QString fileHash);
void increaseDlTorrentPriority(QString hash); void increaseDlTorrentPriority(QString hash);
void decreaseDlTorrentPriority(QString hash); void decreaseDlTorrentPriority(QString hash);
void downloadUrlAndSkipDialog(QString); void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null);
// Session configuration - Setters // Session configuration - Setters
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports); void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
void setMaxConnections(int maxConnec); void setMaxConnections(int maxConnec);

332
src/createtorrent.ui

@ -1,33 +1,34 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>createTorrentDialog</class> <class>createTorrentDialog</class>
<widget class="QDialog" name="createTorrentDialog" > <widget class="QDialog" name="createTorrentDialog">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>592</width> <width>592</width>
<height>655</height> <height>658</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Torrent Creation Tool</string> <string>Torrent Creation Tool</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<item> <item>
<widget class="QLabel" name="createTorrent_title" > <widget class="QLabel" name="createTorrent_title">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>27</height> <height>27</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
<height>27</height> <height>27</height>
</size> </size>
</property> </property>
<property name="font" > <property name="font">
<font> <font>
<family>Sans Serif</family> <family>Sans Serif</family>
<pointsize>14</pointsize> <pointsize>14</pointsize>
@ -38,105 +39,107 @@
<strikeout>false</strikeout> <strikeout>false</strikeout>
</font> </font>
</property> </property>
<property name="text" > <property name="text">
<string>Torrent file creation</string> <string>Torrent file creation</string>
</property> </property>
<property name="alignment" > <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="lbl_input" > <widget class="QLabel" name="lbl_input">
<property name="text" > <property name="text">
<string>File or folder to add to the torrent:</string> <string>File or folder to add to the torrent:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="textInputPath" /> <widget class="QLineEdit" name="textInputPath"/>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<item> <item>
<widget class="QPushButton" name="addFile_button" > <widget class="QPushButton" name="addFile_button">
<property name="text" > <property name="text">
<string>Add a file</string> <string>Add a file</string>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/add_file.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/add_file.png</normaloff>:/Icons/add_file.png</iconset>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="addFolder_button" > <widget class="QPushButton" name="addFolder_button">
<property name="text" > <property name="text">
<string>Add a folder</string> <string>Add a folder</string>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/add_folder.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/add_folder.png</normaloff>:/Icons/add_folder.png</iconset>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<item> <item>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<item> <item>
<widget class="QLabel" name="lbl_announce_url" > <widget class="QLabel" name="lbl_announce_url">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>102</height> <height>102</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
<height>70</height> <height>70</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string>Announce urls (trackers):</string> <string>Announce urls (trackers):</string>
</property> </property>
<property name="buddy" > <property name="buddy">
<cstring></cstring> <cstring></cstring>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="urlSeeds_lbl" > <widget class="QLabel" name="urlSeeds_lbl">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>101</height> <height>101</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string>Web seeds urls (optional):</string> <string>Web seeds urls (optional):</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="lbl_comment" > <widget class="QLabel" name="lbl_comment">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>102</height> <height>102</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
<height>102</height> <height>102</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string>Comment (optional):</string> <string>Comment (optional):</string>
</property> </property>
<property name="buddy" > <property name="buddy">
<cstring>txt_comment</cstring> <cstring>txt_comment</cstring>
</property> </property>
</widget> </widget>
@ -144,54 +147,36 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin" > <property name="margin">
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QListWidget" name="trackers_list" > <widget class="QListWidget" name="trackers_list">
<property name="selectionMode" > <property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum> <enum>QAbstractItemView::MultiSelection</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin" > <property name="margin">
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>16</height> <height>16</height>
@ -200,55 +185,69 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="addTracker_button" > <widget class="QPushButton" name="addTracker_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/skin/add.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="removeTracker_button" > <widget class="QPushButton" name="removeTracker_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/skin/remove.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>16</height> <height>16</height>
@ -261,52 +260,34 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin" > <property name="margin">
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QListWidget" name="URLSeeds_list" > <widget class="QListWidget" name="URLSeeds_list">
<property name="selectionMode" > <property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum> <enum>QAbstractItemView::MultiSelection</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin" > <property name="margin">
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>16</height> <height>16</height>
@ -315,55 +296,69 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="addURLSeed_button" > <widget class="QPushButton" name="addURLSeed_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/skin/add.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="removeURLSeed_button" > <widget class="QPushButton" name="removeURLSeed_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>22</width> <width>22</width>
<height>22</height> <height>22</height>
</size> </size>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="icon" > <property name="icon">
<iconset resource="icons.qrc" >:/Icons/skin/remove.png</iconset> <iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
</property>
<property name="iconSize">
<size>
<width>18</width>
<height>18</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>16</height> <height>16</height>
@ -376,14 +371,14 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QTextEdit" name="txt_comment" > <widget class="QTextEdit" name="txt_comment">
<property name="maximumSize" > <property name="maximumSize">
<size> <size>
<width>421</width> <width>421</width>
<height>102</height> <height>102</height>
</size> </size>
</property> </property>
<property name="acceptRichText" > <property name="acceptRichText">
<bool>false</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
@ -393,56 +388,56 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<item> <item>
<widget class="QLabel" name="txtPieceSize" > <widget class="QLabel" name="txtPieceSize">
<property name="text" > <property name="text">
<string>Piece size:</string> <string>Piece size:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="comboPieceSize" > <widget class="QComboBox" name="comboPieceSize">
<property name="currentIndex" > <property name="currentIndex">
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<property name="text" > <property name="text">
<string>32 KiB</string> <string>32 KiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>64 KiB</string> <string>64 KiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>128 KiB</string> <string>128 KiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>256 KiB</string> <string>256 KiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>512 KiB</string> <string>512 KiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>1 MiB</string> <string>1 MiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>2 MiB</string> <string>2 MiB</string>
</property> </property>
</item> </item>
<item> <item>
<property name="text" > <property name="text">
<string>4 MiB</string> <string>4 MiB</string>
</property> </property>
</item> </item>
@ -450,10 +445,10 @@
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
@ -464,56 +459,47 @@
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="check_private" > <widget class="QCheckBox" name="check_private">
<property name="text" > <property name="text">
<string>Private (won't be distributed on DHT network if enabled)</string> <string>Private (won't be distributed on DHT network if enabled)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="checkStartSeeding" > <widget class="QCheckBox" name="checkStartSeeding">
<property name="text" > <property name="text">
<string>Start seeding after creation</string> <string>Start seeding after creation</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="progressLbl" > <widget class="QLabel" name="progressLbl">
<property name="text" > <property name="text">
<string>Progress:</string> <string>Progress:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QProgressBar" name="progressBar" > <widget class="QProgressBar" name="progressBar">
<property name="value" > <property name="value">
<number>0</number> <number>0</number>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin" > <property name="margin">
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>131</width> <width>131</width>
<height>31</height> <height>31</height>
@ -522,25 +508,25 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="createButton" > <widget class="QPushButton" name="createButton">
<property name="text" > <property name="text">
<string>Create and save...</string> <string>Create and save...</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="cancelButton" > <widget class="QPushButton" name="cancelButton">
<property name="text" > <property name="text">
<string>Cancel</string> <string>Cancel</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" > <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
@ -553,7 +539,7 @@
</layout> </layout>
</widget> </widget>
<resources> <resources>
<include location="icons.qrc" /> <include location="icons.qrc"/>
</resources> </resources>
<connections> <connections>
<connection> <connection>
@ -562,11 +548,11 @@
<receiver>createTorrentDialog</receiver> <receiver>createTorrentDialog</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>355</x> <x>355</x>
<y>275</y> <y>275</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>179</x> <x>179</x>
<y>282</y> <y>282</y>
</hint> </hint>

2
src/engineSelectDlg.cpp

@ -59,7 +59,7 @@ engineSelectDlg::engineSelectDlg(QWidget *parent) : QDialog(parent) {
pluginsTree->hideColumn(ENGINE_ID); pluginsTree->hideColumn(ENGINE_ID);
actionEnable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); actionEnable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
actionDisable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); actionDisable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
actionUninstall->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); actionUninstall->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png")));
connect(actionEnable, SIGNAL(triggered()), this, SLOT(enableSelection())); connect(actionEnable, SIGNAL(triggered()), this, SLOT(enableSelection()));
connect(actionDisable, SIGNAL(triggered()), this, SLOT(disableSelection())); connect(actionDisable, SIGNAL(triggered()), this, SLOT(disableSelection()));
connect(pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&))); connect(pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&)));

4
src/icons.qrc

@ -19,7 +19,6 @@
<file>Icons/skin/qbittorrent22.png</file> <file>Icons/skin/qbittorrent22.png</file>
<file>Icons/skin/new.png</file> <file>Icons/skin/new.png</file>
<file>Icons/skin/preview.png</file> <file>Icons/skin/preview.png</file>
<file>Icons/skin/add.png</file>
<file>Icons/skin/stalled.png</file> <file>Icons/skin/stalled.png</file>
<file>Icons/skin/delete.png</file> <file>Icons/skin/delete.png</file>
<file>Icons/skin/url.png</file> <file>Icons/skin/url.png</file>
@ -31,7 +30,6 @@
<file>Icons/skin/paused.png</file> <file>Icons/skin/paused.png</file>
<file>Icons/skin/qb_question.png</file> <file>Icons/skin/qb_question.png</file>
<file>Icons/skin/open.png</file> <file>Icons/skin/open.png</file>
<file>Icons/skin/remove.png</file>
<file>Icons/skin/qbittorrent16.png</file> <file>Icons/skin/qbittorrent16.png</file>
<file>Icons/skin/downloading.png</file> <file>Icons/skin/downloading.png</file>
<file>Icons/skin/search.png</file> <file>Icons/skin/search.png</file>
@ -96,8 +94,10 @@
<file>Icons/oxygen/edit-copy.png</file> <file>Icons/oxygen/edit-copy.png</file>
<file>Icons/oxygen/bt_settings.png</file> <file>Icons/oxygen/bt_settings.png</file>
<file>Icons/oxygen/webui.png</file> <file>Icons/oxygen/webui.png</file>
<file>Icons/oxygen/list-remove.png</file>
<file>Icons/oxygen/connection.png</file> <file>Icons/oxygen/connection.png</file>
<file>Icons/oxygen/bug.png</file> <file>Icons/oxygen/bug.png</file>
<file>Icons/oxygen/list-add.png</file>
<file>Icons/oxygen/folder.png</file> <file>Icons/oxygen/folder.png</file>
<file>Icons/oxygen/configure.png</file> <file>Icons/oxygen/configure.png</file>
<file>Icons/oxygen/edit-cut.png</file> <file>Icons/oxygen/edit-cut.png</file>

BIN
src/lang/qbittorrent_bg.qm

Binary file not shown.

566
src/lang/qbittorrent_bg.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ca.qm

Binary file not shown.

571
src/lang/qbittorrent_ca.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_cs.qm

Binary file not shown.

566
src/lang/qbittorrent_cs.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_da.qm

Binary file not shown.

571
src/lang/qbittorrent_da.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_de.qm

Binary file not shown.

566
src/lang/qbittorrent_de.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_el.qm

Binary file not shown.

566
src/lang/qbittorrent_el.ts

File diff suppressed because it is too large Load Diff

567
src/lang/qbittorrent_en.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_es.qm

Binary file not shown.

569
src/lang/qbittorrent_es.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_fi.qm

Binary file not shown.

566
src/lang/qbittorrent_fi.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_fr.qm

Binary file not shown.

566
src/lang/qbittorrent_fr.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_hu.qm

Binary file not shown.

566
src/lang/qbittorrent_hu.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_it.qm

Binary file not shown.

566
src/lang/qbittorrent_it.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ja.qm

Binary file not shown.

569
src/lang/qbittorrent_ja.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_ko.qm

Binary file not shown.

566
src/lang/qbittorrent_ko.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_nb.qm

Binary file not shown.

571
src/lang/qbittorrent_nb.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_nl.qm

Binary file not shown.

569
src/lang/qbittorrent_nl.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_pl.qm

Binary file not shown.

569
src/lang/qbittorrent_pl.ts

File diff suppressed because it is too large Load Diff

BIN
src/lang/qbittorrent_pt.qm

Binary file not shown.

69
src/lang/qbittorrent_pt.ts

@ -649,7 +649,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Duplo clique na lista de transferência <translation type="obsolete">Duplo clique na lista de transferência
qBittorrent irá procurar no diretório e baixará automaticamente torrents present</translation> qBittorrent irá procurar no diretório e baixará automaticamente torrents present</translation>
</message> </message>
<message> <message>
@ -910,6 +910,11 @@ qBittorrent irá procurar no diretório e baixará automaticamente torrents pres
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2252,7 +2257,7 @@ Deseja mesmo sair do qBittorrent?</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Info:&lt;/b&gt; &lt;i&gt;(clique-duplo para abrir o link no seu browser)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Info:&lt;/b&gt; &lt;i&gt;(clique-duplo para abrir o link no seu browser)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2274,6 +2279,22 @@ Deseja mesmo sair do qBittorrent?</translation>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Marcar todos como lido</translation> <translation>Marcar todos como lido</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2729,7 +2750,7 @@ Log de mudanças:</translation>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Baixar em ordem (lento mas bom para pré-visualizar)</translation> <translation type="obsolete">Baixar em ordem (lento mas bom para pré-visualizar)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2775,6 +2796,22 @@ Log de mudanças:</translation>
<source>Expand all</source> <source>Expand all</source>
<translation>Expandir todos</translation> <translation>Expandir todos</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Desconhecido</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2903,6 +2940,10 @@ Log de mudanças:</translation>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>baixando &apos;%1&apos;, por favor espere...</translation> <translation>baixando &apos;%1&apos;, por favor espere...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3300,6 +3341,10 @@ Log de mudanças:</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Forçar re-checagem</translation> <translation>Forçar re-checagem</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4218,6 +4263,10 @@ Portanto os plugins foram desabilitados.</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Forçar re-checagem</translation> <translation>Forçar re-checagem</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4332,5 +4381,19 @@ Portanto os plugins foram desabilitados.</translation>
<source>Priority</source> <source>Priority</source>
<translation>Prioridade</translation> <translation>Prioridade</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Desconhecido</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_pt_BR.qm

Binary file not shown.

69
src/lang/qbittorrent_pt_BR.ts

@ -649,7 +649,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Duplo clique na lista de transferência <translation type="obsolete">Duplo clique na lista de transferência
qBittorrent irá procurar no diretório e baixará automaticamente torrents present</translation> qBittorrent irá procurar no diretório e baixará automaticamente torrents present</translation>
</message> </message>
<message> <message>
@ -910,6 +910,11 @@ qBittorrent irá procurar no diretório e baixará automaticamente torrents pres
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2252,7 +2257,7 @@ Deseja mesmo sair do qBittorrent?</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Info:&lt;/b&gt; &lt;i&gt;(clique-duplo para abrir o link no seu browser)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Info:&lt;/b&gt; &lt;i&gt;(clique-duplo para abrir o link no seu browser)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2274,6 +2279,22 @@ Deseja mesmo sair do qBittorrent?</translation>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Marcar todos como lido</translation> <translation>Marcar todos como lido</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2729,7 +2750,7 @@ Log de mudanças:</translation>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Baixar em ordem (lento mas bom para pré-visualizar)</translation> <translation type="obsolete">Baixar em ordem (lento mas bom para pré-visualizar)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2775,6 +2796,22 @@ Log de mudanças:</translation>
<source>Expand all</source> <source>Expand all</source>
<translation>Expandir todos</translation> <translation>Expandir todos</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Desconhecido</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2903,6 +2940,10 @@ Log de mudanças:</translation>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>baixando &apos;%1&apos;, por favor espere...</translation> <translation>baixando &apos;%1&apos;, por favor espere...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3300,6 +3341,10 @@ Log de mudanças:</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Forçar re-checagem</translation> <translation>Forçar re-checagem</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4218,6 +4263,10 @@ Portanto os plugins foram desabilitados.</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Forçar re-checagem</translation> <translation>Forçar re-checagem</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4332,5 +4381,19 @@ Portanto os plugins foram desabilitados.</translation>
<source>Priority</source> <source>Priority</source>
<translation>Prioridade</translation> <translation>Prioridade</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Desconhecido</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_ro.qm

Binary file not shown.

69
src/lang/qbittorrent_ro.ts

@ -657,7 +657,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Lista cu transferuri dublu-click <translation type="obsolete">Lista cu transferuri dublu-click
qBittorrent va monitoriza directoriul și va adăuga în lista de descărcare a torentelor din directoriu</translation> qBittorrent va monitoriza directoriul și va adăuga în lista de descărcare a torentelor din directoriu</translation>
</message> </message>
<message> <message>
@ -918,6 +918,11 @@ qBittorrent va monitoriza directoriul și va adăuga în lista de descărcare a
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2181,7 +2186,7 @@ Motivul : %2</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Noutăţi:&lt;/b&gt; &lt;i&gt;(dubli click pentru a deschide)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Noutăţi:&lt;/b&gt; &lt;i&gt;(dubli click pentru a deschide)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2203,6 +2208,22 @@ Motivul : %2</translation>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Marchează toate ca citite</translation> <translation>Marchează toate ca citite</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2568,7 +2589,7 @@ Changelog:
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Descarcă în ordine corectă (mai încet dar bun pentru preview)</translation> <translation type="obsolete">Descarcă în ordine corectă (mai încet dar bun pentru preview)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2614,6 +2635,22 @@ Changelog:
<source>Expand all</source> <source>Expand all</source>
<translation>Deschide toate</translation> <translation>Deschide toate</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Necunoscut</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2742,6 +2779,10 @@ Changelog:
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>Descarc &apos;%1&apos;, rugăm aşteptaţi...</translation> <translation>Descarc &apos;%1&apos;, rugăm aşteptaţi...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3139,6 +3180,10 @@ Changelog:
<source>Force recheck</source> <source>Force recheck</source>
<translation>Reverificarea forţată</translation> <translation>Reverificarea forţată</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4065,6 +4110,10 @@ Numai acele adăugate de dvs. pot fi dezinstalate.
<source>Force recheck</source> <source>Force recheck</source>
<translation>Reverificarea forţată</translation> <translation>Reverificarea forţată</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4179,5 +4228,19 @@ Numai acele adăugate de dvs. pot fi dezinstalate.
<source>Priority</source> <source>Priority</source>
<translation>Prioritate</translation> <translation>Prioritate</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Necunoscut</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_ru.qm

Binary file not shown.

69
src/lang/qbittorrent_ru.ts

@ -704,7 +704,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Двойной щелчок по списку закачек</translation> <translation type="obsolete">Двойной щелчок по списку закачек</translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -964,6 +964,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2354,7 +2359,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Новости:&lt;/b&gt; &lt;i&gt;(двойной клик откроет ссылку в вашем браузере)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Новости:&lt;/b&gt; &lt;i&gt;(двойной клик откроет ссылку в вашем браузере)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2376,6 +2381,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Отметить все как прочитанное</translation> <translation>Отметить все как прочитанное</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2753,7 +2774,7 @@ Changelog:
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Загрузить в правильном порядке (медленнее, но удобнее для предпросмотра)</translation> <translation type="obsolete">Загрузить в правильном порядке (медленнее, но удобнее для предпросмотра)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2803,6 +2824,22 @@ Changelog:
<source>Expand all</source> <source>Expand all</source>
<translation>Развернуть все</translation> <translation>Развернуть все</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Неизвестно</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2931,6 +2968,10 @@ Changelog:
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>Скачивание &apos;%1&apos;, подождите...</translation> <translation>Скачивание &apos;%1&apos;, подождите...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3320,6 +3361,10 @@ Changelog:
<source>Force recheck</source> <source>Force recheck</source>
<translation>Проверить принудительно</translation> <translation>Проверить принудительно</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4275,6 +4320,10 @@ However, those plugins were disabled.</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Проверить принудительно</translation> <translation>Проверить принудительно</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4389,5 +4438,19 @@ However, those plugins were disabled.</source>
<source>Priority</source> <source>Priority</source>
<translation>Приоритет</translation> <translation>Приоритет</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Неизвестно</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_sk.qm

Binary file not shown.

69
src/lang/qbittorrent_sk.ts

@ -665,7 +665,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Dvojité kliknutie v zozname prenosov</translation> <translation type="obsolete">Dvojité kliknutie v zozname prenosov</translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -925,6 +925,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2256,7 +2261,7 @@ Ste si istý, že chcete ukončiť qBittorrent?</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Novinky:&lt;/b&gt; &lt;i&gt;(dvojitým kliknutím otvoríte odkaz vo webovom prehliadači)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Novinky:&lt;/b&gt; &lt;i&gt;(dvojitým kliknutím otvoríte odkaz vo webovom prehliadači)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Delete</source> <source>Delete</source>
@ -2290,6 +2295,22 @@ Ste si istý, že chcete ukončiť qBittorrent?</translation>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Označiť všetky ako prečítané</translation> <translation>Označiť všetky ako prečítané</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2666,7 +2687,7 @@ Záznam zmien:</translation>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Stiahnuť v správnom poradí (pomalšie ale lepšie pre náhľad)</translation> <translation type="obsolete">Stiahnuť v správnom poradí (pomalšie ale lepšie pre náhľad)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2720,6 +2741,22 @@ Záznam zmien:</translation>
<source>Expand all</source> <source>Expand all</source>
<translation>Rozbaliť všetko</translation> <translation>Rozbaliť všetko</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2848,6 +2885,10 @@ Záznam zmien:</translation>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>Sťahuje sa %1, čakajte prosím...</translation> <translation>Sťahuje sa %1, čakajte prosím...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3249,6 +3290,10 @@ Záznam zmien:</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Vynútiť opätovnú kontrolu</translation> <translation>Vynútiť opätovnú kontrolu</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4243,6 +4288,10 @@ Tieto moduly však boli vypnuté.</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Vynútiť opätovnú kontrolu</translation> <translation>Vynútiť opätovnú kontrolu</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4357,5 +4406,19 @@ Tieto moduly však boli vypnuté.</translation>
<source>Priority</source> <source>Priority</source>
<translation>Priorita</translation> <translation>Priorita</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_sv.qm

Binary file not shown.

69
src/lang/qbittorrent_sv.ts

@ -339,7 +339,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Dubbelklick i överföringslistan</translation> <translation type="obsolete">Dubbelklick i överföringslistan</translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -607,6 +607,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation>Simulera µtorrent för att undvika bannlysning (kräver omstart)</translation> <translation>Simulera µtorrent för att undvika bannlysning (kräver omstart)</translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -1175,7 +1180,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Nyheter:&lt;/b&gt; &lt;i&gt;(dubbelklicka för att öppna länken i din webbläsare)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Nyheter:&lt;/b&gt; &lt;i&gt;(dubbelklicka för att öppna länken i din webbläsare)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -1197,6 +1202,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Markera alla som lästa</translation> <translation>Markera alla som lästa</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -1421,7 +1442,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Hämta i korrekt ordning (långsammare men bra för förhandsvisning)</translation> <translation type="obsolete">Hämta i korrekt ordning (långsammare men bra för förhandsvisning)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -1463,6 +1484,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Expand all</source> <source>Expand all</source>
<translation>Fäll ut alla</translation> <translation>Fäll ut alla</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -1591,6 +1628,10 @@ Are you sure you want to quit qBittorrent?</source>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>Hämtar &quot;%1&quot;, vänta...</translation> <translation>Hämtar &quot;%1&quot;, vänta...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -1876,6 +1917,10 @@ Are you sure you want to quit qBittorrent?</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Tvinga återkontroll</translation> <translation>Tvinga återkontroll</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -2503,6 +2548,10 @@ Dock har dessa insticksmoduler blivit inaktiverade.</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Tvinga återkontroll</translation> <translation>Tvinga återkontroll</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -2597,5 +2646,19 @@ Dock har dessa insticksmoduler blivit inaktiverade.</translation>
<source>Priority</source> <source>Priority</source>
<translation>Prioritet</translation> <translation>Prioritet</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_tr.qm

Binary file not shown.

69
src/lang/qbittorrent_tr.ts

@ -690,7 +690,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Aktarım listesinde çift-tıklamada yapılacak </translation> <translation type="obsolete">Aktarım listesinde çift-tıklamada yapılacak </translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -950,6 +950,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2340,7 +2345,7 @@ qBittorrent&apos;ten çıkmak istediğinize emin misiniz?</translation>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Haberler:&lt;/b&gt; &lt;i&gt;(bağlantıyı tarayıcınızda açmak için çift tıklayın)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Haberler:&lt;/b&gt; &lt;i&gt;(bağlantıyı tarayıcınızda açmak için çift tıklayın)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2362,6 +2367,22 @@ qBittorrent&apos;ten çıkmak istediğinize emin misiniz?</translation>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Tümünü okunmuş olarak işaretle</translation> <translation>Tümünü okunmuş olarak işaretle</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2735,7 +2756,7 @@ Changelog:
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Doğru düzende indir (yavaş ama önizleme için iyi)</translation> <translation type="obsolete">Doğru düzende indir (yavaş ama önizleme için iyi)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2785,6 +2806,22 @@ Changelog:
<source>Expand all</source> <source>Expand all</source>
<translation>Tümünü genişlet</translation> <translation>Tümünü genişlet</translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Bilinmeyen</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2913,6 +2950,10 @@ Changelog:
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>&apos;%1&apos; indiriliyor, lütfen bekleyin...</translation> <translation>&apos;%1&apos; indiriliyor, lütfen bekleyin...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3298,6 +3339,10 @@ Changelog:
<source>Force recheck</source> <source>Force recheck</source>
<translation>Yeniden denetlemeye çalış</translation> <translation>Yeniden denetlemeye çalış</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4229,6 +4274,10 @@ Bununla birlikte, o eklentiler devre dışı.</translation>
<source>Force recheck</source> <source>Force recheck</source>
<translation>Yeniden denetlemeye çalış</translation> <translation>Yeniden denetlemeye çalış</translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4343,5 +4392,19 @@ Bununla birlikte, o eklentiler devre dışı.</translation>
<source>Priority</source> <source>Priority</source>
<translation>Öncelik</translation> <translation>Öncelik</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Bilinmeyen</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_uk.qm

Binary file not shown.

72
src/lang/qbittorrent_uk.ts

@ -697,11 +697,6 @@ p, li { white-space: pre-wrap; }
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation>Спостерігати за папкою</translation> <translation>Спостерігати за папкою</translation>
</message> </message>
<message>
<source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -935,6 +930,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2320,7 +2320,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;Новини:&lt;/b&gt; &lt;i&gt;(подвійний клік відкриє посилання у вашому броузері)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;Новини:&lt;/b&gt; &lt;i&gt;(подвійний клік відкриє посилання у вашому броузері)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -2342,6 +2342,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation>Позначити всі як прочитані</translation> <translation>Позначити всі як прочитані</translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -2719,7 +2735,7 @@ Changelog:
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>Завантажувати в правильному порядку (повільніше, але краще для перегляду)</translation> <translation type="obsolete">Завантажувати в правильному порядку (повільніше, але краще для перегляду)</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -2769,6 +2785,22 @@ Changelog:
<source>Expand all</source> <source>Expand all</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished">Невідомо</translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -2897,6 +2929,10 @@ Changelog:
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3294,6 +3330,10 @@ Changelog:
<source>Force recheck</source> <source>Force recheck</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4227,6 +4267,10 @@ However, those plugins were disabled.</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4341,5 +4385,19 @@ However, those plugins were disabled.</source>
<source>Priority</source> <source>Priority</source>
<translation>Пріоритет</translation> <translation>Пріоритет</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished">Невідомо</translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_zh.qm

Binary file not shown.

69
src/lang/qbittorrent_zh.ts

@ -771,7 +771,7 @@ folder:</source>
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation></translation> <translation type="obsolete"></translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -997,6 +997,11 @@ folder:</source>
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation>µtorrent名义避免被阻止()</translation> <translation>µtorrent名义避免被阻止()</translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -2506,7 +2511,23 @@ link in your web browser)&lt;/i&gt;</source>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;:&lt;/b&gt; &lt;i&gt;(双击以连接到网页浏览器)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;:&lt;/b&gt; &lt;i&gt;(双击以连接到网页浏览器)&lt;/i&gt;</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -2962,7 +2983,7 @@ previewing)</source>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation>()</translation> <translation type="obsolete">()</translation>
</message> </message>
<message> <message>
<source>Collapse all</source> <source>Collapse all</source>
@ -2976,6 +2997,22 @@ previewing)</source>
<source>Expand all</source> <source>Expand all</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -3104,6 +3141,10 @@ previewing)</source>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation>&apos;%1&apos;,...</translation> <translation>&apos;%1&apos;,...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -3502,6 +3543,10 @@ enabled)</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -4528,6 +4573,10 @@ network.</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -4647,5 +4696,19 @@ torrent.</source>
<source>This file is either corrupted or this isn&apos;t a torrent.</source> <source>This file is either corrupted or this isn&apos;t a torrent.</source>
<translation type="obsolete">torrent文件或已经损坏.</translation> <translation type="obsolete">torrent文件或已经损坏.</translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

BIN
src/lang/qbittorrent_zh_TW.qm

Binary file not shown.

69
src/lang/qbittorrent_zh_TW.ts

@ -337,7 +337,7 @@ p, li { white-space: pre-wrap; }
<message> <message>
<source>Transfer lists double-click</source> <source>Transfer lists double-click</source>
<comment>qBittorrent will watch a directory and automatically download torrents present in it</comment> <comment>qBittorrent will watch a directory and automatically download torrents present in it</comment>
<translation></translation> <translation type="obsolete"></translation>
</message> </message>
<message> <message>
<source>Download list:</source> <source>Download list:</source>
@ -609,6 +609,11 @@ p, li { white-space: pre-wrap; }
<source>Spoof µtorrent to avoid ban (requires restart)</source> <source>Spoof µtorrent to avoid ban (requires restart)</source>
<translation> µtorrent ()</translation> <translation> µtorrent ()</translation>
</message> </message>
<message>
<source>Transfer lists double-click action</source>
<comment>Action executed when doucle-clicking on an item in transfer (download/upload) list</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>DownloadingTorrents</name> <name>DownloadingTorrents</name>
@ -1264,7 +1269,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source> <source>&lt;b&gt;News:&lt;/b&gt; &lt;i&gt;(double-click to open the link in your web browser)&lt;/i&gt;</source>
<translation>&lt;b&gt;:&lt;/b&gt; &lt;i&gt;(雙擊連結從網路瀏覽器打開)&lt;/i&gt;</translation> <translation type="obsolete">&lt;b&gt;:&lt;/b&gt; &lt;i&gt;(雙擊連結從網路瀏覽器打開)&lt;/i&gt;</translation>
</message> </message>
<message> <message>
<source>Add RSS stream</source> <source>Add RSS stream</source>
@ -1286,6 +1291,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Mark all as read</source> <source>Mark all as read</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download torrent</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open news URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RSSImp</name> <name>RSSImp</name>
@ -1510,7 +1531,7 @@ Are you sure you want to quit qBittorrent?</source>
</message> </message>
<message> <message>
<source>Download in correct order (slower but good for previewing)</source> <source>Download in correct order (slower but good for previewing)</source>
<translation> ()</translation> <translation type="obsolete"> ()</translation>
</message> </message>
<message> <message>
<source>Add to download list in paused state</source> <source>Add to download list in paused state</source>
@ -1552,6 +1573,22 @@ Are you sure you want to quit qBittorrent?</source>
<source>Expand all</source> <source>Expand all</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Torrent size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Free disk space:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download in sequential order (slower but good for previewing)</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>authentication</name> <name>authentication</name>
@ -1680,6 +1717,10 @@ Are you sure you want to quit qBittorrent?</source>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment> <comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation> &apos;%1&apos; , ...</translation> <translation> &apos;%1&apos; , ...</translation>
</message> </message>
<message>
<source>&apos;%1&apos; is not a valid magnet URI.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>createTorrentDialog</name> <name>createTorrentDialog</name>
@ -1977,6 +2018,10 @@ Are you sure you want to quit qBittorrent?</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>engineSelect</name> <name>engineSelect</name>
@ -2612,6 +2657,10 @@ However, those plugins were disabled.</source>
<source>Force recheck</source> <source>Force recheck</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Copy magnet link</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>subDownloadThread</name> <name>subDownloadThread</name>
@ -2706,5 +2755,19 @@ However, those plugins were disabled.</source>
<source>Priority</source> <source>Priority</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 left after torrent download)</source>
<comment>e.g. (100MiB left after torrent download)</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>(%1 more are required to download)</source>
<comment>e.g. (100MiB more are required to download)</comment>
<translation type="unfinished"></translation>
</message>
</context> </context>
</TS> </TS>

4
src/misc.h

@ -103,7 +103,7 @@ public:
#ifndef Q_WS_WIN #ifndef Q_WS_WIN
unsigned long long available; unsigned long long available;
struct statfs stats; struct statfs stats;
int ret = statfs ((path+"/.").toUtf8().data(), &stats) ; int ret = statfs ((path+"/.").toLocal8Bit().data(), &stats) ;
if(ret == 0) { if(ret == 0) {
available = ((unsigned long long)stats.f_bavail) * available = ((unsigned long long)stats.f_bavail) *
((unsigned long long)stats.f_bsize) ; ((unsigned long long)stats.f_bsize) ;
@ -293,7 +293,7 @@ public:
sha1.assign(base32decode(reg.cap(1).toStdString())); sha1.assign(base32decode(reg.cap(1).toStdString()));
hash = misc::toQString(sha1); hash = misc::toQString(sha1);
} }
qDebug("magnetUriToHash: hash: %s", hash.toUtf8().data()); qDebug("magnetUriToHash: hash: %s", hash.toLocal8Bit().data());
return hash; return hash;
} }

2
src/options.ui

@ -2550,7 +2550,7 @@
<number>9999</number> <number>9999</number>
</property> </property>
<property name="value"> <property name="value">
<number>50</number> <number>100</number>
</property> </property>
</widget> </widget>
</item> </item>

8
src/properties_imp.cpp

@ -53,12 +53,12 @@ properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h
setupUi(this); setupUi(this);
lbl_priorities->setText(tr("Priorities:")+"<ul><li>"+tr("Ignored: file is not downloaded at all")+"</li><li>"+tr("Normal: normal priority. Download order is dependent on availability")+"</li><li>"+tr("High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability")+"</li><li>"+tr("Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority")+"</li></ul>"); lbl_priorities->setText(tr("Priorities:")+"<ul><li>"+tr("Ignored: file is not downloaded at all")+"</li><li>"+tr("Normal: normal priority. Download order is dependent on availability")+"</li><li>"+tr("High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability")+"</li><li>"+tr("Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority")+"</li></ul>");
// set icons // set icons
addTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); addTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png")));
removeTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); removeTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png")));
lowerTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/downarrow.png"))); lowerTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/downarrow.png")));
riseTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/uparrow.png"))); riseTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/uparrow.png")));
addWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); addWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png")));
deleteWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); deleteWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png")));
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
// Set Properties list model // Set Properties list model
PropListModel = new QStandardItemModel(0,5); PropListModel = new QStandardItemModel(0,5);

1552
src/rss.h

File diff suppressed because it is too large Load Diff

174
src/rss.ui

@ -1,7 +1,8 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RSS</class> <class>RSS</class>
<widget class="QWidget" name="RSS" > <widget class="QWidget" name="RSS">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
@ -9,60 +10,60 @@
<height>447</height> <height>447</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Search</string> <string>Search</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2" > <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QSplitter" name="splitter_h" > <widget class="QSplitter" name="splitter_h">
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<widget class="QWidget" name="layoutWidget" > <widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QTreeWidget" name="listStreams" > <widget class="QTreeWidget" name="listStreams">
<property name="contextMenuPolicy" > <property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum> <enum>Qt::CustomContextMenu</enum>
</property> </property>
<property name="selectionMode" > <property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum> <enum>QAbstractItemView::ExtendedSelection</enum>
</property> </property>
<property name="columnCount" > <property name="columnCount">
<number>2</number> <number>2</number>
</property> </property>
<column> <column>
<property name="text" > <property name="text">
<string>RSS streams:</string> <string>RSS streams:</string>
</property> </property>
</column> </column>
<column> <column>
<property name="text" > <property name="text">
<string>2</string> <string>2</string>
</property> </property>
</column> </column>
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0" > <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
@ -71,20 +72,20 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="delStream_button" > <widget class="QPushButton" name="delStream_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>55</width> <width>55</width>
<height>32</height> <height>32</height>
</size> </size>
</property> </property>
<property name="toolTip" > <property name="toolTip">
<string>Delete selected streams</string> <string>Delete selected streams</string>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="iconSize" > <property name="iconSize">
<size> <size>
<width>32</width> <width>32</width>
<height>32</height> <height>32</height>
@ -93,20 +94,20 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="refreshAll_button" > <widget class="QPushButton" name="refreshAll_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>32</width> <width>32</width>
<height>32</height> <height>32</height>
</size> </size>
</property> </property>
<property name="toolTip" > <property name="toolTip">
<string>Refresh RSS streams</string> <string>Refresh RSS streams</string>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="iconSize" > <property name="iconSize">
<size> <size>
<width>32</width> <width>32</width>
<height>32</height> <height>32</height>
@ -115,20 +116,20 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="addStream_button" > <widget class="QPushButton" name="addStream_button">
<property name="minimumSize" > <property name="minimumSize">
<size> <size>
<width>32</width> <width>32</width>
<height>32</height> <height>32</height>
</size> </size>
</property> </property>
<property name="toolTip" > <property name="toolTip">
<string>Add a new RSS stream</string> <string>Add a new RSS stream</string>
</property> </property>
<property name="text" > <property name="text">
<string/> <string/>
</property> </property>
<property name="iconSize" > <property name="iconSize">
<size> <size>
<width>55</width> <width>55</width>
<height>32</height> <height>32</height>
@ -138,10 +139,10 @@
</item> </item>
<item> <item>
<spacer> <spacer>
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0" > <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
@ -155,28 +156,39 @@
<zorder>listStreams</zorder> <zorder>listStreams</zorder>
<zorder></zorder> <zorder></zorder>
</widget> </widget>
<widget class="QWidget" name="layoutWidget" > <widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout" > <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="news_lbl" > <widget class="QLabel" name="news_lbl">
<property name="font" > <property name="font">
<font> <font>
<weight>50</weight> <weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text" > <property name="text">
<string>&lt;b>News:&lt;/b> &lt;i>(double-click to open the link in your web browser)&lt;/i></string> <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Torrents:&lt;/span&gt; &lt;span style=&quot; font-style:italic;&quot;&gt;(double-click to download)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QSplitter" name="splitter_v" > <widget class="QSplitter" name="splitter_v">
<property name="orientation" > <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<widget class="QListWidget" name="listNews" /> <widget class="QListWidget" name="listNews">
<widget class="QTextBrowser" name="textBrowser" /> <property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
</widget>
<widget class="QTextBrowser" name="textBrowser"/>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -184,37 +196,75 @@
</widget> </widget>
</item> </item>
</layout> </layout>
<action name="actionDelete" > <action name="actionDelete">
<property name="text" > <property name="text">
<string>Delete</string> <string>Delete</string>
</property> </property>
</action> </action>
<action name="actionRename" > <action name="actionRename">
<property name="text" > <property name="text">
<string>Rename</string> <string>Rename</string>
</property> </property>
</action> </action>
<action name="actionRefresh" > <action name="actionRefresh">
<property name="text" > <property name="text">
<string>Refresh</string> <string>Refresh</string>
</property> </property>
</action> </action>
<action name="actionCreate" > <action name="actionCreate">
<property name="text" > <property name="text">
<string>Add RSS stream</string> <string>Add RSS stream</string>
</property> </property>
</action> </action>
<action name="actionRefreshAll" > <action name="actionRefreshAll">
<property name="text" > <property name="text">
<string>Refresh all streams</string> <string>Refresh all streams</string>
</property> </property>
</action> </action>
<action name="actionMark_all_as_read" > <action name="actionMark_all_as_read">
<property name="text" > <property name="text">
<string>Mark all as read</string> <string>Mark all as read</string>
</property> </property>
</action> </action>
<action name="actionDownload_torrent">
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/download.png</normaloff>:/Icons/oxygen/download.png</iconset>
</property>
<property name="text">
<string>Download torrent</string>
</property>
</action>
<action name="actionOpen_news_URL">
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/url.png</normaloff>:/Icons/url.png</iconset>
</property>
<property name="text">
<string>Open news URL</string>
</property>
</action>
<action name="actionCopy_feed_URL">
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/edit-copy.png</normaloff>:/Icons/oxygen/edit-copy.png</iconset>
</property>
<property name="text">
<string>Copy feed URL</string>
</property>
</action>
<action name="actionRSS_feed_downloader">
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/download.png</normaloff>:/Icons/oxygen/download.png</iconset>
</property>
<property name="text">
<string>RSS feed downloader</string>
</property>
</action>
</widget> </widget>
<resources/> <resources>
<include location="icons.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

668
src/rss_imp.cpp

@ -28,9 +28,6 @@
* Contact : chris@qbittorrent.org arnaud@qbittorrent.org * Contact : chris@qbittorrent.org arnaud@qbittorrent.org
*/ */
#include "rss_imp.h"
#include "rss.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QInputDialog> #include <QInputDialog>
#include <QMenu> #include <QMenu>
@ -38,337 +35,394 @@
#include <QMessageBox> #include <QMessageBox>
#include <QTimer> #include <QTimer>
#include <QString> #include <QString>
#include <QClipboard>
// display a right-click menu #include "rss_imp.h"
void RSSImp::displayRSSListMenu(const QPoint& pos){ #include "rss.h"
QMenu myFinishedListMenu(this); #include "FeedDownloader.h"
QTreeWidgetItem* item = listStreams->itemAt(pos); #include "bittorrent.h"
QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
if(item != 0) {
myFinishedListMenu.addAction(actionMark_all_as_read);
myFinishedListMenu.addAction(actionDelete);
if(selectedItems.size() == 1)
myFinishedListMenu.addAction(actionRename);
myFinishedListMenu.addAction(actionRefresh);
}else{
myFinishedListMenu.addAction(actionCreate);
myFinishedListMenu.addAction(actionRefreshAll);
}
myFinishedListMenu.exec(mapToGlobal(pos)+QPoint(10,33));
}
// add a stream by a button
void RSSImp::on_addStream_button_clicked() {
createStream();
}
// delete a stream by a button // display a right-click menu
void RSSImp::on_delStream_button_clicked() { void RSSImp::displayRSSListMenu(const QPoint&){
QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems(); QMenu myFinishedListMenu(this);
QTreeWidgetItem *item; QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
if(!selectedItems.size()) return; if(selectedItems.size() > 0) {
int ret = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete this stream from the list?"), myFinishedListMenu.addAction(actionMark_all_as_read);
tr("&Yes"), tr("&No"), myFinishedListMenu.addAction(actionDelete);
QString(), 0, 1); if(selectedItems.size() == 1) {
if(!ret) { myFinishedListMenu.addAction(actionRename);
QStringList urlsToDelete; myFinishedListMenu.addAction(actionRSS_feed_downloader);
foreach(item, selectedItems){
QString url = item->data(1, Qt::DisplayRole).toString();
urlsToDelete << url;
}
QString url;
foreach(url, urlsToDelete){
if(selectedFeedUrl == url){
textBrowser->clear();
listNews->clear();
}
rssmanager->removeStream(url);
delete getTreeItemFromUrl(url);
}
if(urlsToDelete.size())
rssmanager->saveStreamList();
}
} }
myFinishedListMenu.addAction(actionCopy_feed_URL);
myFinishedListMenu.addAction(actionRefresh);
}else{
myFinishedListMenu.addAction(actionCreate);
myFinishedListMenu.addAction(actionRefreshAll);
}
myFinishedListMenu.exec(QCursor::pos());
}
// refresh all streams by a button void RSSImp::displayItemsListMenu(const QPoint&){
void RSSImp::on_refreshAll_button_clicked() { QMenu myItemListMenu(this);
refreshAllStreams(); QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
} if(selectedItems.size() > 0) {
myItemListMenu.addAction(actionDownload_torrent);
myItemListMenu.addAction(actionOpen_news_URL);
}
myItemListMenu.exec(QCursor::pos());
}
// open the url of the news in a browser // add a stream by a button
void RSSImp::openInBrowser(QListWidgetItem *item) { void RSSImp::on_addStream_button_clicked() {
RssItem* news = rssmanager->getFeed(selectedFeedUrl)->getItem(listNews->row(item)); createStream();
QString link = news->getLink(); }
if(!link.isEmpty())
QDesktopServices::openUrl(QUrl(link));
}
//right-click on stream : give him an alias // delete a stream by a button
void RSSImp::renameStream() { void RSSImp::on_delStream_button_clicked() {
QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems(); QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
Q_ASSERT(selectedItems.size() == 1); QTreeWidgetItem *item;
QTreeWidgetItem *item = selectedItems.at(0); if(!selectedItems.size()) return;
int ret = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete this stream from the list?"),
tr("&Yes"), tr("&No"),
QString(), 0, 1);
if(!ret) {
QStringList urlsToDelete;
foreach(item, selectedItems){
QString url = item->data(1, Qt::DisplayRole).toString(); QString url = item->data(1, Qt::DisplayRole).toString();
bool ok; urlsToDelete << url;
QString newAlias = QInputDialog::getText(this, tr("Please choose a new name for this stream"), tr("New stream name:"), QLineEdit::Normal, rssmanager->getFeed(url)->getAlias(), &ok);
if(ok) {
rssmanager->setAlias(url, newAlias);
}
} }
QString url;
//right-click on stream : refresh it foreach(url, urlsToDelete){
void RSSImp::refreshSelectedStreams() { if(selectedFeedUrl == url){
QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
QTreeWidgetItem* item;
foreach(item, selectedItems){
QString url = item->text(1);
textBrowser->clear(); textBrowser->clear();
listNews->clear(); listNews->clear();
rssmanager->refresh(url);
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
} }
rssmanager->removeStream(url);
delete getTreeItemFromUrl(url);
} }
if(urlsToDelete.size())
rssmanager->saveStreamList();
}
}
void RSSImp::on_actionMark_all_as_read_triggered() { // refresh all streams by a button
textBrowser->clear(); void RSSImp::on_refreshAll_button_clicked() {
listNews->clear(); refreshAllStreams();
QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems(); }
QTreeWidgetItem* item;
foreach(item, selectedItems){
QString url = item->text(1);
RssStream *feed = rssmanager->getFeed(url);
feed->markAllAsRead();
item->setData(0, Qt::DisplayRole, feed->getAliasOrUrl()+ QString::fromUtf8(" (0)"));
}
if(selectedItems.size())
refreshNewsList(selectedItems.last(), 0);
}
//right-click somewhere, refresh all the streams void RSSImp::downloadTorrent() {
void RSSImp::refreshAllStreams() { QList<QListWidgetItem *> selected_items = listNews->selectedItems();
textBrowser->clear(); foreach(const QListWidgetItem* item, selected_items) {
listNews->clear(); RssItem* news = rssmanager->getFeed(selectedFeedUrl)->getItem(listNews->row(item));
unsigned int nbFeeds = listStreams->topLevelItemCount(); BTSession->downloadFromUrl(news->getTorrentUrl());
for(unsigned int i=0; i<nbFeeds; ++i) }
listStreams->topLevelItem(i)->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); }
rssmanager->refreshAll();
updateLastRefreshedTimeForStreams();
}
void RSSImp::fillFeedsList() { // open the url of the news in a browser
QList<RssStream*> feeds = rssmanager->getRssFeeds(); void RSSImp::openNewsUrl() {
RssStream* stream; QList<QListWidgetItem *> selected_items = listNews->selectedItems();
foreach(stream, feeds){ foreach(const QListWidgetItem* item, selected_items) {
QTreeWidgetItem* item = new QTreeWidgetItem(listStreams); RssItem* news = rssmanager->getFeed(selectedFeedUrl)->getItem(listNews->row(item));
item->setData(0, Qt::DisplayRole, stream->getAliasOrUrl()+ QString::fromUtf8(" (0)")); QString link = news->getLink();
item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/loading.png")))); if(!link.isEmpty())
item->setData(1, Qt::DisplayRole, stream->getUrl()); QDesktopServices::openUrl(QUrl(link));
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString()); }
} }
}
//right-click, register a new stream //right-click on stream : give him an alias
void RSSImp::createStream() { void RSSImp::renameStream() {
bool ok; QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
QString newUrl = QInputDialog::getText(this, tr("Please type a rss stream url"), tr("Stream URL:"), QLineEdit::Normal, "http://", &ok); Q_ASSERT(selectedItems.size() == 1);
if(ok) { QTreeWidgetItem *item = selectedItems.at(0);
newUrl = newUrl.trimmed(); QString url = item->data(1, Qt::DisplayRole).toString();
if(!newUrl.isEmpty()){ bool ok;
RssStream *stream = rssmanager->addStream(newUrl); QString newAlias = QInputDialog::getText(this, tr("Please choose a new name for this stream"), tr("New stream name:"), QLineEdit::Normal, rssmanager->getFeed(url)->getAlias(), &ok);
if(stream == 0){ if(ok) {
// Already existing rssmanager->setAlias(url, newAlias);
QMessageBox::warning(this, tr("qBittorrent"), }
tr("This rss feed is already in the list."), }
QMessageBox::Ok);
return;
}
QTreeWidgetItem* item = new QTreeWidgetItem(listStreams);
item->setText(0, stream->getAliasOrUrl() + QString::fromUtf8(" (0)"));
item->setText(1, stream->getUrl());
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString());
if(listStreams->topLevelItemCount() == 1)
selectFirstFeed();
rssmanager->refresh(newUrl);
rssmanager->saveStreamList();
}
}
}
void RSSImp::updateLastRefreshedTimeForStreams() { //right-click on stream : refresh it
unsigned int nbFeeds = listStreams->topLevelItemCount(); void RSSImp::refreshSelectedStreams() {
for(unsigned int i=0; i<nbFeeds; ++i){ QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
QTreeWidgetItem* item = listStreams->topLevelItem(i); QTreeWidgetItem* item;
RssStream* stream = rssmanager->getFeed(item->data(1, Qt::DisplayRole).toString()); foreach(item, selectedItems){
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString()); QString url = item->text(1);
} textBrowser->clear();
} listNews->clear();
rssmanager->refresh(url);
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
}
}
// fills the newsList void RSSImp::copySelectedFeedsURL() {
void RSSImp::refreshNewsList(QTreeWidgetItem* item, int) { QStringList URLs;
selectedFeedUrl = item->text(1); QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
RssStream *stream = rssmanager->getFeed(selectedFeedUrl); QTreeWidgetItem* item;
listNews->clear(); foreach(item, selectedItems){
qDebug("Getting the list of news"); URLs << item->text(1);
QList<RssItem*> news = stream->getNewsList(); }
qDebug("Got the list of news"); qApp->clipboard()->setText(URLs.join("\n"));
RssItem* article; }
foreach(article, news){
QListWidgetItem* it = new QListWidgetItem(article->getTitle(), listNews);
if(article->isRead()){
it->setData(Qt::ForegroundRole, QVariant(QColor("grey")));
it->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
}else{
it->setData(Qt::ForegroundRole, QVariant(QColor("blue")));
it->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere2.png")));
}
}
qDebug("Added all news to the GUI");
selectFirstNews();
qDebug("First news selected");
}
// display a news void RSSImp::showFeedDownloader() {
void RSSImp::refreshTextBrowser(QListWidgetItem *item) { QTreeWidgetItem* item = listStreams->selectedItems()[0];
RssItem* article = rssmanager->getFeed(selectedFeedUrl)->getItem(listNews->row(item)); new FeedDownloaderDlg(this, item->text(1), rssmanager->getFeed(item->text(1))->getAliasOrUrl(), BTSession);
QString html; }
html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
html += "<div style='background-color: #678db2; font-weight: bold; color: #fff;'>"+article->getTitle() + "</div>";
if(article->getDate().isValid()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Date: ")+"</b>"+article->getDate().toString()+"</div>";
}
if(!article->getAuthor().isEmpty()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Author: ")+"</b>"+article->getAuthor()+"</div>";
}
html += "</div>";
html += "<divstyle='margin-left: 5px; margin-right: 5px;'>"+article->getDescription()+"</div>";
textBrowser->setHtml(html);
article->setRead();
item->setData(Qt::ForegroundRole, QVariant(QColor("grey")));
item->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
updateFeedNbNews(selectedFeedUrl);
}
void RSSImp::saveSlidersPosition() {
// Remember sliders positions
QSettings settings("qBittorrent", "qBittorrent");
settings.setValue("rss/splitter_h", splitter_h->saveState());
settings.setValue("rss/splitter_v", splitter_v->saveState());
qDebug("Splitters position saved");
}
void RSSImp::restoreSlidersPosition() {
QSettings settings("qBittorrent", "qBittorrent");
QByteArray pos_h = settings.value("rss/splitter_h", QByteArray()).toByteArray();
if(!pos_h.isNull()) {
splitter_h->restoreState(pos_h);
}
QByteArray pos_v = settings.value("rss/splitter_v", QByteArray()).toByteArray();
if(!pos_v.isNull()) {
splitter_v->restoreState(pos_v);
}
}
QTreeWidgetItem* RSSImp::getTreeItemFromUrl(QString url) const{
unsigned int nbItems = listStreams->topLevelItemCount();
for(unsigned int i = 0; i<nbItems; ++i){
QTreeWidgetItem* item = listStreams->topLevelItem(i);
if(item->text(1) == url)
return item;
}
qDebug("Cannot find url %s in feeds list", (const char*)url.toLocal8Bit());
Q_ASSERT(false); // Should never go through here
return (QTreeWidgetItem*)0;
}
void RSSImp::updateFeedIcon(QString url, QString icon_path){ void RSSImp::on_actionMark_all_as_read_triggered() {
QTreeWidgetItem *item = getTreeItemFromUrl(url); textBrowser->clear();
item->setData(0,Qt::DecorationRole, QVariant(QIcon(icon_path))); listNews->clear();
} QList<QTreeWidgetItem*> selectedItems = listStreams->selectedItems();
QTreeWidgetItem* item;
foreach(item, selectedItems){
QString url = item->text(1);
RssStream *feed = rssmanager->getFeed(url);
feed->markAllAsRead();
item->setData(0, Qt::DisplayRole, feed->getAliasOrUrl()+ QString::fromUtf8(" (0)"));
}
if(selectedItems.size())
refreshNewsList(selectedItems.last(), 0);
}
void RSSImp::updateFeedNbNews(QString url){ //right-click somewhere, refresh all the streams
QTreeWidgetItem *item = getTreeItemFromUrl(url); void RSSImp::refreshAllStreams() {
RssStream *stream = rssmanager->getFeed(url); textBrowser->clear();
item->setText(0, stream->getAliasOrUrl() + QString::fromUtf8(" (") + QString::number(stream->getNbUnRead(), 10)+ QString(")")); listNews->clear();
} unsigned int nbFeeds = listStreams->topLevelItemCount();
for(unsigned int i=0; i<nbFeeds; ++i)
listStreams->topLevelItem(i)->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
rssmanager->refreshAll();
updateLastRefreshedTimeForStreams();
}
void RSSImp::updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread){ void RSSImp::fillFeedsList() {
QTreeWidgetItem *item = getTreeItemFromUrl(url); QList<RssStream*> feeds = rssmanager->getRssFeeds();
RssStream *stream = rssmanager->getFeed(url); RssStream* stream;
item->setText(0, aliasOrUrl + QString::fromUtf8(" (") + QString::number(nbUnread, 10)+ QString(")")); foreach(stream, feeds){
item->setData(0,Qt::DecorationRole, QVariant(QIcon(stream->getIconPath()))); QTreeWidgetItem* item = new QTreeWidgetItem(listStreams);
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString()); item->setData(0, Qt::DisplayRole, stream->getAliasOrUrl()+ QString::fromUtf8(" (0)"));
// If the feed is selected, update the displayed news item->setData(0,Qt::DecorationRole, QVariant(QIcon(QString::fromUtf8(":/Icons/loading.png"))));
if(selectedFeedUrl == url){ item->setData(1, Qt::DisplayRole, stream->getUrl());
refreshNewsList(getTreeItemFromUrl(url), 0); item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString());
}
}
//right-click, register a new stream
void RSSImp::createStream() {
bool ok;
QString clip_txt = qApp->clipboard()->text();
QString default_url = "http://";
if(clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive)) {
default_url = clip_txt;
}
QString newUrl = QInputDialog::getText(this, tr("Please type a rss stream url"), tr("Stream URL:"), QLineEdit::Normal, default_url, &ok);
if(ok) {
newUrl = newUrl.trimmed();
if(!newUrl.isEmpty()){
RssStream *stream = rssmanager->addStream(newUrl);
if(stream == 0){
// Already existing
QMessageBox::warning(this, tr("qBittorrent"),
tr("This rss feed is already in the list."),
QMessageBox::Ok);
return;
} }
QTreeWidgetItem* item = new QTreeWidgetItem(listStreams);
item->setText(0, stream->getAliasOrUrl() + QString::fromUtf8(" (0)"));
item->setText(1, stream->getUrl());
item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png")));
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString());
if(listStreams->topLevelItemCount() == 1)
selectFirstFeed();
rssmanager->refresh(newUrl);
rssmanager->saveStreamList();
} }
}
}
RSSImp::RSSImp() : QWidget(){ void RSSImp::updateLastRefreshedTimeForStreams() {
setupUi(this); unsigned int nbFeeds = listStreams->topLevelItemCount();
// icons of bottom buttons for(unsigned int i=0; i<nbFeeds; ++i){
addStream_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/subscribe.png"))); QTreeWidgetItem* item = listStreams->topLevelItem(i);
delStream_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/unsubscribe.png"))); RssStream* stream = rssmanager->getFeed(item->data(1, Qt::DisplayRole).toString());
refreshAll_button->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png"))); item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString());
actionMark_all_as_read->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); }
// icons of right-click menu }
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/unsubscribe16.png")));
actionRename->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/log.png")));
actionRefresh->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png")));
actionCreate->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/subscribe16.png")));
actionRefreshAll->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png")));
// Hide second column (url)
listStreams->hideColumn(1);
rssmanager = new RssManager();
fillFeedsList();
connect(rssmanager, SIGNAL(feedInfosChanged(QString, QString, unsigned int)), this, SLOT(updateFeedInfos(QString, QString, unsigned int)));
connect(rssmanager, SIGNAL(feedIconChanged(QString, QString)), this, SLOT(updateFeedIcon(QString, QString)));
connect(listStreams, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&)));
connect(actionDelete, SIGNAL(triggered()), this, SLOT(on_delStream_button_clicked()));
connect(actionRename, SIGNAL(triggered()), this, SLOT(renameStream()));
connect(actionRefresh, SIGNAL(triggered()), this, SLOT(refreshSelectedStreams()));
connect(actionCreate, SIGNAL(triggered()), this, SLOT(createStream()));
connect(actionRefreshAll, SIGNAL(triggered()), this, SLOT(refreshAllStreams()));
connect(listStreams, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(refreshNewsList(QTreeWidgetItem*,int)));
connect(listNews, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(refreshTextBrowser(QListWidgetItem *)));
connect(listNews, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(openInBrowser(QListWidgetItem *)));
refreshTimeTimer = new QTimer(this);
connect(refreshTimeTimer, SIGNAL(timeout()), this, SLOT(updateLastRefreshedTimeForStreams()));
refreshTimeTimer->start(60000); // 1min
// Select first news of first feed
selectFirstFeed();
// Refresh all feeds
rssmanager->refreshAll();
// Restore sliders position
restoreSlidersPosition();
// Bind saveSliders slots
connect(splitter_v, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition()));
connect(splitter_h, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition()));
qDebug("RSSImp constructed");
}
void RSSImp::selectFirstFeed(){ // fills the newsList
if(listStreams->topLevelItemCount()){ void RSSImp::refreshNewsList(QTreeWidgetItem* item, int) {
QTreeWidgetItem *first = listStreams->topLevelItem(0); selectedFeedUrl = item->text(1);
listStreams->setCurrentItem(first); RssStream *stream = rssmanager->getFeed(selectedFeedUrl);
selectedFeedUrl = first->text(1); qDebug("Getting the list of news");
} QList<RssItem*> news = stream->getNewsList();
// Clear the list first
listNews->clear();
qDebug("Got the list of news");
foreach(RssItem* article, news){
QListWidgetItem* it = new QListWidgetItem(article->getTitle(), listNews);
if(article->isRead()){
it->setData(Qt::ForegroundRole, QVariant(QColor("grey")));
it->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
}else{
it->setData(Qt::ForegroundRole, QVariant(QColor("blue")));
it->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere2.png")));
} }
}
qDebug("Added all news to the GUI");
//selectFirstNews();
qDebug("First news selected");
}
void RSSImp::selectFirstNews(){ // display a news
if(listNews->count()){ void RSSImp::refreshTextBrowser(QListWidgetItem *item) {
listNews->setCurrentRow(0); RssItem* article = rssmanager->getFeed(selectedFeedUrl)->getItem(listNews->row(item));
refreshTextBrowser(listNews->currentItem()); QString html;
} html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
} html += "<div style='background-color: #678db2; font-weight: bold; color: #fff;'>"+article->getTitle() + "</div>";
if(article->getDate().isValid()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Date: ")+"</b>"+article->getDate().toString()+"</div>";
}
if(!article->getAuthor().isEmpty()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Author: ")+"</b>"+article->getAuthor()+"</div>";
}
html += "</div>";
html += "<divstyle='margin-left: 5px; margin-right: 5px;'>"+article->getDescription()+"</div>";
textBrowser->setHtml(html);
article->setRead();
item->setData(Qt::ForegroundRole, QVariant(QColor("grey")));
item->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
updateFeedNbNews(selectedFeedUrl);
}
RSSImp::~RSSImp(){ void RSSImp::saveSlidersPosition() {
qDebug("Deleting RSSImp..."); // Remember sliders positions
delete refreshTimeTimer; QSettings settings("qBittorrent", "qBittorrent");
delete rssmanager; settings.setValue("rss/splitter_h", splitter_h->saveState());
qDebug("RSSImp deleted"); settings.setValue("rss/splitter_v", splitter_v->saveState());
} qDebug("Splitters position saved");
}
void RSSImp::restoreSlidersPosition() {
QSettings settings("qBittorrent", "qBittorrent");
QByteArray pos_h = settings.value("rss/splitter_h", QByteArray()).toByteArray();
if(!pos_h.isNull()) {
splitter_h->restoreState(pos_h);
}
QByteArray pos_v = settings.value("rss/splitter_v", QByteArray()).toByteArray();
if(!pos_v.isNull()) {
splitter_v->restoreState(pos_v);
}
}
QTreeWidgetItem* RSSImp::getTreeItemFromUrl(QString url) const{
unsigned int nbItems = listStreams->topLevelItemCount();
for(unsigned int i = 0; i<nbItems; ++i){
QTreeWidgetItem* item = listStreams->topLevelItem(i);
if(item->text(1) == url)
return item;
}
qDebug("Cannot find url %s in feeds list", (const char*)url.toLocal8Bit());
Q_ASSERT(false); // Should never go through here
return (QTreeWidgetItem*)0;
}
void RSSImp::updateFeedIcon(QString url, QString icon_path){
QTreeWidgetItem *item = getTreeItemFromUrl(url);
item->setData(0,Qt::DecorationRole, QVariant(QIcon(icon_path)));
}
void RSSImp::updateFeedNbNews(QString url){
QTreeWidgetItem *item = getTreeItemFromUrl(url);
RssStream *stream = rssmanager->getFeed(url);
item->setText(0, stream->getAliasOrUrl() + QString::fromUtf8(" (") + QString::number(stream->getNbUnRead(), 10)+ QString(")"));
}
void RSSImp::updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread){
QTreeWidgetItem *item = getTreeItemFromUrl(url);
RssStream *stream = rssmanager->getFeed(url);
item->setText(0, aliasOrUrl + QString::fromUtf8(" (") + QString::number(nbUnread, 10)+ QString(")"));
item->setData(0,Qt::DecorationRole, QVariant(QIcon(stream->getIconPath())));
item->setToolTip(0, QString::fromUtf8("<b>")+tr("Description:")+QString::fromUtf8("</b> ")+stream->getDescription()+QString::fromUtf8("<br/><b>")+tr("url:")+QString::fromUtf8("</b> ")+stream->getUrl()+QString::fromUtf8("<br/><b>")+tr("Last refresh:")+QString::fromUtf8("</b> ")+stream->getLastRefreshElapsedString());
// If the feed is selected, update the displayed news
if(selectedFeedUrl == url){
refreshNewsList(getTreeItemFromUrl(url), 0);
}
}
RSSImp::RSSImp(bittorrent *BTSession) : QWidget(), BTSession(BTSession){
setupUi(this);
// icons of bottom buttons
addStream_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/subscribe.png")));
delStream_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/unsubscribe.png")));
refreshAll_button->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png")));
actionMark_all_as_read->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
// icons of right-click menu
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/unsubscribe16.png")));
actionRename->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/log.png")));
actionRefresh->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png")));
actionCreate->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/subscribe16.png")));
actionRefreshAll->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png")));
// Hide second column (url)
listStreams->hideColumn(1);
rssmanager = new RssManager(BTSession);
fillFeedsList();
connect(rssmanager, SIGNAL(feedInfosChanged(QString, QString, unsigned int)), this, SLOT(updateFeedInfos(QString, QString, unsigned int)));
connect(rssmanager, SIGNAL(feedIconChanged(QString, QString)), this, SLOT(updateFeedIcon(QString, QString)));
connect(listStreams, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&)));
connect(listNews, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayItemsListMenu(const QPoint&)));
connect(actionDelete, SIGNAL(triggered()), this, SLOT(on_delStream_button_clicked()));
connect(actionRename, SIGNAL(triggered()), this, SLOT(renameStream()));
connect(actionRefresh, SIGNAL(triggered()), this, SLOT(refreshSelectedStreams()));
connect(actionCreate, SIGNAL(triggered()), this, SLOT(createStream()));
connect(actionRefreshAll, SIGNAL(triggered()), this, SLOT(refreshAllStreams()));
connect(actionCopy_feed_URL, SIGNAL(triggered()), this, SLOT(copySelectedFeedsURL()));
connect(actionRSS_feed_downloader, SIGNAL(triggered()), this, SLOT(showFeedDownloader()));
connect(actionOpen_news_URL, SIGNAL(triggered()), this, SLOT(openNewsUrl()));
connect(actionDownload_torrent, SIGNAL(triggered()), this, SLOT(downloadTorrent()));
connect(listStreams, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(refreshNewsList(QTreeWidgetItem*,int)));
connect(listNews, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(refreshTextBrowser(QListWidgetItem *)));
connect(listNews, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(downloadTorrent()));
refreshTimeTimer = new QTimer(this);
connect(refreshTimeTimer, SIGNAL(timeout()), this, SLOT(updateLastRefreshedTimeForStreams()));
refreshTimeTimer->start(60000); // 1min
// Select first news of first feed
selectFirstFeed();
// Refresh all feeds
rssmanager->refreshAll();
// Restore sliders position
restoreSlidersPosition();
// Bind saveSliders slots
connect(splitter_v, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition()));
connect(splitter_h, SIGNAL(splitterMoved(int, int)), this, SLOT(saveSlidersPosition()));
qDebug("RSSImp constructed");
}
void RSSImp::selectFirstFeed(){
if(listStreams->topLevelItemCount()){
QTreeWidgetItem *first = listStreams->topLevelItem(0);
listStreams->setCurrentItem(first);
selectedFeedUrl = first->text(1);
}
}
void RSSImp::selectFirstNews(){
if(listNews->count()){
listNews->setCurrentRow(0);
refreshTextBrowser(listNews->currentItem());
}
}
RSSImp::~RSSImp(){
qDebug("Deleting RSSImp...");
delete refreshTimeTimer;
delete rssmanager;
qDebug("RSSImp deleted");
}

10
src/rss_imp.h

@ -36,6 +36,7 @@
class QTimer; class QTimer;
class RssManager; class RssManager;
class bittorrent;
class RSSImp : public QWidget, public Ui::RSS{ class RSSImp : public QWidget, public Ui::RSS{
Q_OBJECT Q_OBJECT
@ -44,6 +45,7 @@ class RSSImp : public QWidget, public Ui::RSS{
RssManager *rssmanager; RssManager *rssmanager;
QTimer *refreshTimeTimer; QTimer *refreshTimeTimer;
QString selectedFeedUrl; QString selectedFeedUrl;
bittorrent *BTSession;
public slots: public slots:
void on_delStream_button_clicked(); void on_delStream_button_clicked();
@ -52,8 +54,10 @@ class RSSImp : public QWidget, public Ui::RSS{
void on_addStream_button_clicked(); void on_addStream_button_clicked();
void on_refreshAll_button_clicked(); void on_refreshAll_button_clicked();
void displayRSSListMenu(const QPoint&); void displayRSSListMenu(const QPoint&);
void displayItemsListMenu(const QPoint&);
void renameStream(); void renameStream();
void refreshSelectedStreams(); void refreshSelectedStreams();
void copySelectedFeedsURL();
void createStream(); void createStream();
void refreshAllStreams(); void refreshAllStreams();
void refreshNewsList(QTreeWidgetItem* item, int); void refreshNewsList(QTreeWidgetItem* item, int);
@ -61,7 +65,8 @@ class RSSImp : public QWidget, public Ui::RSS{
void updateLastRefreshedTimeForStreams(); void updateLastRefreshedTimeForStreams();
void updateFeedIcon(QString url, QString icon_path); void updateFeedIcon(QString url, QString icon_path);
void updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread); void updateFeedInfos(QString url, QString aliasOrUrl, unsigned int nbUnread);
void openInBrowser(QListWidgetItem *); void openNewsUrl();
void downloadTorrent();
void fillFeedsList(); void fillFeedsList();
void selectFirstFeed(); void selectFirstFeed();
void selectFirstNews(); void selectFirstNews();
@ -69,9 +74,10 @@ class RSSImp : public QWidget, public Ui::RSS{
void on_actionMark_all_as_read_triggered(); void on_actionMark_all_as_read_triggered();
void saveSlidersPosition(); void saveSlidersPosition();
void restoreSlidersPosition(); void restoreSlidersPosition();
void showFeedDownloader();
public: public:
RSSImp(); RSSImp(bittorrent *BTSession);
~RSSImp(); ~RSSImp();
QTreeWidgetItem* getTreeItemFromUrl(QString url) const; QTreeWidgetItem* getTreeItemFromUrl(QString url) const;
}; };

8
src/src.pro

@ -14,7 +14,7 @@ CONFIG += qt \
network network
# Update this VERSION for each release # Update this VERSION for each release
DEFINES += VERSION=\\\"v1.5.0alpha\\\" DEFINES += VERSION=\\\"v1.5.0beta1\\\"
DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MAJOR=1
DEFINES += VERSION_MINOR=5 DEFINES += VERSION_MINOR=5
DEFINES += VERSION_BUGFIX=0 DEFINES += VERSION_BUGFIX=0
@ -183,7 +183,8 @@ HEADERS += GUI.h \
console_imp.h \ console_imp.h \
ico.h \ ico.h \
stacktrace.h \ stacktrace.h \
torrentPersistentData.h torrentPersistentData.h \
FeedDownloader.h
FORMS += MainWindow.ui \ FORMS += MainWindow.ui \
options.ui \ options.ui \
about.ui \ about.ui \
@ -201,7 +202,8 @@ FORMS += MainWindow.ui \
engineSelect.ui \ engineSelect.ui \
pluginSource.ui \ pluginSource.ui \
trackersAdd.ui \ trackersAdd.ui \
console.ui console.ui \
FeedDownloader.ui
SOURCES += GUI.cpp \ SOURCES += GUI.cpp \
main.cpp \ main.cpp \
options_imp.cpp \ options_imp.cpp \

8
src/torrentPersistentData.h

@ -145,7 +145,7 @@ public:
static void saveTorrentPersistentData(QTorrentHandle h, bool is_magnet = false) { static void saveTorrentPersistentData(QTorrentHandle h, bool is_magnet = false) {
Q_ASSERT(h.is_valid()); Q_ASSERT(h.is_valid());
qDebug("Saving persistent data for %s", h.hash().toUtf8().data()); qDebug("Saving persistent data for %s", h.hash().toLocal8Bit().data());
// First, remove temp data // First, remove temp data
TorrentTempData::deleteTempData(h.hash()); TorrentTempData::deleteTempData(h.hash());
Q_ASSERT(!TorrentTempData::hasTempData(h.hash())); Q_ASSERT(!TorrentTempData::hasTempData(h.hash()));
@ -187,7 +187,7 @@ public:
// Save data // Save data
all_data[h.hash()] = data; all_data[h.hash()] = data;
settings.setValue("torrents", all_data); settings.setValue("torrents", all_data);
qDebug("TorrentPersistentData: Saving save_path %s, hash: %s", h.save_path().toUtf8().data(), h.hash().toUtf8().data()); qDebug("TorrentPersistentData: Saving save_path %s, hash: %s", h.save_path().toLocal8Bit().data(), h.hash().toLocal8Bit().data());
} }
static void saveTrackers(QTorrentHandle h) { static void saveTrackers(QTorrentHandle h) {
@ -233,7 +233,7 @@ public:
data["save_path"] = save_path; data["save_path"] = save_path;
all_data[hash] = data; all_data[hash] = data;
settings.setValue("torrents", all_data); settings.setValue("torrents", all_data);
qDebug("TorrentPersistentData: Saving save_path: %s, hash: %s", save_path.toUtf8().data(), hash.toUtf8().data()); qDebug("TorrentPersistentData: Saving save_path: %s, hash: %s", save_path.toLocal8Bit().data(), hash.toLocal8Bit().data());
} }
static void saveUrlSeeds(QTorrentHandle h) { static void saveUrlSeeds(QTorrentHandle h) {
@ -295,7 +295,7 @@ public:
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume"));
QHash<QString, QVariant> all_data = settings.value("torrents", QHash<QString, QVariant>()).toHash(); QHash<QString, QVariant> all_data = settings.value("torrents", QHash<QString, QVariant>()).toHash();
QHash<QString, QVariant> data = all_data[hash].toHash(); QHash<QString, QVariant> data = all_data[hash].toHash();
qDebug("TorrentPersistentData: getSavePath %s", data["save_path"].toString().toUtf8().data()); qDebug("TorrentPersistentData: getSavePath %s", data["save_path"].toString().toLocal8Bit().data());
return data["save_path"].toString(); return data["save_path"].toString();
} }

Loading…
Cancel
Save