'Public API for adding a GUI request.
:param infohash: Torrent infohash.
:param timeout: The timeout to use in the performed requests
:param scrape_now: Flag whether we want to force scraping immediately'

@call_on_reactor_thread
def add_gui_request(self, infohash, timeout=20, scrape_now=False):

    result = self._torrent_db.getTorrent(infohash, (u'torrent_id', u'last_tracker_check', u'num_seeders', u'num_leechers'), False)
    if (result is None):
        self._logger.warn(u'torrent    info    not    found,    skip.    infohash:    %s', hexlify(infohash))
        return fail(Failure(RuntimeError('Torrent    not    found')))
    torrent_id = result[u'torrent_id']
    last_check = result[u'last_tracker_check']
    time_diff = (time.time() - last_check)
    if ((time_diff < self._torrent_check_interval) and (not scrape_now)):
        self._logger.debug(u'time    interval    too    short,    skip    GUI    request.    infohash:    %s', hexlify(infohash))
        return succeed({'db': {'seeders': result[u'num_seeders'], 'leechers': result[u'num_leechers'], 'infohash': infohash.encode('hex')}})
    tracker_set = set()
    db_tracker_list = self._torrent_db.getTrackerListByTorrentID(torrent_id)
    for tracker in db_tracker_list:
        tracker_set.add(tracker)
    if (not tracker_set):
        self._logger.warn(u'no    trackers,    skip    GUI    request.    infohash:    %s', hexlify(infohash))
        return fail(Failure(RuntimeError('No    trackers    available    for    this    torrent')))
    deferred_list = []
    for tracker_url in tracker_set:
        if (tracker_url == u'DHT'):
            session = FakeDHTSession(self.tribler_session, infohash, timeout)
            self._session_list['DHT'].append(session)
            deferred_list.append(session.connect_to_tracker().addCallbacks(*self.get_callbacks_for_session(session)))
        elif (tracker_url != u'no-DHT'):
            session = self._create_session_for_request(tracker_url, timeout=timeout)
            session.add_infohash(infohash)
            deferred_list.append(session.connect_to_tracker().addCallbacks(*self.get_callbacks_for_session(session)))
    return DeferredList(deferred_list, consumeErrors=True).addCallback((lambda res: self.on_gui_request_completed(infohash, res)))
