void IBSFetcher::slotCompleteISBN(KJob* job_) { if(m_job->error()) { m_job->ui()->showErrorMessage(); stop(); return; } QByteArray data = m_job->data(); if(data.isEmpty()) { myDebug() << "no data"; stop(); return; } // since the fetch is done, don't worry about holding the job pointer m_job = 0; QString str = Tellico::decodeHTML(data); if(str.indexOf(QLatin1String("Libro non presente"), 0, Qt::CaseInsensitive) > -1) { stop(); return; } Data::EntryPtr entry = parseEntry(str); if(entry) { QString desc = entry->field(QLatin1String("author")) + QLatin1Char('/') + entry->field(QLatin1String("publisher")); FetchResult* r = new FetchResult(Fetcher::Ptr(this), entry->title(), desc, entry->field(QLatin1String("isbn"))); m_matches.insert(r->uid, static_cast<KIO::TransferJob*>(job_)->url()); emit signalResultFound(r); } stop(); }
void EntryMerger::slotStartNext() { QString statusMsg = i18n("Total merged/scanned entries: %1/%2", m_entriesToRemove.count(), m_origCount - m_entriesToCheck.count()); StatusBar::self()->setStatus(statusMsg); ProgressManager::self()->setProgress(this, m_origCount - m_entriesToCheck.count()); Data::EntryPtr baseEntry = m_entriesToCheck[0]; for(int i = 1; i < m_entriesToCheck.count(); ++i) { // skip checking against first Data::EntryPtr it = m_entriesToCheck[i]; bool match = cleanMerge(baseEntry, it); if(!match) { int score = baseEntry->collection()->sameEntry(baseEntry, it); match = score >= EntryComparison::ENTRY_GOOD_MATCH; } if(match) { bool merge_ok = Data::Document::mergeEntry(baseEntry, it, m_resolver); if(merge_ok) { m_entriesToRemove.append(it); m_entriesLeft.removeAll(it); } } } m_entriesToCheck.removeAll(baseEntry); if(m_cancelled || m_entriesToCheck.count() < 2) { QTimer::singleShot(0, this, SLOT(slotCleanup())); } else { QTimer::singleShot(0, this, SLOT(slotStartNext())); } }
FetchResult::FetchResult(Fetcher::Ptr fetcher_, Data::EntryPtr entry_) : uid(KRandom::random()) , fetcher(fetcher_) , title(entry_->title()) , desc(makeDescription(entry_)) , isbn(entry_->field(QLatin1String("isbn"))) { }
foreach(Data::EntryPtr entry, entries_) { QModelIndex index = sourceModel()->indexFromEntry(entry); if(index.isValid()) { sourceModel()->setData(index, state, SaveStateRole); } else { myWarning() << "no index found for" << entry->id() << entry->title(); } }
Tellico::Fetch::FetchRequest BoardGameGeekFetcher::updateRequest(Data::EntryPtr entry_) { QString bggid = entry_->field(QLatin1String("bggid")); if(!bggid.isEmpty()) { return FetchRequest(Raw, bggid); } QString title = entry_->field(QLatin1String("title")); if(!title.isEmpty()) { return FetchRequest(Title, title); } return FetchRequest(); }
Tellico::Fetch::FetchRequest GoogleScholarFetcher::updateRequest(Data::EntryPtr entry_) { QString title = entry_->field(QLatin1String("title")); if(!title.isEmpty()) { return FetchRequest(Title, title); } return FetchRequest(); }
Tellico::Fetch::FetchRequest DBLPFetcher::updateRequest(Data::EntryPtr entry_) { QString title = entry_->field(QLatin1String("title")); if(!title.isEmpty()) { return FetchRequest(Keyword, title); } return FetchRequest(); }
QString FetchResult::makeDescription(Data::EntryPtr entry) { Q_ASSERT(entry); QString desc; switch(entry->collection()->type()) { case Data::Collection::Book: case Data::Collection::ComicBook: case Data::Collection::Bibtex: append(desc, entry, "author"); append(desc, entry, "publisher"); append(desc, entry, "cr_year") || append(desc, entry, "pub_year") || append(desc, entry, "year"); break; case Data::Collection::Video: append(desc, entry, "studio"); append(desc, entry, "director"); append(desc, entry, "year"); append(desc, entry, "medium"); break; case Data::Collection::Album: append(desc, entry, "artist"); append(desc, entry, "label"); append(desc, entry, "year"); break; case Data::Collection::Game: append(desc, entry, "platform"); append(desc, entry, "year"); break; case Data::Collection::BoardGame: append(desc, entry, "publisher"); append(desc, entry, "designer"); append(desc, entry, "year"); break; case Data::Collection::Wine: append(desc, entry, "appellation"); break; default: myDebug() << "no description for collection type =" << entry->collection()->type(); break; } return desc; }
Tellico::Data::EntryPtr Fetcher::fetchEntry(uint uid_) { QPointer<Fetcher> ptr(this); Data::EntryPtr entry = fetchEntryHook(uid_); // could be cancelled and killed after fetching entry, check ptr if(ptr && entry) { // iterate over list of possible optional fields // and if the field is not included in the user-configured list // remove the field from the entry QHashIterator<QString, QString> i(Manager::optionalFields(type())); while(i.hasNext()) { i.next(); if(!m_fields.contains(i.key())) { entry->collection()->removeField(i.key()); } } } return entry; }
Tellico::Data::EntryPtr BoardGameGeekFetcher::fetchEntryHookData(Data::EntryPtr entry_) { Q_ASSERT(entry_); const QString id = entry_->field(QLatin1String("bggid")); if(id.isEmpty()) { myDebug() << "no bgg id found"; return entry_; } KUrl u(BGG_THING_URL); u.addQueryItem(QLatin1String("id"), id); u.addQueryItem(QLatin1String("type"), QLatin1String("boardgame,boardgameexpansion")); // myDebug() << "url: " << u; // quiet QString output = FileHandler::readXMLFile(u, true); #if 0 myWarning() << "Remove output debug from boardgamegeekfetcher.cpp"; QFile f(QLatin1String("/tmp/test.xml")); if(f.open(QIODevice::WriteOnly)) { QTextStream t(&f); t.setCodec("UTF-8"); t << output; } f.close(); #endif Import::TellicoImporter imp(xsltHandler()->applyStylesheet(output)); // be quiet when loading images imp.setOptions(imp.options() ^ Import::ImportShowImageErrors); Data::CollPtr coll = imp.collection(); // getTracks(entry); if(!coll) { myWarning() << "no collection pointer"; return entry_; } if(coll->entryCount() == 0) { myWarning() << "no entries"; return entry_; } if(coll->entryCount() > 1) { myDebug() << "weird, more than one entry found"; } // don't want to include id coll->removeField(QLatin1String("bggid")); return coll->entries().front(); }
int Tellico::FieldComparison::compare(Data::EntryPtr entry1_, Data::EntryPtr entry2_) { return compare(entry1_->formattedField(m_field), entry2_->formattedField(m_field)); }