Search does not work when PluginVersion class can not parse plugin version string #5778

Closed
opened 2026-02-21 18:02:35 -05:00 by deekerman · 9 comments
Owner

Originally created by @WaterSibilantFalling on GitHub (Jul 13, 2017).

Originally assigned to: @zeule on GitHub.

qBittorrent Newly built 3.4.0
Linux 4.9.0-2-686-pae #1 SMP Debian 4.9.18-1 (2017-03-30) i686 GNU/Linu
libtorrent newly built 1.1.4.0
Python 3 and 2 are installed and running

The Search tab has completely disappeared. Regardless of whether I select view > search, nothing.

In the logs there is nothing related to "search"

There is nothing related to 'search' in the top-level build dir (no configure option that I can see)

If I go into qBittorrent.conf and change "EnableSearch=True", and then run qBittorrent, then qBittorrent runs with the View > Search checkbox checked, but no search tab.

Is there some ./configure option that I should set when building?

Originally created by @WaterSibilantFalling on GitHub (Jul 13, 2017). Originally assigned to: @zeule on GitHub. qBittorrent Newly built 3.4.0 Linux 4.9.0-2-686-pae #1 SMP Debian 4.9.18-1 (2017-03-30) i686 GNU/Linu libtorrent newly built 1.1.4.0 Python 3 and 2 are installed and running The Search tab has completely disappeared. Regardless of whether I select view > search, nothing. In the logs there is nothing related to "search" There is nothing related to 'search' in the top-level build dir (no configure option that I can see) If I go into qBittorrent.conf and change "EnableSearch=True", and then run qBittorrent, then qBittorrent runs with the View > Search checkbox checked, but no search tab. Is there some ./configure option that I should set when building?
Author
Owner

@WaterSibilantFalling commented on GitHub (Jul 17, 2017):

I've built it three times now, always it ends up with no search screen/dialog, regardless of the conf file or the menu settings.

Anyone?

@WaterSibilantFalling commented on GitHub (Jul 17, 2017): I've built it three times now, always it ends up with no search screen/dialog, regardless of the conf file or the menu settings. Anyone?
Author
Owner

@zeule commented on GitHub (Jul 17, 2017):

Is there some ./configure option that I should set when building?

No. I'm afraid you have to debug it. MainWindow::displaySearchTab() is a good place to start (in src/gui/mainwindow.cpp).

@zeule commented on GitHub (Jul 17, 2017): > Is there some ./configure option that I should set when building? No. I'm afraid you have to debug it. `MainWindow::displaySearchTab()` is a good place to start (in `src/gui/mainwindow.cpp`).
Author
Owner

@WaterSibilantFalling commented on GitHub (Jul 28, 2017):

I don't know if this is being read - if not I will close and open a new, more specific, bug.

This is the first time I have interacted with the qBittorrent source code, and this is what I have found out so far. Someone with more knowledge may be able to point out the underlying problem.

Now, none of this makes any sense. It's like only the base class object is being instantiated - or the qtcreator debugger is completely warped.

--(1)--

in the file qBittorrent/src/gui/search/searchwidget.cpp line 75

SearchWidget::SearchWidget(MainWindow *mainWindow)
    : QWidget(mainWindow)
    , m_ui(new Ui::SearchWidget())
    , m_mainWindow(mainWindow)
    , m_isNewQueryString(false)
    , m_noSearchResults(true)
{
    m_ui->setupUi(this);
      :
      :

The m_ui member is not being instantiated in the initializer list.

--(2 a)--

Then, somehow, I don't know how, the setupUI(SearchWidget) function is being successfully called via this non-existent member pointer

m_ui is an instatiation of
Ui::SearchWidget which is a
UI_SearchWidget

m_ui->setupUI( *SearchWidget ) method is a member of UI_SearchWidget

Control (somehow ) passes to the setupUI( ) method

--(2 b)--

in qBittorrent/src/ui_searchwidget.h line 57

void setupUi(QWidget *SearchWidget)
    {
        if (SearchWidget->objectName().isEmpty())
            SearchWidget->setObjectName(QStringLiteral("SearchWidget"));

        SearchWidget->resize(843, 669);  // <--- here  -------

        verticalLayout_3 = new QVBoxLayout(SearchWidget);
        verticalLayout_3->setObjectName(QStringLiteral("verticalLayout_3"));
        searchBarLayout = new QHBoxLayout();
               : 
               :
               :

The objectName() function presumably works on some baseclass - a static member? somewhere - that I looked for but could not find. Anyway, that the SearchWidget is fine, and seemingly unchanged, after that call.

THEN, at the resize( ) call, the SearchWidget becomes null.

--(3)--

The remainder of void setupUi(QWidget *SearchWidget) method operates on a null SearchWidget object. qBittorrent carries on as if nothing was the problem. No return values are checked, and the SearchWidget is not tested if it exists or, as in this case, does not exist.

---(4)---

Runtime.

At runtime startup, these errors are produced:


Updating priorities in files tab
Updating nova
plugin "/home/me/.local/share/data/qBittorrent/nova3/nova2.py" version:  "1.41"
plugin ":/searchengine/nova3/nova2.py" version:  "1.41"
plugin "/home/me/.local/share/data/qBittorrent/nova3/nova2dl.py" version:  "1.20"
plugin ":/searchengine/nova3/nova2dl.py" version:  "1.20"
plugin "/home/me/.local/share/data/qBittorrent/nova3/novaprinter.py" version:  "1.45"
plugin ":/searchengine/nova3/novaprinter.py" version:  "1.45"
plugin "/home/me/.local/share/data/qBittorrent/nova3/helpers.py" version:  "1.40"
plugin ":/searchengine/nova3/helpers.py" version:  "1.40"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/tokyotoshokan.py" version:  "2.0"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/torrent9.py" version:  "1.2"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/tfile_me.py" version:  "2.3"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/limetorrents.py" version:  "3.8"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/smartorrent.py" version:  "1.1"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/cpasbien.py" version:  "1.1"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/sumotorrent.py" version:  "1.3"
plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py" version:  "2.29"
Error parsing version: Can not parse version component
Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver:  "menuView"
Updating priorities in files tab
Processing share limits...
Updating priorities in files tab

I mean, specifically:

plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py" version:  "2.29"
Error parsing version: Can not parse version component
Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver:  "menuView"
Updating priorities in files tab

Does this make sense to anyone?

@WaterSibilantFalling commented on GitHub (Jul 28, 2017): I don't know if this is being read - if not I will close and open a new, more specific, bug. This is the first time I have interacted with the qBittorrent source code, and this is what I have found out so far. Someone with more knowledge may be able to point out the underlying problem. Now, none of this makes any sense. It's like only the base class object is being instantiated - or the qtcreator debugger is completely warped. **--(1)--** in the file qBittorrent/src/gui/search/searchwidget.cpp line 75 ``` SearchWidget::SearchWidget(MainWindow *mainWindow) : QWidget(mainWindow) , m_ui(new Ui::SearchWidget()) , m_mainWindow(mainWindow) , m_isNewQueryString(false) , m_noSearchResults(true) { m_ui->setupUi(this); : : ``` The m_ui member is not being instantiated in the initializer list. **--(2 a)--** Then, somehow, I don't know how, the setupUI(SearchWidget) function is being successfully called via this non-existent member pointer m_ui is an instatiation of Ui::SearchWidget which is a UI_SearchWidget m_ui->setupUI( *SearchWidget ) method is a member of UI_SearchWidget Control (somehow ) passes to the setupUI( ) method **--(2 b)--** in qBittorrent/src/ui_searchwidget.h line 57 ``` void setupUi(QWidget *SearchWidget) { if (SearchWidget->objectName().isEmpty()) SearchWidget->setObjectName(QStringLiteral("SearchWidget")); SearchWidget->resize(843, 669); // <--- here ------- verticalLayout_3 = new QVBoxLayout(SearchWidget); verticalLayout_3->setObjectName(QStringLiteral("verticalLayout_3")); searchBarLayout = new QHBoxLayout(); : : : ``` The objectName() function presumably works on some baseclass - a static member? somewhere - that I looked for but could not find. Anyway, that the SearchWidget is fine, and seemingly unchanged, after that call. THEN, at the resize( ) call, the SearchWidget becomes null. **--(3)--** The remainder of void setupUi(QWidget *SearchWidget) method operates on a null SearchWidget object. qBittorrent carries on as if nothing was the problem. No return values are checked, and the SearchWidget is not tested if it exists or, as in this case, does not exist. **---(4)---** Runtime. At runtime startup, these errors are produced: ``` Updating priorities in files tab Updating nova plugin "/home/me/.local/share/data/qBittorrent/nova3/nova2.py" version: "1.41" plugin ":/searchengine/nova3/nova2.py" version: "1.41" plugin "/home/me/.local/share/data/qBittorrent/nova3/nova2dl.py" version: "1.20" plugin ":/searchengine/nova3/nova2dl.py" version: "1.20" plugin "/home/me/.local/share/data/qBittorrent/nova3/novaprinter.py" version: "1.45" plugin ":/searchengine/nova3/novaprinter.py" version: "1.45" plugin "/home/me/.local/share/data/qBittorrent/nova3/helpers.py" version: "1.40" plugin ":/searchengine/nova3/helpers.py" version: "1.40" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/tokyotoshokan.py" version: "2.0" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/torrent9.py" version: "1.2" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/tfile_me.py" version: "2.3" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/limetorrents.py" version: "3.8" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/smartorrent.py" version: "1.1" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/cpasbien.py" version: "1.1" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/sumotorrent.py" version: "1.3" plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py" version: "2.29" Error parsing version: Can not parse version component Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver: "menuView" Updating priorities in files tab Processing share limits... Updating priorities in files tab ``` I mean, specifically: ``` plugin "/home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py" version: "2.29" Error parsing version: Can not parse version component Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver: "menuView" Updating priorities in files tab ``` Does this make sense to anyone?
Author
Owner

@zeule commented on GitHub (Jul 28, 2017):

Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver:  "menuView"

This might be a problem. Please, share /home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py"

@zeule commented on GitHub (Jul 28, 2017): ``` Exception thrown: array::at: __n (which is 4294967295) >= _Nm (which is 2) , receiver: "menuView" ``` This might be a problem. Please, share `/home/me/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py"`
Author
Owner

@WaterSibilantFalling commented on GitHub (Jul 28, 2017):

.../nova3/engines/nyaatorrents.py


#VERSION: 2.29
#AUTHORS: Yukarin (yukariin@yandex.ru)

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#    * Redistributions of source code must retain the above copyright notice,
#      this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of the author nor the names of its contributors may be
#      used to endorse or promote products derived from this software without
#      specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

try:
    # python2
    from HTMLParser import HTMLParser
except ImportError:
    # python3
    from html.parser import HTMLParser

# qBt
from novaprinter import prettyPrinter
from helpers import retrieve_url, download_file


class nyaatorrents(object):
    url = 'https://www.nyaa.se'
    name = 'Nyaatorrents'
    supported_categories = {'all': '0_0',
                            'anime': '1_0',
                            'books': '2_0',
                            'music': '3_0',
                            'pictures': '4_0',
                            'software': '6_0',
                            'games': '6_24'}

    def download_torrent(self, info):
        print(download_file(info))

    class NTParser(HTMLParser):
        def __init__(self, results, url):
            HTMLParser.__init__(self)
            self.td_counter = None
            self.current_item = None
            self.results = results
            self.url = url

        def handle_starttag(self, tag, attrs):
            if tag == 'a':
                self.start_a(attrs)
            elif tag == 'td':
                self.start_td(attrs)

        def start_a(self, attrs):
            params = dict(attrs)
            if 'href' in params:
                # first item is category icon - init counter and current item buff
                if 'cats=' in params['href']:
                    self.td_counter = 0
                    self.current_item = {}
                elif 'page=download' in params['href']:
                    self.current_item['link'] = 'https:' + params['href'].strip()
                elif 'page=view' in params['href']:
                    self.current_item['desc_link'] = 'https:' + params['href'].strip()

        def start_td(self, attrs):
            if isinstance(self.td_counter, int):
                self.td_counter += 1
                if self.td_counter > 5:
                    self.td_counter = None
                    if self.current_item:
                        self.current_item['engine_url'] = self.url
                        if not self.current_item['seeds'].isdigit():
                            self.current_item['seeds'] = 0
                        if not self.current_item['leech'].isdigit():
                            self.current_item['leech'] = 0
                        prettyPrinter(self.current_item)
                        self.results.append('a')

        def handle_data(self, data):
            if self.td_counter == 1:
                if 'name' not in self.current_item:
                    self.current_item['name'] = ''
                self.current_item['name'] += data
            elif self.td_counter == 3:
                if 'size' not in self.current_item:
                    self.current_item['size'] = ''
                self.current_item['size'] += data.strip()
            elif self.td_counter == 4:
                if 'seeds' not in self.current_item:
                    self.current_item['seeds'] = ''
                self.current_item['seeds'] += data.strip()
            elif self.td_counter == 5:
                if 'leech' not in self.current_item:
                    self.current_item['leech'] = ''
                self.current_item['leech'] += data.strip()

    def search(self, what, cat='all'):
        i = 1
        results = []
        parser = self.NTParser(results, self.url)
        while i < 51:
            dat = retrieve_url(
                '%s/?page=search&term=%s&offset=%d&cats=%s' % (self.url, what, i, self.supported_categories[cat]))
            parser.feed(dat)
            if len(results) <= 0:
                break
            del results[:]
            i += 1
        parser.close()

@WaterSibilantFalling commented on GitHub (Jul 28, 2017): .../nova3/engines/nyaatorrents.py ``` #VERSION: 2.29 #AUTHORS: Yukarin (yukariin@yandex.ru) # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. try: # python2 from HTMLParser import HTMLParser except ImportError: # python3 from html.parser import HTMLParser # qBt from novaprinter import prettyPrinter from helpers import retrieve_url, download_file class nyaatorrents(object): url = 'https://www.nyaa.se' name = 'Nyaatorrents' supported_categories = {'all': '0_0', 'anime': '1_0', 'books': '2_0', 'music': '3_0', 'pictures': '4_0', 'software': '6_0', 'games': '6_24'} def download_torrent(self, info): print(download_file(info)) class NTParser(HTMLParser): def __init__(self, results, url): HTMLParser.__init__(self) self.td_counter = None self.current_item = None self.results = results self.url = url def handle_starttag(self, tag, attrs): if tag == 'a': self.start_a(attrs) elif tag == 'td': self.start_td(attrs) def start_a(self, attrs): params = dict(attrs) if 'href' in params: # first item is category icon - init counter and current item buff if 'cats=' in params['href']: self.td_counter = 0 self.current_item = {} elif 'page=download' in params['href']: self.current_item['link'] = 'https:' + params['href'].strip() elif 'page=view' in params['href']: self.current_item['desc_link'] = 'https:' + params['href'].strip() def start_td(self, attrs): if isinstance(self.td_counter, int): self.td_counter += 1 if self.td_counter > 5: self.td_counter = None if self.current_item: self.current_item['engine_url'] = self.url if not self.current_item['seeds'].isdigit(): self.current_item['seeds'] = 0 if not self.current_item['leech'].isdigit(): self.current_item['leech'] = 0 prettyPrinter(self.current_item) self.results.append('a') def handle_data(self, data): if self.td_counter == 1: if 'name' not in self.current_item: self.current_item['name'] = '' self.current_item['name'] += data elif self.td_counter == 3: if 'size' not in self.current_item: self.current_item['size'] = '' self.current_item['size'] += data.strip() elif self.td_counter == 4: if 'seeds' not in self.current_item: self.current_item['seeds'] = '' self.current_item['seeds'] += data.strip() elif self.td_counter == 5: if 'leech' not in self.current_item: self.current_item['leech'] = '' self.current_item['leech'] += data.strip() def search(self, what, cat='all'): i = 1 results = [] parser = self.NTParser(results, self.url) while i < 51: dat = retrieve_url( '%s/?page=search&term=%s&offset=%d&cats=%s' % (self.url, what, i, self.supported_categories[cat])) parser.feed(dat) if len(results) <= 0: break del results[:] i += 1 parser.close() ```
Author
Owner

@zeule commented on GitHub (Jul 28, 2017):

Thanks. This is not the plugin which creates the error. Could you, please, do the following (and share output):

$ grep -n VERSION ~/.local/share/data/qBittorrent/nova3/engines/*
@zeule commented on GitHub (Jul 28, 2017): Thanks. This is not the plugin which creates the error. Could you, please, do the following (and share output): ```bash $ grep -n VERSION ~/.local/share/data/qBittorrent/nova3/engines/* ```
Author
Owner

@WaterSibilantFalling commented on GitHub (Jul 28, 2017):


$ grep -n VERSION ~/.local/share/data/qBittorrent/nova3/engines/*

~/.local/share/data/qBittorrent/nova3/engines/btdb.py:1:#VERSION: 1.01
~/.local/share/data/qBittorrent/nova3/engines/btetree.py:1:#VERSION: 1.00
~/.local/share/data/qBittorrent/nova3/engines/cpasbien.py:2:#VERSION: 1.1
~/.local/share/data/qBittorrent/nova3/engines/demonoid.py:1:#VERSION: 1.23
~/.local/share/data/qBittorrent/nova3/engines/extratorrent.py:1:#VERSION: 3.10
~/.local/share/data/qBittorrent/nova3/engines/leetx.py:1:#VERSION: 1.1
~/.local/share/data/qBittorrent/nova3/engines/legittorrents.py:1:#VERSION: 2.02
~/.local/share/data/qBittorrent/nova3/engines/limetorrents.py:1:#VERSION: 3.08
~/.local/share/data/qBittorrent/nova3/engines/mininova.py:1:#VERSION: 2.02
~/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py:1:#VERSION: 2.29
~/.local/share/data/qBittorrent/nova3/engines/piratebay.py:1:#VERSION: 2.15
~/.local/share/data/qBittorrent/nova3/engines/psychocydd.py:1:#VERSION: 1.01
~/.local/share/data/qBittorrent/nova3/engines/rarbg.py:1:#VERSION: 1.12
~/.local/share/data/qBittorrent/nova3/engines/rutracker.py:3:#VERSION: 1.04a
~/.local/share/data/qBittorrent/nova3/engines/smartorrent.py:2:#VERSION: 1.1
~/.local/share/data/qBittorrent/nova3/engines/sumotorrent.py:1:#VERSION: 1.3
~/.local/share/data/qBittorrent/nova3/engines/tfile_me.py:1:#VERSION: 2.03
~/.local/share/data/qBittorrent/nova3/engines/tntvillage.py:1:#VERSION: 1.00
~/.local/share/data/qBittorrent/nova3/engines/tokyotoshokan.py:1:#VERSION: 2.0
~/.local/share/data/qBittorrent/nova3/engines/torlock.py:1:#VERSION: 2.0
~/.local/share/data/qBittorrent/nova3/engines/torrent9.py:2:#VERSION: 1.2
~/.local/share/data/qBittorrent/nova3/engines/torrentproject.py:1:#VERSION: 1.01
~/.local/share/data/qBittorrent/nova3/engines/torrentreactor.py:1:#VERSION: 1.42
~/.local/share/data/qBittorrent/nova3/engines/torrentz.py:1:#VERSION: 2.22
~/.local/share/data/qBittorrent/nova3/engines/zooqle.py:1:#VERSION: 1.11

The string for rutracker has a MS Windows line termination after it, represented by "^M" on my computer.

@WaterSibilantFalling commented on GitHub (Jul 28, 2017): ``` $ grep -n VERSION ~/.local/share/data/qBittorrent/nova3/engines/* ~/.local/share/data/qBittorrent/nova3/engines/btdb.py:1:#VERSION: 1.01 ~/.local/share/data/qBittorrent/nova3/engines/btetree.py:1:#VERSION: 1.00 ~/.local/share/data/qBittorrent/nova3/engines/cpasbien.py:2:#VERSION: 1.1 ~/.local/share/data/qBittorrent/nova3/engines/demonoid.py:1:#VERSION: 1.23 ~/.local/share/data/qBittorrent/nova3/engines/extratorrent.py:1:#VERSION: 3.10 ~/.local/share/data/qBittorrent/nova3/engines/leetx.py:1:#VERSION: 1.1 ~/.local/share/data/qBittorrent/nova3/engines/legittorrents.py:1:#VERSION: 2.02 ~/.local/share/data/qBittorrent/nova3/engines/limetorrents.py:1:#VERSION: 3.08 ~/.local/share/data/qBittorrent/nova3/engines/mininova.py:1:#VERSION: 2.02 ~/.local/share/data/qBittorrent/nova3/engines/nyaatorrents.py:1:#VERSION: 2.29 ~/.local/share/data/qBittorrent/nova3/engines/piratebay.py:1:#VERSION: 2.15 ~/.local/share/data/qBittorrent/nova3/engines/psychocydd.py:1:#VERSION: 1.01 ~/.local/share/data/qBittorrent/nova3/engines/rarbg.py:1:#VERSION: 1.12 ~/.local/share/data/qBittorrent/nova3/engines/rutracker.py:3:#VERSION: 1.04a ~/.local/share/data/qBittorrent/nova3/engines/smartorrent.py:2:#VERSION: 1.1 ~/.local/share/data/qBittorrent/nova3/engines/sumotorrent.py:1:#VERSION: 1.3 ~/.local/share/data/qBittorrent/nova3/engines/tfile_me.py:1:#VERSION: 2.03 ~/.local/share/data/qBittorrent/nova3/engines/tntvillage.py:1:#VERSION: 1.00 ~/.local/share/data/qBittorrent/nova3/engines/tokyotoshokan.py:1:#VERSION: 2.0 ~/.local/share/data/qBittorrent/nova3/engines/torlock.py:1:#VERSION: 2.0 ~/.local/share/data/qBittorrent/nova3/engines/torrent9.py:2:#VERSION: 1.2 ~/.local/share/data/qBittorrent/nova3/engines/torrentproject.py:1:#VERSION: 1.01 ~/.local/share/data/qBittorrent/nova3/engines/torrentreactor.py:1:#VERSION: 1.42 ~/.local/share/data/qBittorrent/nova3/engines/torrentz.py:1:#VERSION: 2.22 ~/.local/share/data/qBittorrent/nova3/engines/zooqle.py:1:#VERSION: 1.11 ```` The string for rutracker has a MS Windows line termination after it, represented by "^M" on my computer.
Author
Owner

@WaterSibilantFalling commented on GitHub (Jul 28, 2017):

.... and Ii've removed that '^M' (I actually removed the 'a' as well 1.04a^M to 1.04)

... and it WORKS!. The search dialogue/tab appears in qBittorrent

That was it (for me at least).

I realize that there might be another problem that I have exposed, feel free to ask for info, files etc, but otherwise (for me at least) this bug can be closed.

If you had not asked me to list the VERSION strings I - or, well, you - would have never, ever found this bug in 1000 years. Thank you very much.

@WaterSibilantFalling commented on GitHub (Jul 28, 2017): .... and Ii've removed that '^M' (I actually removed the 'a' as well 1.04a^M to 1.04) ... and it WORKS!. The search dialogue/tab appears in qBittorrent That was it (for me at least). I realize that there might be another problem that I have exposed, feel free to ask for info, files etc, but otherwise (for me at least) this bug can be closed. If you had not asked me to list the VERSION strings I - or, well, you - would have never, ever found this bug in 1000 years. Thank you very much.
Author
Owner

@zeule commented on GitHub (Jul 28, 2017):

I guess the problem was in 'a'.

@zeule commented on GitHub (Jul 28, 2017): I guess the problem was in 'a'.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/qBittorrent#5778
No description provided.