1
mirror of https://github.com/qbittorrent/qBittorrent synced 2024-11-03 00:09:23 +01:00

- FEATURE: Added zip support in search plugins manager (can put .py & .png inside)

This commit is contained in:
Christophe Dumez 2007-09-03 22:05:40 +00:00
parent d86335a58e
commit 69fa916e26
9 changed files with 432 additions and 110 deletions

View File

@ -29,6 +29,10 @@ Dependencies:
- python >= 2.3 (needed by search engine)
- libmagick++ (advised, not required)
* Needed for favicons support (RSS / Search plugins)
- libzzip (advised, not required)
* Needed for zip support (Search plugins)
NOTE FOR NON-KDE USERS:
- qt4-qtconfig package is advised when using other systems than KDE.

3
TODO
View File

@ -76,7 +76,7 @@ LANGUAGES UPDATED:
- Slovak *BETA6*
- Ukrainian *BETA6*
- Chinese (simplified) *BETA4*
- Hungarian *BETA4*
- Hungarian *BETA6*
- Italian *BETA6*
- Polish *BETA6*
- Portuguese *BETA5*
@ -94,6 +94,7 @@ beta6->beta7 changelog:
- FEATURE: Made search engine plugin install more reliable
- FEATURE: Allow to drag'n drop plugin to list for install/update
- FEATURE: Added some search plugins to http://plugins.qbittorrent.org
- FEATURE: Added zip support in search plugins manager (can put .py & .png inside)
- BUGFIX: Updated man page / README / INSTALL
- BUGFIX: Paused torrents could be displayed as connected for a sec after checking
- BUGFIX: 'Unknown' is now displayed in search results columns where value is -1

98
configure vendored
View File

@ -27,6 +27,9 @@ Dependency options:
--disable-libmagick Disable use of libmagick
--with-libmagick-inc=[path] Path to libmagick++ include files
--with-libmagick-lib=[path] Path to libmagick++ library files
--disable-libzzip Disable use of libzzip
--with-libzzip-inc=[path] Path to libzzip++ include files
--with-libzzip-lib=[path] Path to libzzip++ library files
EOT
}
@ -188,6 +191,21 @@ while [ $# -gt 0 ]; do
shift
;;
--disable-libzzip)
QC_DISABLE_libzzip="Y"
shift
;;
--with-libzzip-inc=*)
QC_WITH_LIBZZIP_INC=$optarg
shift
;;
--with-libzzip-lib=*)
QC_WITH_LIBZZIP_LIB=$optarg
shift
;;
--verbose)
QC_VERBOSE="Y"
shift
@ -218,6 +236,9 @@ echo QC_WITH_LIBCOMMONCPP2_LIB=$QC_WITH_LIBCOMMONCPP2_LIB
echo QC_DISABLE_libmagick=$QC_DISABLE_libmagick
echo QC_WITH_LIBMAGICK_INC=$QC_WITH_LIBMAGICK_INC
echo QC_WITH_LIBMAGICK_LIB=$QC_WITH_LIBMAGICK_LIB
echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip
echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC
echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB
echo
fi
@ -618,11 +639,82 @@ public:
magickConfig.waitForStarted();
magickConfig.waitForFinished();
QByteArray result = magickConfig.readAll();
result = result.replace("\n", "");
conf->addLib(result.data());
conf->addDefine("HAVE_MAGICK");
return true;
}
};
#line 1 "libzzip.qcm"
/*
-----BEGIN QCMOD-----
name: libzzip
arg: with-libzzip-inc=[path], Path to libzzip++ include files
arg: with-libzzip-lib=[path], Path to libzzip++ library files
-----END QCMOD-----
*/
#include <QProcess>
class qc_libzzip : public ConfObj
{
public:
qc_libzzip(Conf *c) : ConfObj(c) {}
QString name() const { return "Zzip library (libzzip)"; }
QString shortname() const { return "libzzip"; }
QString checkString() const {
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
return "";
return ConfObj::checkString();
}
bool exec(){
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
return false;
QString s;
s = conf->getenv("QC_WITH_LIBZZIP_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "zzip/zzip.h")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/include";
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "zzip/zzip.h")){
found = true;
break;
}
}
if(!found)
return false;
}
conf->addIncludePath(s);
s = conf->getenv("QC_WITH_LIBZZIP_LIB");
if(!s.isEmpty()) {
if(!QFile::exists(s+QString("libzzip.so"))){
return false;
}
}else{
QStringList sl;
sl << "/usr/lib/";
sl << "/usr/local/lib/";
bool found = false;
foreach(s, sl){
if(QFile::exists(s+QString("libzzip.so"))){
found = true;
break;
}
}
if(!found)
return false;
}
conf->addLib(QString("-L") + s);
conf->addLib("-lzzip");
conf->addDefine("HAVE_ZZIP");
return true;
}
};
#line 1 "python.qcm"
/*
-----BEGIN QCMOD-----
@ -661,6 +753,9 @@ cat >$1/modules_new.cpp <<EOT
o = new qc_libmagick(conf);
o->required = false;
o->disabled = false;
o = new qc_libzzip(conf);
o->required = false;
o->disabled = false;
o = new qc_python(conf);
o->required = true;
o->disabled = false;
@ -1618,6 +1713,9 @@ export QC_WITH_LIBCOMMONCPP2_LIB
export QC_DISABLE_libmagick
export QC_WITH_LIBMAGICK_INC
export QC_WITH_LIBMAGICK_LIB
export QC_DISABLE_libzzip
export QC_WITH_LIBZZIP_INC
export QC_WITH_LIBZZIP_LIB
export QC_VERBOSE
rm -rf .qconftemp
(

View File

@ -15,7 +15,8 @@
<dep type='libcommoncpp2'>
<required/>
</dep>
<dep type='libmagick'/>
<dep type='libmagick'/>
<dep type='libzzip'/>
<dep type='python'>
<required/>
</dep>

View File

@ -69,6 +69,7 @@ public:
magickConfig.waitForStarted();
magickConfig.waitForFinished();
QByteArray result = magickConfig.readAll();
result = result.replace("\n", "");
conf->addLib(result.data());
conf->addDefine("HAVE_MAGICK");
return true;

69
qcm/libzzip.qcm Normal file
View File

@ -0,0 +1,69 @@
/*
-----BEGIN QCMOD-----
name: libzzip
arg: with-libzzip-inc=[path], Path to libzzip++ include files
arg: with-libzzip-lib=[path], Path to libzzip++ library files
-----END QCMOD-----
*/
#include <QProcess>
class qc_libzzip : public ConfObj
{
public:
qc_libzzip(Conf *c) : ConfObj(c) {}
QString name() const { return "Zzip library (libzzip)"; }
QString shortname() const { return "libzzip"; }
QString checkString() const {
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
return "";
return ConfObj::checkString();
}
bool exec(){
if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty())
return false;
QString s;
s = conf->getenv("QC_WITH_LIBZZIP_INC");
if(!s.isEmpty()) {
if(!conf->checkHeader(s, "zzip/zzip.h")) {
return false;
}
}else{
QStringList sl;
sl << "/usr/include";
sl << "/usr/local/include";
bool found = false;
foreach(s, sl){
if(conf->checkHeader(s, "zzip/zzip.h")){
found = true;
break;
}
}
if(!found)
return false;
}
conf->addIncludePath(s);
s = conf->getenv("QC_WITH_LIBZZIP_LIB");
if(!s.isEmpty()) {
if(!QFile::exists(s+QString("libzzip.so"))){
return false;
}
}else{
QStringList sl;
sl << "/usr/lib/";
sl << "/usr/local/lib/";
bool found = false;
foreach(s, sl){
if(QFile::exists(s+QString("libzzip.so"))){
found = true;
break;
}
}
if(!found)
return false;
}
conf->addLib(QString("-L") + s);
conf->addLib("-lzzip");
conf->addDefine("HAVE_ZZIP");
return true;
}
};

View File

@ -35,6 +35,10 @@
using namespace Magick;
#endif
#ifdef HAVE_ZZIP
#include <zzip/zzip.h>
#endif
#define ENGINE_NAME 0
#define ENGINE_URL 1
#define ENGINE_STATE 2
@ -79,8 +83,16 @@ void engineSelectDlg::dropEvent(QDropEvent *event) {
downloader->downloadUrl(file);
continue;
}
if(file.endsWith(".py"))
installPlugin(file);
if(file.endsWith(".py")) {
QString plugin_name = file.split(QDir::separator()).last();
plugin_name.replace(".py", "");
installPlugin(file, plugin_name);
}
#ifdef HAVE_ZZIP
if(file.endsWith(".zip")) {
installZipPlugin(file);
}
#endif
}
}
@ -291,7 +303,6 @@ void engineSelectDlg::loadSupportedSearchEngines(bool first) {
QString nameUrlCouple(e);
QStringList line = nameUrlCouple.split('|');
if(line.size() != 2) continue;
// Download favicon
QString enabledTxt;
if(installed_engines.value(id, true)) {
enabledTxt = tr("True");
@ -327,17 +338,132 @@ QList<QTreeWidgetItem*> engineSelectDlg::findItemsWithUrl(QString url){
return res;
}
QTreeWidgetItem* engineSelectDlg::findItemWithID(QString id){
QList<QTreeWidgetItem*> res;
for(int i=0; i<pluginsTree->topLevelItemCount(); ++i) {
QTreeWidgetItem *item = pluginsTree->topLevelItem(i);
if(id == item->text(ENGINE_ID))
return item;
}
return 0;
}
bool engineSelectDlg::isUpdateNeeded(QString plugin_name, float new_version) const {
float old_version = misc::getPluginVersion(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py");
qDebug("IsUpdate needed? tobeinstalled: %.2f, alreadyinstalled: %.2f", new_version, old_version);
return (new_version > old_version);
}
void engineSelectDlg::installPlugin(QString path) {
if(!path.endsWith(".py")) return;
#ifdef HAVE_ZZIP
void engineSelectDlg::installZipPlugin(QString path) {
QStringList plugins;
QStringList favicons;
ZZIP_DIR* dir = zzip_dir_open(path.toUtf8().data(), 0);
if(!dir) {
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("Search engine plugin archive could not be read."));
return;
}
ZZIP_DIRENT dirent;
while(zzip_dir_read(dir, &dirent)) {
/* show info for first file */
QString name(dirent.d_name);
if(name.endsWith(".py")) {
plugins << name;
} else {
if(name.endsWith(".png")) {
favicons << name;
}
}
}
QString plugin;
std::cout << dirent.d_name << std::endl;
ZZIP_FILE* fp = zzip_file_open(dir, dirent.d_name, 0);
if (fp) {
char buf[10];
zzip_ssize_t len = zzip_file_read(fp, buf, 10);
if (len) {
/* show head of README */
std::cout << buf;
}
zzip_file_close(fp);
std::cout << std::endl;
}
foreach(plugin, plugins) {
QString plugin_name = plugin.split(QDir::separator()).last();
plugin_name.chop(3); // Remove .py extension
qDebug("Detected plugin %s in archive", plugin_name.toUtf8().data());
ZZIP_FILE* fp = zzip_file_open(dir, plugin.toUtf8().data(), 0);
if(fp) {
QTemporaryFile *tmpfile = new QTemporaryFile();
QString tmpPath;
// Write file
if(tmpfile->open()) {
tmpPath = tmpfile->fileName();
char buf[255];
zzip_ssize_t len = zzip_file_read(fp, buf, 255);
while(len) {
tmpfile->write(buf, len);
len = zzip_file_read(fp, buf, 255);
}
zzip_file_close(fp);
tmpfile->close();
} else {
qDebug("Could not open tmp file");
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
delete tmpfile;
continue;
}
// Install plugin
installPlugin(tmpPath, plugin_name);
qDebug("installPlugin() finished");
delete tmpfile;
qDebug("Deleted tmpfile");
} else {
qDebug("Cannot read file in archive");
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
}
}
QString favicon;
foreach(favicon, favicons) {
qDebug("Detected favicon %s in archive", favicon.toUtf8().data());
// Ok we have a favicon here
QString plugin_name = favicon.split(QDir::separator()).last();
plugin_name.chop(4); // Remove .png extension
if(!QFile::exists(misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py"))
continue;
// Check if we already have a favicon for this plugin
QString iconPath = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".png";
if(QFile::exists(iconPath)) continue;
ZZIP_FILE* fp = zzip_file_open(dir, favicon.toUtf8().data(), 0);
if(fp) {
QFile dest_icon(iconPath);
// Write icon
if(dest_icon.open(QIODevice::WriteOnly | QIODevice::Text)) {
char buf[255];
zzip_ssize_t len = zzip_file_read(fp, buf, 255);
while(len) {
dest_icon.write(buf, len);
len = zzip_file_read(fp, buf, 255);
}
zzip_file_close(fp);
dest_icon.close();
// Update icon in list
QTreeWidgetItem *item = findItemWithID(plugin_name);
Q_ASSERT(item);
item->setData(ENGINE_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath)));
}
}
}
zzip_dir_close(dir);
}
#endif
void engineSelectDlg::installPlugin(QString path, QString plugin_name) {
qDebug("Asked to install plugin at %s", path.toUtf8().data());
float new_version = misc::getPluginVersion(path);
QString plugin_name = path.split(QDir::separator()).last();
plugin_name.replace(".py", "");
qDebug("Version to be installed: %.2f", new_version);
if(!isUpdateNeeded(plugin_name, new_version)) {
qDebug("Apparently update it not needed, we have a more recent version");
QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("A more recent version of %1 search engine plugin is already installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return;
}
@ -387,10 +513,25 @@ void engineSelectDlg::installPlugin(QString path) {
void engineSelectDlg::on_installButton_clicked() {
QStringList pathsList = QFileDialog::getOpenFileNames(0,
tr("Select search plugins"), QDir::homePath(),
#ifdef HAVE_ZZIP
tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py *.zip)"));
#else
tr("qBittorrent search plugins")+QString::fromUtf8(" (*.py)"));
#endif
QString path;
foreach(path, pathsList) {
installPlugin(path);
if(path.endsWith(".py")) {
QString plugin_name = path.split(QDir::separator()).last();
plugin_name.replace(".py", "");
installPlugin(path, plugin_name);
}
#ifdef HAVE_ZZIP
else {
if(path.endsWith(".zip")) {
installZipPlugin(path);
}
}
#endif
}
}
@ -476,39 +617,32 @@ void engineSelectDlg::processDownloadedFile(QString url, QString filePath) {
if(!parseVersionsFile(filePath, "http://www.dchris.eu/search_engine/")) {
qDebug("Primary update server failed, try secondary");
downloader->downloadUrl("http://hydr0g3n.free.fr/search_engine/versions.txt");
return;
}
QFile::remove(filePath);
return;
}
if(url == "http://hydr0g3n.free.fr/search_engine/versions.txt") {
if(!parseVersionsFile(filePath, "http://hydr0g3n.free.fr/search_engine/")) {
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, update server is temporarily unavailable."));
return;
}
QFile::remove(filePath);
return;
}
if(url.endsWith(".pyqBT") || url.endsWith(".py")) {
// a plugin update has been downloaded
QString plugin_name = url.split('/').last();
plugin_name.replace(".pyqBT", "");
plugin_name.replace(".py", "");
QString dest_path = misc::qBittorrentPath()+"search_engine"+QDir::separator()+"engines"+QDir::separator()+plugin_name+".py";
bool new_plugin = false;
if(QFile::exists(dest_path)) {
// Delete the old plugin
QFile::remove(dest_path);
} else {
// This is a new plugin
new_plugin = true;
}
// Copy the new plugin
QFile::copy(filePath, dest_path);
if(new_plugin) {
// if it is new, refresh the list of plugins
loadSupportedSearchEngines();
QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
} else {
QMessageBox::information(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("%1 search plugin was successfully updated.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
}
plugin_name.replace(".pyqBT", "");
installPlugin(filePath, plugin_name);
QFile::remove(filePath);
return;
}
#ifdef HAVE_ZZIP
if(url.endsWith(".zip")) {
installZipPlugin(filePath);
QFile::remove(filePath);
return;
}
#endif
}
void engineSelectDlg::handleDownloadFailure(QString url, QString reason) {
@ -531,6 +665,13 @@ void engineSelectDlg::handleDownloadFailure(QString url, QString reason) {
QString plugin_name = url.split('/').last();
plugin_name.replace(".pyqBT", "");
plugin_name.replace(".py", "");
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin update failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
}
#ifdef HAVE_ZZIP
if(url.endsWith(".zip")) {
QString plugin_name = url.split('/').last();
plugin_name.replace(".zip", "");
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
}
#endif
}

View File

@ -39,6 +39,7 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
engineSelectDlg(QWidget *parent);
~engineSelectDlg();
QList<QTreeWidgetItem*> findItemsWithUrl(QString url);
QTreeWidgetItem* findItemWithID(QString id);
protected:
bool parseVersionsFile(QString versions_file, QString updateServer);
@ -64,7 +65,10 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
void on_installButton_clicked();
void dropEvent(QDropEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void installPlugin(QString plugin_path);
void installPlugin(QString plugin_path, QString plugin_name);
#ifdef HAVE_ZZIP
void installZipPlugin(QString path);
#endif
};
#endif

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="en">
<defaultcodec></defaultcodec>
<context>
<name>AboutDlg</name>
<message>
@ -585,115 +586,115 @@ Copyright © 2006 by Christophe Dumez&lt;br&gt;
<location filename="../downloadingTorrents.cpp" line="55"/>
<source>Name</source>
<comment>i.e: file name</comment>
<translation type="unfinished">Név</translation>
<translation>Név</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="56"/>
<source>Size</source>
<comment>i.e: file size</comment>
<translation type="unfinished">Méret</translation>
<translation>Méret</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="57"/>
<source>Progress</source>
<comment>i.e: % downloaded</comment>
<translation type="unfinished">Folyamat</translation>
<translation>Folyamat</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="58"/>
<source>DL Speed</source>
<comment>i.e: Download speed</comment>
<translation type="unfinished"></translation>
<translation>DL Speed</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="59"/>
<source>UP Speed</source>
<comment>i.e: Upload speed</comment>
<translation type="unfinished"></translation>
<translation>UP Speed</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="60"/>
<source>Seeds/Leechs</source>
<comment>i.e: full/partial sources</comment>
<translation type="unfinished"></translation>
<translation>Seeds/Leechs</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="61"/>
<source>Ratio</source>
<translation type="unfinished">Arány</translation>
<translation>Arány</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="62"/>
<source>ETA</source>
<comment>i.e: Estimated Time of Arrival / Time left</comment>
<translation type="unfinished">Idő</translation>
<translation>Idő</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="98"/>
<source>qBittorrent %1 started.</source>
<comment>e.g: qBittorrent v0.x started.</comment>
<translation type="unfinished">qBittorrent %1 elindítva.</translation>
<translation>qBittorrent %1 elindítva.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="99"/>
<source>Be careful, sharing copyrighted material without permission is against the law.</source>
<translation type="unfinished">Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!.</translation>
<translation>Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="123"/>
<source>&lt;font color=&apos;red&apos;&gt;%1&lt;/font&gt; &lt;i&gt;was blocked&lt;/i&gt;</source>
<comment>x.y.z.w was blocked</comment>
<translation type="unfinished">&lt;font color=&apos;red&apos;&gt;%1&lt;/font&gt; &lt;i&gt;blokkolva&lt;/i&gt;</translation>
<translation>&lt;font color=&apos;red&apos;&gt;%1&lt;/font&gt; &lt;i&gt;blokkolva&lt;/i&gt;</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="197"/>
<source>Fast resume data was rejected for torrent %1, checking again...</source>
<translation type="unfinished">Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés...</translation>
<translation>Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés...</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="201"/>
<source>Url seed lookup failed for url: %1, message: %2</source>
<translation type="unfinished">Url forrás meghatározása sikertelen: %1, hibaüzenet: %2</translation>
<translation>Url forrás meghatározása sikertelen: %1, hibaüzenet: %2</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="633"/>
<source>&apos;%1&apos; added to download list.</source>
<comment>&apos;/home/y/xxx.torrent&apos; was added to download list.</comment>
<translation type="unfinished">&apos;%1&apos; felvéve a letöltési listára.</translation>
<translation>&apos;%1&apos; felvéve a letöltési listára.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="635"/>
<source>&apos;%1&apos; resumed. (fast resume)</source>
<comment>&apos;/home/y/xxx.torrent&apos; was resumed. (fast resume)</comment>
<translation type="unfinished">&apos;%1&apos; visszaállítva. (folytatás)</translation>
<translation>&apos;%1&apos; visszaállítva. (folytatás)</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="643"/>
<source>&apos;%1&apos; is already in download list.</source>
<comment>e.g: &apos;xxx.avi&apos; is already in download list.</comment>
<translation type="unfinished">&apos;%1&apos; már letöltés alatt.</translation>
<translation>&apos;%1&apos; már letöltés alatt.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="647"/>
<source>Unable to decode torrent file: &apos;%1&apos;</source>
<comment>e.g: Unable to decode torrent file: &apos;/home/y/xxx.torrent&apos;</comment>
<translation type="unfinished">Megfejthetetlen torrent: &apos;%1&apos;</translation>
<translation>Megfejthetetlen torrent: &apos;%1&apos;</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="648"/>
<source>This file is either corrupted or this isn&apos;t a torrent.</source>
<translation type="unfinished">Ez a fájl sérült, vagy nem is torrent.</translation>
<translation>Ez a fájl sérült, vagy nem is torrent.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="662"/>
<source>Couldn&apos;t listen on any of the given ports.</source>
<translation type="unfinished">A megadott porok zártak.</translation>
<translation>A megadott porok zártak.</translation>
</message>
<message>
<location filename="../downloadingTorrents.cpp" line="686"/>
<source>Downloading &apos;%1&apos;, please wait...</source>
<comment>e.g: Downloading &apos;xxx.torrent&apos;, please wait...</comment>
<translation type="unfinished">Letöltés alatt: &apos;%1&apos;, kis türelmet...</translation>
<translation>Letöltés alatt: &apos;%1&apos;, kis türelmet...</translation>
</message>
</context>
<context>
@ -1241,13 +1242,13 @@ Mégis leállítod a qBittorrentet?</translation>
<location filename="../GUI.cpp" line="290"/>
<source>Alt+3</source>
<comment>shortcut to switch to third tab</comment>
<translation type="unfinished">Alt+3</translation>
<translation>Alt+3</translation>
</message>
<message>
<location filename="../GUI.cpp" line="292"/>
<source>Ctrl+F</source>
<comment>shortcut to switch to search tab</comment>
<translation type="unfinished"></translation>
<translation>Ctrl+F</translation>
</message>
</context>
<context>
@ -1597,7 +1598,7 @@ Mégis leállítod a qBittorrentet?</translation>
<message>
<location filename="../rss_imp.cpp" line="155"/>
<source>This rss feed is already in the list.</source>
<translation type="unfinished"></translation>
<translation>Ez a hírcsatorna már felvéve.</translation>
</message>
</context>
<context>
@ -1619,7 +1620,7 @@ Mégis leállítod a qBittorrentet?</translation>
<message>
<location filename="../rss.h" line="261"/>
<source>Never</source>
<translation type="unfinished"></translation>
<translation>Soha</translation>
</message>
</context>
<context>
@ -1773,7 +1774,7 @@ Changelog:
<message>
<location filename="../searchEngine.cpp" line="433"/>
<source>Unknown</source>
<translation type="unfinished">Ismeretlen</translation>
<translation>Ismeretlen</translation>
</message>
</context>
<context>
@ -1968,7 +1969,7 @@ Changelog:
<message>
<location filename="../createtorrent.ui" line="93"/>
<source>Input file or directory:</source>
<translation type="unfinished"></translation>
<translation>Forrás fájl vagy könyvtár:</translation>
</message>
</context>
<context>
@ -2052,7 +2053,7 @@ Changelog:
<message>
<location filename="../createtorrent_imp.cpp" line="75"/>
<source>Select a file to add to the torrent</source>
<translation type="unfinished"></translation>
<translation>Válassz fájlt(okat) a torrenthez</translation>
</message>
</context>
<context>
@ -2098,82 +2099,82 @@ Changelog:
<message>
<location filename="../download.ui" line="13"/>
<source>Search</source>
<translation type="unfinished">Keresés</translation>
<translation>Keresés</translation>
</message>
<message>
<location filename="../download.ui" line="48"/>
<source>Total DL Speed:</source>
<translation type="unfinished">Bejövő sebesség:</translation>
<translation>Bejövő sebesség:</translation>
</message>
<message>
<location filename="../download.ui" line="181"/>
<source>KiB/s</source>
<translation type="unfinished">KByte/s</translation>
<translation>KByte/s</translation>
</message>
<message>
<location filename="../download.ui" line="106"/>
<source>Session ratio: </source>
<translation type="unfinished">Megosztási arány: </translation>
<translation>Megosztási arány: </translation>
</message>
<message>
<location filename="../download.ui" line="152"/>
<source>Total UP Speed:</source>
<translation type="unfinished">Kimenő sebesség:</translation>
<translation>Kimenő sebesség:</translation>
</message>
<message>
<location filename="../download.ui" line="246"/>
<source>Log</source>
<translation type="unfinished">Napló</translation>
<translation>Napló</translation>
</message>
<message>
<location filename="../download.ui" line="280"/>
<source>IP filter</source>
<translation type="unfinished">IP szűrő</translation>
<translation>IP szűrő</translation>
</message>
<message>
<location filename="../download.ui" line="306"/>
<source>Start</source>
<translation type="unfinished">Indítás</translation>
<translation>Indítás</translation>
</message>
<message>
<location filename="../download.ui" line="311"/>
<source>Pause</source>
<translation type="unfinished">Szünet</translation>
<translation>Szünet</translation>
</message>
<message>
<location filename="../download.ui" line="316"/>
<source>Delete</source>
<translation type="unfinished">Törlés</translation>
<translation>Törlés</translation>
</message>
<message>
<location filename="../download.ui" line="321"/>
<source>Clear</source>
<translation type="unfinished">Törlés</translation>
<translation>Törlés</translation>
</message>
<message>
<location filename="../download.ui" line="326"/>
<source>Preview file</source>
<translation type="unfinished">Minta fájl</translation>
<translation>Minta fájl</translation>
</message>
<message>
<location filename="../download.ui" line="331"/>
<source>Set upload limit</source>
<translation type="unfinished">Feltöltési korlát megadása</translation>
<translation>Feltöltési korlát megadása</translation>
</message>
<message>
<location filename="../download.ui" line="336"/>
<source>Set download limit</source>
<translation type="unfinished">Letöltési korlát megadása</translation>
<translation>Letöltési korlát megadása</translation>
</message>
<message>
<location filename="../download.ui" line="341"/>
<source>Delete Permanently</source>
<translation type="unfinished">Végleges törlés</translation>
<translation>Végleges törlés</translation>
</message>
<message>
<location filename="../download.ui" line="346"/>
<source>Torrent Properties</source>
<translation type="unfinished"></translation>
<translation>Torrent tulajdonságai</translation>
</message>
</context>
<context>
@ -2181,62 +2182,62 @@ Changelog:
<message>
<location filename="../engineSelect.ui" line="16"/>
<source>Search plugins</source>
<translation type="unfinished"></translation>
<translation>Kereső modulok</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="29"/>
<source>Installed search engines:</source>
<translation type="unfinished"></translation>
<translation>Telepített keresők:</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="49"/>
<source>Name</source>
<translation type="unfinished">Név</translation>
<translation>Név</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="54"/>
<source>Url</source>
<translation type="unfinished"></translation>
<translation>Url</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="59"/>
<source>Enabled</source>
<translation type="unfinished">Engedélyez</translation>
<translation>Státusz</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="72"/>
<source>You can get new search engine plugins here: &lt;a href=&quot;http:plugins.qbittorrent.org&quot;&gt;http://plugins.qbittorrent.org&lt;/a&gt;</source>
<translation type="unfinished"></translation>
<translation>Újabb kereső modulok elérhetőek itt : &lt;a href=&quot;http:plugins.qbittorrent.org&quot;&gt;http://plugins.qbittorrent.org&lt;/a&gt;</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="81"/>
<source>Install a new one</source>
<translation type="unfinished"></translation>
<translation>Új telepítése</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="88"/>
<source>Check for updates</source>
<translation type="unfinished"></translation>
<translation>Frissítések ellenőrzése</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="95"/>
<source>Close</source>
<translation type="unfinished"></translation>
<translation>Bezárás</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="104"/>
<source>Enable</source>
<translation type="unfinished"></translation>
<translation>Enged</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="109"/>
<source>Disable</source>
<translation type="unfinished">Letiltva</translation>
<translation>Tilt</translation>
</message>
<message>
<location filename="../engineSelect.ui" line="114"/>
<source>Uninstall</source>
<translation type="unfinished"></translation>
<translation>Eltávolít</translation>
</message>
</context>
<context>
@ -2244,111 +2245,113 @@ Changelog:
<message>
<location filename="../engineSelectDlg.cpp" line="287"/>
<source>True</source>
<translation type="unfinished"></translation>
<translation>Engedve</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="289"/>
<source>False</source>
<translation type="unfinished"></translation>
<translation>Tiltva</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="196"/>
<source>Uninstall warning</source>
<translation type="unfinished"></translation>
<translation>Figyelemeztetés</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="196"/>
<source>Some plugins could not be uninstalled because they are included in qBittorrent.
Only the ones you added yourself can be uninstalled.
However, those plugins were disabled.</source>
<translation type="unfinished"></translation>
<translation>Néhány modult nem lehet eltávolítani, mivel a program részei.
Csak azokat lehet, amiket saját kezüleg telepítettél.
Viszont azok a modulok kikapcsolhatóak.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="198"/>
<source>Uninstall success</source>
<translation type="unfinished"></translation>
<translation>Sikeresen eltávolítva</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="378"/>
<source>Select search plugins</source>
<translation type="unfinished"></translation>
<translation>Modul kiválasztása</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="379"/>
<source>qBittorrent search plugins</source>
<translation type="unfinished"></translation>
<translation>qBittorrent kereső modulok</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="497"/>
<source>Search plugin install</source>
<translation type="unfinished"></translation>
<translation>Kerső telepítése</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="524"/>
<source>qBittorrent</source>
<translation type="unfinished">qBittorrent</translation>
<translation>qBittorrent</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="330"/>
<source>A more recent version of %1 search engine plugin is already installed.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>A %1 kereső modul egy újabb verziója már telepítve van.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="524"/>
<source>Search plugin update</source>
<translation type="unfinished">Kereső modul frissítése</translation>
<translation>Kereső modul frissítése</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="516"/>
<source>Sorry, update server is temporarily unavailable.</source>
<translation type="unfinished">A kiszolgálő jelenleg nem elérhető. Bocs.</translation>
<translation>A kiszolgálő jelenleg nem elérhető. Bocs.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="524"/>
<source>Sorry, %1 search plugin update failed.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>Bocs, nem sikerült frissíteni: %1.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="426"/>
<source>All your plugins are already up to date.</source>
<translation type="unfinished"></translation>
<translation>A legújabb kereső modulokat használod.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="352"/>
<source>%1 search engine plugin could not be updated, keeping old version.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>%1 keresőt nem lehet frissíteni, előző verzió megtartva.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="357"/>
<source>%1 search engine plugin could not be installed.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>%1 kereső modul telepítése sikertelen.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="198"/>
<source>All selected plugins were uninstalled successfully</source>
<translation type="unfinished"></translation>
<translation>Kereső modul(ok) sikeresen eltávolítva</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="368"/>
<source>%1 search engine plugin was successfully updated.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>%1 kereső modul sikeresen frissítve.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="497"/>
<source>%1 search engine plugin was successfully installed.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>%1 kereső modul sikeresen telepítve.</translation>
</message>
<message>
<location filename="../engineSelectDlg.cpp" line="499"/>
<source>%1 search plugin was successfully updated.</source>
<comment>%1 is the name of the search engine</comment>
<translation type="unfinished"></translation>
<translation>%1 kereső modul sikeresen frissítve.</translation>
</message>
</context>
<context>
@ -2855,7 +2858,7 @@ However, those plugins were disabled.</source>
<message>
<location filename="../search.ui" line="99"/>
<source>Search engines...</source>
<translation type="unfinished"></translation>
<translation>Keresők...</translation>
</message>
</context>
<context>