'Note this method will retry without identifiers automatically if no
match is found with identifiers.'

def identify(self, log, result_queue, abort, title=None, authors=None, identifiers={}, timeout=60):

    testing = getattr(self, u'running_a_test', False)
    udata = self._get_book_url(identifiers)
    br = self.browser
    log(u'User-agent:', br.current_user_agent())
    log(u'Server:', self.server)
    if testing:
        print(u'User-agent:', br.current_user_agent())
    if ((udata is not None) and (not self.use_search_engine)):
        (domain, idtype, asin, durl) = udata
        if (durl is not None):
            preparsed_root = parse_details_page(durl, log, timeout, br, domain)
            if (preparsed_root is not None):
                qasin = parse_asin(preparsed_root[1], log, durl)
                if (qasin == asin):
                    w = Worker(durl, result_queue, br, log, 0, domain, self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)
                    try:
                        w.get_details()
                        return
                    except Exception:
                        log.exception((u'get_details    failed    for    url:    %r' % durl))
    func = (self.search_search_engine if self.use_search_engine else self.search_amazon)
    try:
        (matches, query, domain, cover_url_processor) = func(br, testing, log, abort, title, authors, identifiers, timeout)
    except SearchFailed:
        return
    if abort.is_set():
        return
    if (not matches):
        if (identifiers and title and authors):
            log((u'No    matches    found    with    identifiers,    retrying    using    only    title    and    authors.    Query:    %r' % query))
            time.sleep(1)
            return self.identify(log, result_queue, abort, title=title, authors=authors, timeout=timeout)
        log.error((u'No    matches    found    with    query:    %r' % query))
        return
    workers = [Worker(url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout, cover_url_processor=cover_url_processor, filter_result=partial(self.filter_result, title, authors, identifiers)) for (i, url) in enumerate(matches)]
    for w in workers:
        time.sleep(1)
        w.start()
        if abort.is_set():
            return
    while (not abort.is_set()):
        a_worker_is_alive = False
        for w in workers:
            w.join(0.2)
            if abort.is_set():
                break
            if w.is_alive():
                a_worker_is_alive = True
        if (not a_worker_is_alive):
            break
    return None
