Skip to content

Commit

Permalink
[MovieScraper] Move to job-based movie loading
Browse files Browse the repository at this point in the history
Just like for TV scrapers
  • Loading branch information
bugwelle committed Jul 21, 2022
1 parent 9747fd9 commit ee18a68
Show file tree
Hide file tree
Showing 70 changed files with 2,611 additions and 2,181 deletions.
20 changes: 18 additions & 2 deletions MediaElch.pro
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ SOURCES += src/main.cpp \
src/scrapers/music/MusicBrainz.cpp \
src/scrapers/music/TheAudioDb.cpp \
src/scrapers/movie/MovieSearchJob.cpp \
src/scrapers/movie/MovieScrapeJob.cpp \
src/ui/concerts/ConcertFilesWidget.cpp \
src/ui/concerts/ConcertSearch.cpp \
src/ui/concerts/ConcertSearchWidget.cpp \
Expand Down Expand Up @@ -287,25 +288,32 @@ SOURCES += src/main.cpp \
src/scrapers/concert/ConcertSearchJob.cpp \
src/scrapers/concert/tmdb/TmdbConcert.cpp \
src/scrapers/concert/tmdb/TmdbConcertSearchJob.cpp \
src/scrapers/movie/MovieMerger.cpp \
src/scrapers/movie/adultdvdempire/AdultDvdEmpire.cpp \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireSearchJob.cpp \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireScrapeJob.cpp \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireApi.cpp \
src/scrapers/movie/aebn/AEBN.cpp \
src/scrapers/movie/aebn/AebnSearchJob.cpp \
src/scrapers/movie/aebn/AebnScrapeJob.cpp \
src/scrapers/movie/aebn/AebnApi.cpp \
src/scrapers/movie/custom/CustomMovieScraper.cpp \
src/scrapers/movie/custom/CustomMovieScrapeJob.cpp \
src/scrapers/movie/hotmovies/HotMovies.cpp \
src/scrapers/movie/hotmovies/HotMoviesSearchJob.cpp \
src/scrapers/movie/hotmovies/HotMoviesScrapeJob.cpp \
src/scrapers/movie/hotmovies/HotMoviesApi.cpp \
src/scrapers/movie/imdb/ImdbMovie.cpp \
src/scrapers/movie/imdb/ImdbMovieSearchJob.cpp \
src/scrapers/movie/imdb/ImdbMovieScraper.cpp \
src/scrapers/movie/imdb/ImdbMovieScrapeJob.cpp \
src/scrapers/movie/MovieScraper.cpp \
src/scrapers/music/MusicScraper.cpp \
src/scrapers/movie/tmdb/TmdbMovie.cpp \
src/scrapers/movie/tmdb/TmdbMovieSearchJob.cpp \
src/scrapers/movie/tmdb/TmdbMovieScrapeJob.cpp \
src/scrapers/movie/videobuster/VideoBuster.cpp \
src/scrapers/movie/videobuster/VideoBusterSearchJob.cpp \
src/scrapers/movie/videobuster/VideoBusterScrapeJob.cpp \
src/scrapers/movie/videobuster/VideoBusterApi.cpp \
src/scrapers/music/TvTunes.cpp \
src/scrapers/music/UniversalMusicScraper.cpp \
Expand Down Expand Up @@ -476,7 +484,9 @@ HEADERS += Version.h \
src/scrapers/music/Discogs.h \
src/scrapers/music/MusicBrainz.h \
src/scrapers/music/TheAudioDb.h \
src/scrapers/movie/MovieMerger.h \
src/scrapers/movie/MovieSearchJob.h \
src/scrapers/movie/MovieScrapeJob.h \
src/ui/concerts/ConcertFilesWidget.h \
src/ui/concerts/ConcertSearch.h \
src/ui/concerts/ConcertSearchWidget.h \
Expand Down Expand Up @@ -632,21 +642,27 @@ HEADERS += Version.h \
src/scrapers/concert/tmdb/TmdbConcertSearchJob.h \
src/scrapers/movie/adultdvdempire/AdultDvdEmpire.h \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireSearchJob.h \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireScrapeJob.h \
src/scrapers/movie/adultdvdempire/AdultDvdEmpireApi.h \
src/scrapers/movie/aebn/AEBN.h \
src/scrapers/movie/aebn/AebnSearchJob.h \
src/scrapers/movie/aebn/AebnScrapeJob.h \
src/scrapers/movie/aebn/AebnApi.h \
src/scrapers/movie/custom/CustomMovieScraper.h \
src/scrapers/movie/custom/CustomMovieScrapeJob.h \
src/scrapers/movie/hotmovies/HotMovies.h \
src/scrapers/movie/hotmovies/HotMoviesSearchJob.h \
src/scrapers/movie/hotmovies/HotMoviesScrapeJob.h \
src/scrapers/movie/hotmovies/HotMoviesApi.h \
src/scrapers/movie/imdb/ImdbMovie.h \
src/scrapers/movie/imdb/ImdbMovieSearchJob.h \
src/scrapers/movie/imdb/ImdbMovieScraper.h \
src/scrapers/movie/imdb/ImdbMovieScrapeJob.h \
src/scrapers/movie/tmdb/TmdbMovie.h \
src/scrapers/movie/tmdb/TmdbMovieSearchJob.h \
src/scrapers/movie/tmdb/TmdbMovieScrapeJob.h \
src/scrapers/movie/videobuster/VideoBuster.h \
src/scrapers/movie/videobuster/VideoBusterSearchJob.h \
src/scrapers/movie/videobuster/VideoBusterScrapeJob.h \
src/scrapers/movie/videobuster/VideoBusterApi.h \
src/scrapers/music/TvTunes.h \
src/scrapers/music/UniversalMusicScraper.h \
Expand Down
2 changes: 1 addition & 1 deletion src/imports/DownloadFileSearcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ bool DownloadFileSearcher::isPackage(const QFileInfo& file) const
return true;
}

QRegularExpression rx("r[0-9]*");
static QRegularExpression rx("r[0-9]*");
return rx.match(file.suffix()).hasMatch();
}

Expand Down
87 changes: 48 additions & 39 deletions src/movies/MovieController.cpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
#include "MovieController.h"

#include <QDir>
#include <QFileInfo>
#include <QRegularExpression>
#include <QtCore/qmath.h>
#include <chrono>

#include "data/ImageCache.h"
#include "file/NameFormatter.h"
#include "globals/DownloadManager.h"
#include "globals/Helper.h"
#include "globals/Manager.h"
#include "media_centers/MediaCenterInterface.h"
#include "movies/Movie.h"
#include "scrapers/movie/MovieMerger.h"
#include "scrapers/movie/MovieScrapeJob.h"
#include "scrapers/movie/MovieScraper.h"
#include "scrapers/movie/custom/CustomMovieScraper.h"
#include "scrapers/movie/imdb/ImdbMovie.h"
Expand All @@ -21,6 +17,12 @@
// TODO: Remove UI dependency
#include "ui/notifications/NotificationBox.h"

#include <QDir>
#include <QFileInfo>
#include <QRegularExpression>
#include <QtCore/qmath.h>
#include <chrono>

MovieController::MovieController(Movie* parent) :
QObject(parent),
m_movie{parent},
Expand Down Expand Up @@ -144,29 +146,50 @@ bool MovieController::loadData(MediaCenterInterface* mediaCenterInterface, bool
}

void MovieController::loadData(QHash<mediaelch::scraper::MovieScraper*, mediaelch::scraper::MovieIdentifier> ids,
mediaelch::scraper::MovieScraper* scraperInterface,
QSet<MovieScraperInfo> infos)
const mediaelch::Locale& locale,
const QSet<MovieScraperInfo>& details)
{
if (ids.isEmpty()) {
return;
}
using namespace mediaelch::scraper;

emit sigLoadStarted(m_movie);

const auto scraper = scraperInterface->meta().identifier;
const auto firstId = ids.constBegin()->str();
const bool isImdbId = ImdbId::isValidFormat(firstId);
m_infosToLoad = details;

m_infosToLoad = infos;
MovieScraper* scraper = nullptr;
if (ids.size() > 1) {
scraper = CustomMovieScraper::instance();
CustomMovieScraper::instance()->setSearchIds(ids);
} else {
scraper = ids.constBegin().key();
}

const MovieIdentifier id = ids.constBegin().value();

mediaelch::scraper::MovieScrapeJob::Config config;
config.details = details;
config.locale = locale;
config.identifier = id;

if (scraper == mediaelch::scraper::TmdbMovie::ID && !isImdbId) {
m_movie->setTmdbId(TmdbId(firstId));
const auto scraperId = scraper->meta().identifier;
const bool isImdbId = ImdbId::isValidFormat(id.str());

} else if (scraper == mediaelch::scraper::ImdbMovie::ID
|| (scraper == mediaelch::scraper::TmdbMovie::ID && isImdbId)) {
m_movie->setImdbId(ImdbId(firstId));
if (scraperId == mediaelch::scraper::TmdbMovie::ID && !isImdbId) {
m_movie->setTmdbId(TmdbId(id.str()));

} else if (scraperId == mediaelch::scraper::ImdbMovie::ID
|| (scraperId == mediaelch::scraper::TmdbMovie::ID && isImdbId)) {
m_movie->setImdbId(ImdbId(id.str()));
}
scraperInterface->loadData(ids, m_movie, infos);

auto* scrapeJob = scraper->loadMovie(config);
connect(scrapeJob,
&mediaelch::scraper::MovieScrapeJob::loadFinished,
this,
[this, scraper](mediaelch::scraper::MovieScrapeJob* job) { //
mediaelch::scraper::copyDetailsToMovie(*m_movie, job->movie(), job->config().details);
scraperLoadDone(scraper, job);
});
scrapeJob->start();
}

bool MovieController::loadStreamDetailsFromFile()
Expand Down Expand Up @@ -196,14 +219,15 @@ void MovieController::setInfosToLoad(QSet<MovieScraperInfo> infos)
m_infosToLoad = std::move(infos);
}

void MovieController::scraperLoadDone(mediaelch::scraper::MovieScraper* scraper, mediaelch::ScraperError error)
void MovieController::scraperLoadDone(mediaelch::scraper::MovieScraper* scraper,
mediaelch::scraper::MovieScrapeJob* job)
{
using namespace std::chrono_literals;

if (error.hasError() && !error.is404()) {
if (job->hasError() && !job->scraperError().is404()) {
// TODO: 404 not necessary but avoids false positives at the moment.
// TODO: Remove UI dependency
NotificationBox::instance()->showError(error.message, 6s);
NotificationBox::instance()->showError(job->errorString(), 6s);
}

if (!property("customMovieScraperLoads").isNull() && property("customMovieScraperLoads").toInt() > 1) {
Expand Down Expand Up @@ -442,21 +466,6 @@ void MovieController::abortDownloads()
emit sigLoadDone(m_movie);
}

void MovieController::setLoadsLeft(QVector<ScraperData> loadsLeft)
{
m_loadDoneFired = false;
m_loadsLeft = loadsLeft;
}

void MovieController::removeFromLoadsLeft(ScraperData load)
{
m_loadsLeft.removeOne(load);
if (m_loadsLeft.isEmpty() && !m_loadDoneFired) {
m_loadDoneFired = true;
scraperLoadDone(Manager::instance()->scrapers().movieScraper(mediaelch::scraper::TmdbMovie::ID), {});
}
}

void MovieController::setForceFanartBackdrop(const bool& force)
{
m_forceFanartBackdrop = force;
Expand Down
17 changes: 7 additions & 10 deletions src/movies/MovieController.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "data/Locale.h"
#include "globals/DownloadManagerElement.h"
#include "globals/Poster.h"
#include "globals/ScraperInfos.h"
Expand All @@ -17,7 +18,8 @@ class Movie;
namespace mediaelch {
namespace scraper {
class MovieScraper;
}
class MovieScrapeJob;
} // namespace scraper
} // namespace mediaelch

class MovieController : public QObject
Expand All @@ -37,19 +39,16 @@ class MovieController : public QObject
/// \return Loading was successful or not
bool loadData(MediaCenterInterface* mediaCenterInterface, bool force = false, bool reloadFromNfo = true);

/// \brief Loads the movies info from a scraper
/// \param ids Id of the movie within the given ScraperInterface
/// \param scraperInterface ScraperInterface to use for loading
/// \param infos List of infos to load
/// \brief Loads the movies info from a scraper. If ids has more than one entry, the custom movie scraper is used.
void loadData(QHash<mediaelch::scraper::MovieScraper*, mediaelch::scraper::MovieIdentifier> ids,
mediaelch::scraper::MovieScraper* scraperInterface,
QSet<MovieScraperInfo> infos);
const mediaelch::Locale& locale,
const QSet<MovieScraperInfo>& details);

ELCH_NODISCARD bool loadStreamDetailsFromFile();

/// \brief Called when a ScraperInterface has finished loading
/// Emits the loaded signal
void scraperLoadDone(mediaelch::scraper::MovieScraper* scraper, mediaelch::ScraperError error);
void scraperLoadDone(mediaelch::scraper::MovieScraper* scraper, mediaelch::scraper::MovieScrapeJob* scrapeJob);

QSet<MovieScraperInfo> infosToLoad();

Expand All @@ -64,8 +63,6 @@ class MovieController : public QObject
void loadImage(ImageType type, QUrl url);
void loadImages(ImageType type, QVector<QUrl> urls);
void abortDownloads();
void setLoadsLeft(QVector<ScraperData> loadsLeft);
void removeFromLoadsLeft(ScraperData load);
void setInfosToLoad(QSet<MovieScraperInfo> infos);
void setForceFanartBackdrop(const bool& force);
void setForceFanartPoster(const bool& force);
Expand Down
6 changes: 3 additions & 3 deletions src/movies/MovieImages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,16 +189,16 @@ QVector<ExtraFanart> MovieImages::extraFanarts(MediaCenterInterface* mediaCenter
if (m_extraFanarts.isEmpty()) {
m_extraFanarts = mediaCenterInterface->extraFanartNames(&m_movie);
}
for (const QString& file : m_extraFanartsToRemove) {
for (const QString& file : asConst(m_extraFanartsToRemove)) {
m_extraFanarts.removeOne(file);
}
QVector<ExtraFanart> fanarts;
for (const QString& file : m_extraFanarts) {
for (const QString& file : asConst(m_extraFanarts)) {
ExtraFanart f;
f.path = file;
fanarts.append(f);
}
for (const QByteArray& img : m_extraFanartToAdd) {
for (const QByteArray& img : asConst(m_extraFanartToAdd)) {
ExtraFanart f;
f.image = img;
fanarts.append(f);
Expand Down
2 changes: 2 additions & 0 deletions src/scrapers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ add_library(
concert/tmdb/TmdbConcert.cpp
concert/tmdb/TmdbConcertSearchJob.cpp
movie/MovieIdentifier.cpp
movie/MovieMerger.cpp
movie/MovieScraper.cpp
movie/MovieSearchJob.cpp
movie/MovieScrapeJob.cpp
music/TvTunes.cpp
music/AllMusic.cpp
music/UniversalMusicScraper.cpp
Expand Down

0 comments on commit ee18a68

Please sign in to comment.