void LookerUpper::customEvent(QEvent *levent) { if (levent->type() == MetadataFactoryMultiResult::kEventType) { MetadataFactoryMultiResult *mfmr = dynamic_cast<MetadataFactoryMultiResult*>(levent); if (!mfmr) return; MetadataLookupList list = mfmr->results; if (list.count() > 1) { int yearindex = -1; for (int p = 0; p != list.size(); ++p) { ProgramInfo *pginfo = list[p]->GetData().value<ProgramInfo *>(); if (pginfo && !pginfo->GetSeriesID().isEmpty() && pginfo->GetSeriesID() == (list[p])->GetTMSref()) { MetadataLookup *lookup = list[p]; if (lookup->GetSubtype() != kProbableGenericTelevision) pginfo->SaveSeasonEpisode(lookup->GetSeason(), lookup->GetEpisode()); pginfo->SaveInetRef(lookup->GetInetref()); m_busyRecList.removeAll(pginfo); return; } else if (pginfo && pginfo->GetYearOfInitialRelease() != 0 && (list[p])->GetYear() != 0 && pginfo->GetYearOfInitialRelease() == (list[p])->GetYear()) { if (yearindex != -1) { LOG(VB_GENERAL, LOG_INFO, "Multiple results matched on year. No definite " "match could be found."); m_busyRecList.removeAll(pginfo); return; } else { LOG(VB_GENERAL, LOG_INFO, "Matched from multiple results based on year. "); yearindex = p; } } } if (yearindex > -1) { MetadataLookup *lookup = list[yearindex]; ProgramInfo *pginfo = lookup->GetData().value<ProgramInfo *>(); if (lookup->GetSubtype() != kProbableGenericTelevision) pginfo->SaveSeasonEpisode(lookup->GetSeason(), lookup->GetEpisode()); pginfo->SaveInetRef(lookup->GetInetref()); m_busyRecList.removeAll(pginfo); return; } LOG(VB_GENERAL, LOG_INFO, "Unable to match this title, too many possible matches. " "You may wish to manually set the season, episode, and " "inetref in the 'Watch Recordings' screen."); ProgramInfo *pginfo = list[0]->GetData().value<ProgramInfo *>(); if (pginfo) { m_busyRecList.removeAll(pginfo); } } } else if (levent->type() == MetadataFactorySingleResult::kEventType) { MetadataFactorySingleResult *mfsr = dynamic_cast<MetadataFactorySingleResult*>(levent); if (!mfsr) return; MetadataLookup *lookup = mfsr->result; if (!lookup) return; ProgramInfo *pginfo = lookup->GetData().value<ProgramInfo *>(); // This null check could hang us as this pginfo would then never be // removed if (!pginfo) return; LOG(VB_GENERAL, LOG_DEBUG, "I found the following data:"); LOG(VB_GENERAL, LOG_DEBUG, QString(" Input Title: %1").arg(pginfo->GetTitle())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Input Sub: %1").arg(pginfo->GetSubtitle())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Title: %1").arg(lookup->GetTitle())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Subtitle: %1").arg(lookup->GetSubtitle())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Season: %1").arg(lookup->GetSeason())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Episode: %1").arg(lookup->GetEpisode())); LOG(VB_GENERAL, LOG_DEBUG, QString(" Inetref: %1").arg(lookup->GetInetref())); LOG(VB_GENERAL, LOG_DEBUG, QString(" User Rating: %1").arg(lookup->GetUserRating())); if (lookup->GetSubtype() != kProbableGenericTelevision) pginfo->SaveSeasonEpisode(lookup->GetSeason(), lookup->GetEpisode()); pginfo->SaveInetRef(lookup->GetInetref()); if (m_updaterules) { RecordingRule *rule = new RecordingRule(); if (rule) { rule->LoadByProgram(pginfo); if (rule->m_inetref.isEmpty() && (rule->m_searchType == kNoSearch)) { rule->m_inetref = lookup->GetInetref(); } rule->m_season = lookup->GetSeason(); rule->m_episode = lookup->GetEpisode(); rule->Save(); delete rule; } } if (m_updateartwork) { ArtworkMap map = lookup->GetDownloads(); SetArtwork(lookup->GetInetref(), lookup->GetIsCollection() ? 0 : lookup->GetSeason(), gCoreContext->GetMasterHostName(), map); } m_busyRecList.removeAll(pginfo); } else if (levent->type() == MetadataFactoryNoResult::kEventType) { MetadataFactoryNoResult *mfnr = dynamic_cast<MetadataFactoryNoResult*>(levent); if (!mfnr) return; MetadataLookup *lookup = mfnr->result; if (!lookup) return; ProgramInfo *pginfo = lookup->GetData().value<ProgramInfo *>(); // This null check could hang us as this pginfo would then never be removed if (!pginfo) return; m_busyRecList.removeAll(pginfo); } }
void EditMetadataDialog::customEvent(QEvent *levent) { if (levent->type() == DialogCompletionEvent::kEventType) { DialogCompletionEvent *dce = (DialogCompletionEvent*)(levent); const QString resultid = dce->GetId(); if (resultid == CEID_COVERARTFILE) SetCoverArt(dce->GetResultText()); else if (resultid == CEID_BANNERFILE) SetBanner(dce->GetResultText()); else if (resultid == CEID_FANARTFILE) SetFanart(dce->GetResultText()); else if (resultid == CEID_SCREENSHOTFILE) SetScreenshot(dce->GetResultText()); else if (resultid == CEID_TRAILERFILE) SetTrailer(dce->GetResultText()); else if (resultid == CEID_NEWCATEGORY) AddCategory(dce->GetResultText()); } else if (levent->type() == MetadataLookupEvent::kEventType) { MetadataLookupEvent *lue = (MetadataLookupEvent *)levent; MetadataLookupList lul = lue->lookupList; if (lul.isEmpty()) return; // There should really only be one result here. // If not, USER ERROR! if (lul.count() == 1) { OnArtworkSearchDone(lul[0]); } else { if (m_busyPopup) { m_busyPopup->Close(); m_busyPopup = NULL; } } } else if (levent->type() == MetadataLookupFailure::kEventType) { MetadataLookupFailure *luf = (MetadataLookupFailure *)levent; MetadataLookupList lul = luf->lookupList; if (m_busyPopup) { m_busyPopup->Close(); m_busyPopup = NULL; } if (lul.size()) { MetadataLookup *lookup = lul[0]; LOG(VB_GENERAL, LOG_INFO, QString("No results found for %1 %2 %3").arg(lookup->GetTitle()) .arg(lookup->GetSeason()).arg(lookup->GetEpisode())); } } else if (levent->type() == ImageDLEvent::kEventType) { ImageDLEvent *ide = (ImageDLEvent *)levent; MetadataLookup *lookup = ide->item; if (!lookup) return; handleDownloadedImages(lookup); } else if (levent->type() == ImageDLFailureEvent::kEventType) { MythErrorNotification n(tr("Failed to retrieve image"), tr("Metadata Editor"), tr("Check logs")); GetNotificationCenter()->Queue(n); } }
void MetadataDownload::run() { RunProlog(); MetadataLookup* lookup; while ((lookup = moreWork()) != NULL) { MetadataLookupList list; // Go go gadget Metadata Lookup if (lookup->GetType() == kMetadataVideo) { if (lookup->GetSubtype() == kProbableTelevision) list = handleTelevision(lookup); else if (lookup->GetSubtype() == kProbableMovie) list = handleMovie(lookup); else list = handleVideoUndetermined(lookup); if (!list.size() && lookup->GetSubtype() == kUnknownVideo) { list = handleMovie(lookup); } } else if (lookup->GetType() == kMetadataRecording) { if (lookup->GetSubtype() == kProbableTelevision) { if (lookup->GetSeason() > 0 || lookup->GetEpisode() > 0) list = handleTelevision(lookup); else if (!lookup->GetSubtitle().isEmpty()) list = handleVideoUndetermined(lookup); if (!list.size()) list = handleRecordingGeneric(lookup); } else if (lookup->GetSubtype() == kProbableMovie) { list = handleMovie(lookup); if (lookup->GetInetref().isEmpty()) list.append(handleRecordingGeneric(lookup)); } else { list = handleRecordingGeneric(lookup); if (lookup->GetInetref().isEmpty()) list.append(handleMovie(lookup)); } } else if (lookup->GetType() == kMetadataGame) list = handleGame(lookup); // inform parent we have lookup ready for it if (m_parent && list.count() >= 1) { // If there's only one result, don't bother asking // our parent about it, just add it to the back of // the queue in kLookupData mode. if (list.count() == 1 && list.at(0)->GetStep() == kLookupSearch) { MetadataLookup *newlookup = list.takeFirst(); newlookup->SetStep(kLookupData); prependLookup(newlookup); continue; } // If we're in automatic mode, we need to make // these decisions on our own. Pass to title match. if (list.at(0)->GetAutomatic() && list.count() > 1) { if (!findBestMatch(list, lookup->GetTitle())) QCoreApplication::postEvent(m_parent, new MetadataLookupFailure(MetadataLookupList() << lookup)); continue; } LOG(VB_GENERAL, LOG_INFO, QString("Returning Metadata Results: %1 %2 %3") .arg(lookup->GetTitle()).arg(lookup->GetSeason()) .arg(lookup->GetEpisode())); QCoreApplication::postEvent(m_parent, new MetadataLookupEvent(list)); } else { list.append(lookup); QCoreApplication::postEvent(m_parent, new MetadataLookupFailure(list)); } } RunEpilog(); }
DTC::VideoLookupList* Video::LookupVideo( const QString &Title, const QString &Subtitle, const QString &Inetref, int Season, int Episode, const QString &GrabberType ) { DTC::VideoLookupList *pVideoLookups = new DTC::VideoLookupList(); MetadataLookupList list; MetadataFactory *factory = new MetadataFactory(NULL); if (factory) list = factory->SynchronousLookup(Title, Subtitle, Inetref, Season, Episode, GrabberType); if ( !list.size() ) return pVideoLookups; for( int n = 0; n < list.size(); n++ ) { DTC::VideoLookup *pVideoLookup = pVideoLookups->AddNewVideoLookup(); MetadataLookup *lookup = list[n]; if (lookup) { pVideoLookup->setTitle(lookup->GetTitle()); pVideoLookup->setSubTitle(lookup->GetSubtitle()); pVideoLookup->setSeason(lookup->GetSeason()); pVideoLookup->setEpisode(lookup->GetEpisode()); pVideoLookup->setYear(lookup->GetYear()); pVideoLookup->setTagline(lookup->GetTagline()); pVideoLookup->setDescription(lookup->GetDescription()); pVideoLookup->setCertification(lookup->GetCertification()); pVideoLookup->setInetref(lookup->GetInetref()); pVideoLookup->setHomePage(lookup->GetHomepage()); pVideoLookup->setReleaseDate(QDateTime(lookup->GetReleaseDate())); pVideoLookup->setUserRating(lookup->GetUserRating()); pVideoLookup->setLength(lookup->GetRuntime()); pVideoLookup->setLanguage(lookup->GetLanguage()); pVideoLookup->setCountries(lookup->GetCountries()); pVideoLookup->setPopularity(lookup->GetPopularity()); pVideoLookup->setBudget(lookup->GetBudget()); pVideoLookup->setRevenue(lookup->GetRevenue()); pVideoLookup->setIMDB(lookup->GetIMDB()); pVideoLookup->setTMSRef(lookup->GetTMSref()); ArtworkList coverartlist = lookup->GetArtwork(kArtworkCoverart); ArtworkList::iterator c; for (c = coverartlist.begin(); c != coverartlist.end(); ++c) { DTC::ArtworkItem *art = pVideoLookup->AddNewArtwork(); art->setType("coverart"); art->setUrl((*c).url); art->setThumbnail((*c).thumbnail); art->setWidth((*c).width); art->setHeight((*c).height); } ArtworkList fanartlist = lookup->GetArtwork(kArtworkFanart); ArtworkList::iterator f; for (f = fanartlist.begin(); f != fanartlist.end(); ++f) { DTC::ArtworkItem *art = pVideoLookup->AddNewArtwork(); art->setType("fanart"); art->setUrl((*f).url); art->setThumbnail((*f).thumbnail); art->setWidth((*f).width); art->setHeight((*f).height); } ArtworkList bannerlist = lookup->GetArtwork(kArtworkBanner); ArtworkList::iterator b; for (b = bannerlist.begin(); b != bannerlist.end(); ++b) { DTC::ArtworkItem *art = pVideoLookup->AddNewArtwork(); art->setType("banner"); art->setUrl((*b).url); art->setThumbnail((*b).thumbnail); art->setWidth((*b).width); art->setHeight((*b).height); } ArtworkList screenshotlist = lookup->GetArtwork(kArtworkScreenshot); ArtworkList::iterator s; for (s = screenshotlist.begin(); s != screenshotlist.end(); ++s) { DTC::ArtworkItem *art = pVideoLookup->AddNewArtwork(); art->setType("screenshot"); art->setUrl((*s).url); art->setThumbnail((*s).thumbnail); art->setWidth((*s).width); art->setHeight((*s).height); } delete lookup; } } pVideoLookups->setCount ( list.count() ); pVideoLookups->setAsOf ( QDateTime::currentDateTime() ); pVideoLookups->setVersion ( MYTH_BINARY_VERSION ); pVideoLookups->setProtoVer ( MYTH_PROTO_VERSION ); delete factory; return pVideoLookups; }
void LookerUpper::customEvent(QEvent *levent) { if (levent->type() == MetadataFactoryMultiResult::kEventType) { VERBOSE(VB_IMPORTANT, "Got a multiresult."); // We shouldn't get any of these. If we do, metadataFactory->Lookup // was called with the wrong arguments. } else if (levent->type() == MetadataFactorySingleResult::kEventType) { MetadataFactorySingleResult *mfsr = dynamic_cast<MetadataFactorySingleResult*>(levent); if (!mfsr) return; MetadataLookup *lookup = mfsr->result; if (!lookup) return; ProgramInfo *pginfo = qVariantValue<ProgramInfo *>(lookup->GetData()); // This null check could hang us as this pginfo would then never be removed if (!pginfo) return; VERBOSE(VB_GENERAL|VB_EXTRA, QString("I found the following data:")); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Input Title: %1").arg(pginfo->GetTitle())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Input Sub: %1").arg(pginfo->GetSubtitle())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Title: %1").arg(lookup->GetTitle())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Subtitle: %1").arg(lookup->GetSubtitle())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Season: %1").arg(lookup->GetSeason())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Episode: %1").arg(lookup->GetEpisode())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" Inetref: %1").arg(lookup->GetInetref())); VERBOSE(VB_GENERAL|VB_EXTRA, QString(" User Rating: %1").arg(lookup->GetUserRating())); pginfo->SaveSeasonEpisode(lookup->GetSeason(), lookup->GetEpisode()); pginfo->SaveInetRef(lookup->GetInetref()); m_busyRecList.removeAll(pginfo); } else if (levent->type() == MetadataFactoryNoResult::kEventType) { MetadataFactoryNoResult *mfnr = dynamic_cast<MetadataFactoryNoResult*>(levent); if (!mfnr) return; MetadataLookup *lookup = mfnr->result; if (!lookup) return; ProgramInfo *pginfo = qVariantValue<ProgramInfo *>(lookup->GetData()); // This null check could hang us as this pginfo would then never be removed if (!pginfo) return; m_busyRecList.removeAll(pginfo); } }
void MetadataDownload::run() { MetadataLookup* lookup; threadRegister("MetadataDownload"); while ((lookup = moreWork()) != NULL) { MetadataLookupList list; // Go go gadget Metadata Lookup if (lookup->GetType() == VID) { if (lookup->GetSeason() > 0 || lookup->GetEpisode() > 0) list = handleTelevision(lookup); else if (!lookup->GetSubtitle().isEmpty()) list = handleVideoUndetermined(lookup); else list = handleMovie(lookup); } // else if (lookup->GetType() == MUSIC) // list = handleMusic(lookup); else if (lookup->GetType() == GAME) list = handleGame(lookup); // inform parent we have lookup ready for it if (m_parent && list.count() >= 1) { // If there's only one result, don't bother asking // our parent about it, just add it to the back of // the queue in GETDATA mode. if (list.count() == 1 && list.at(0)->GetStep() == SEARCH) { MetadataLookup *newlookup = list.takeFirst(); newlookup->SetStep(GETDATA); prependLookup(newlookup); continue; } // If we're in automatic mode, we need to make // these decisions on our own. Pass to title match. if (list.at(0)->GetAutomatic() && list.count() > 1) { if (!findBestMatch(list, lookup->GetTitle())) QCoreApplication::postEvent(m_parent, new MetadataLookupFailure(MetadataLookupList() << lookup)); continue; } VERBOSE(VB_GENERAL, QString("Returning Metadata Results: %1 %2 %3") .arg(lookup->GetTitle()).arg(lookup->GetSeason()) .arg(lookup->GetEpisode())); QCoreApplication::postEvent(m_parent, new MetadataLookupEvent(list)); } else { list.append(lookup); QCoreApplication::postEvent(m_parent, new MetadataLookupFailure(list)); } } threadDeregister(); }