From a743cdaa127bec102cdc0bbcf9afca33ecb21813 Mon Sep 17 00:00:00 2001 From: Andre Meyering Date: Fri, 9 Aug 2024 18:10:11 +0200 Subject: [PATCH] fix(UI): Fix TheTvDbImages language configuration Follow up to 68ea08ddf2e0d4d7bddc8a4ca0a12f0be79b9ff1 --- MediaElch.pro | 4 + src/scrapers/image/CMakeLists.txt | 1 + src/scrapers/image/TheTvDbImages.cpp | 29 +------ .../image/TheTvDbImagesConfiguration.cpp | 75 +++++++++++++++++++ .../image/TheTvDbImagesConfiguration.h | 34 +++++++++ src/ui/image/ImageDialog.cpp | 12 ++- src/ui/scrapers/CMakeLists.txt | 1 + src/ui/scrapers/ScraperManager.cpp | 7 +- .../image/TheTvDbImagesConfigurationView.cpp | 35 +++++++++ .../image/TheTvDbImagesConfigurationView.h | 25 +++++++ 10 files changed, 192 insertions(+), 31 deletions(-) create mode 100644 src/scrapers/image/TheTvDbImagesConfiguration.cpp create mode 100644 src/scrapers/image/TheTvDbImagesConfiguration.h create mode 100644 src/ui/scrapers/image/TheTvDbImagesConfigurationView.cpp create mode 100644 src/ui/scrapers/image/TheTvDbImagesConfigurationView.h diff --git a/MediaElch.pro b/MediaElch.pro index f77b44125e..e0597c6a2d 100644 --- a/MediaElch.pro +++ b/MediaElch.pro @@ -254,6 +254,7 @@ SOURCES += \ src/scrapers/concert/tmdb/TmdbConcert.cpp \ src/scrapers/concert/tmdb/TmdbConcertSearchJob.cpp \ src/scrapers/image/FanartTvConfiguration.cpp \ + src/scrapers/image/TheTvDbImagesConfiguration.cpp \ src/scrapers/image/FanartTv.cpp \ src/scrapers/image/FanartTvMusicArtists.cpp \ src/scrapers/image/FanartTvMusic.cpp \ @@ -427,6 +428,7 @@ SOURCES += \ src/ui/renamer/RenamerPlaceholders.cpp \ src/ui/scrapers/concert/TmdbConcertConfigurationView.cpp \ src/ui/scrapers/image/FanartTvConfigurationView.cpp \ + src/ui/scrapers/image/TheTvDbImagesConfigurationView.cpp \ src/ui/scrapers/movie/AebnConfigurationView.cpp \ src/ui/scrapers/movie/ImdbMovieConfigurationView.cpp \ src/ui/scrapers/movie/TmdbMovieConfigurationView.cpp \ @@ -642,6 +644,7 @@ HEADERS += Version.h \ src/scrapers/concert/tmdb/TmdbConcert.h \ src/scrapers/concert/tmdb/TmdbConcertSearchJob.h \ src/scrapers/image/FanartTvConfiguration.h \ + src/scrapers/image/TheTvDbImagesConfiguration.h \ src/scrapers/image/FanartTv.h \ src/scrapers/image/FanartTvMusicArtists.h \ src/scrapers/image/FanartTvMusic.h \ @@ -817,6 +820,7 @@ HEADERS += Version.h \ src/ui/renamer/RenamerPlaceholders.h \ src/ui/scrapers/concert/TmdbConcertConfigurationView.h \ src/ui/scrapers/image/FanartTvConfigurationView.h \ + src/ui/scrapers/image/TheTvDbImagesConfigurationView.h \ src/ui/scrapers/movie/AebnConfigurationView.h \ src/ui/scrapers/movie/ImdbMovieConfigurationView.h \ src/ui/scrapers/movie/TmdbMovieConfigurationView.h \ diff --git a/src/scrapers/image/CMakeLists.txt b/src/scrapers/image/CMakeLists.txt index caaa9c159e..8b44f43407 100644 --- a/src/scrapers/image/CMakeLists.txt +++ b/src/scrapers/image/CMakeLists.txt @@ -7,6 +7,7 @@ add_library( TheTvDbImages.cpp TmdbImages.cpp FanartTvConfiguration.cpp + TheTvDbImagesConfiguration.cpp ) target_link_libraries( diff --git a/src/scrapers/image/TheTvDbImages.cpp b/src/scrapers/image/TheTvDbImages.cpp index f26b7238ff..eb22a279dc 100644 --- a/src/scrapers/image/TheTvDbImages.cpp +++ b/src/scrapers/image/TheTvDbImages.cpp @@ -1,11 +1,11 @@ #include "TheTvDbImages.h" +#include "TheTvDbImagesConfiguration.h" #include "data/tv_show/TvShow.h" #include "data/tv_show/TvShowEpisode.h" #include "globals/Manager.h" #include "scrapers/tv_show/ShowMerger.h" #include "scrapers/tv_show/thetvdb/TheTvDb.h" -#include "settings/Settings.h" namespace mediaelch { namespace scraper { @@ -32,31 +32,8 @@ TheTvDbImages::TheTvDbImages(QObject* parent) : ImageProvider(parent) ImageType::TvShowEpisodeThumb, ImageType::TvShowSeasonBanner, ImageType::TvShowSeasonBackdrop}; - m_meta.supportedLanguages = {"bg", - "zh", - "hr", - "cs", - "da", - "nl", - "en", - "fi", - "fr", - "de", - "el", - "he", - "hu", - "it", - "ja", - "ko", - "no", - "pl", - "pt", - "ru", - "sl", - "es", - "sv", - "tr"}; - m_meta.defaultLocale = Locale("en"); + m_meta.supportedLanguages = TheTvDbImagesConfiguration::supportedLanguages(); + m_meta.defaultLocale = TheTvDbImagesConfiguration::defaultLocale(); m_dummyShow = new TvShow(mediaelch::DirectoryPath(), this); m_dummyEpisode = new TvShowEpisode(QStringList(), m_dummyShow); diff --git a/src/scrapers/image/TheTvDbImagesConfiguration.cpp b/src/scrapers/image/TheTvDbImagesConfiguration.cpp new file mode 100644 index 0000000000..1b9d1be7f7 --- /dev/null +++ b/src/scrapers/image/TheTvDbImagesConfiguration.cpp @@ -0,0 +1,75 @@ +#include "scrapers/image/TheTvDbImagesConfiguration.h" + +#include "scrapers/image/TheTvDbImages.h" + +namespace { + +static constexpr char moduleName[] = "scrapers"; +static const Settings::Key KEY_SCRAPERS_LANGUAGE(moduleName, "Scrapers/images.thetvdb/Language"); + +} // namespace + + +namespace mediaelch { +namespace scraper { + +TheTvDbImagesConfiguration::TheTvDbImagesConfiguration(Settings& settings) : + ScraperConfiguration(QString(TheTvDbImages::ID), settings) +{ + settings.onSettingChanged(KEY_SCRAPERS_LANGUAGE, this, [this]() { emit languageChanged(language()); }); +} + +void TheTvDbImagesConfiguration::init() +{ + settings().setDefaultValue(KEY_SCRAPERS_LANGUAGE, defaultLocale().toString()); +} + +mediaelch::Locale TheTvDbImagesConfiguration::defaultLocale() +{ + return {"en"}; +} + +QVector TheTvDbImagesConfiguration::supportedLanguages() +{ + // Multiple languages, but no way to query for it and also no official list of languages. + return QVector({ + "bg", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "fi", + "fr", + "de", + "el", + "he", + "hu", + "it", + "ja", + "ko", + "no", + "pl", + "pt", + "ru", + "sl", + "es", + "sv", + "tr", + }); +} + +Locale TheTvDbImagesConfiguration::language() +{ + return settings().value(KEY_SCRAPERS_LANGUAGE).toString(); +} + +void TheTvDbImagesConfiguration::setLanguage(const Locale& value) +{ + settings().setValue(KEY_SCRAPERS_LANGUAGE, value.toString()); +} + + +} // namespace scraper +} // namespace mediaelch diff --git a/src/scrapers/image/TheTvDbImagesConfiguration.h b/src/scrapers/image/TheTvDbImagesConfiguration.h new file mode 100644 index 0000000000..b328039902 --- /dev/null +++ b/src/scrapers/image/TheTvDbImagesConfiguration.h @@ -0,0 +1,34 @@ +#pragma once + +#include "data/Locale.h" +#include "scrapers/ScraperConfiguration.h" +#include "settings/Settings.h" +#include "utils/Meta.h" + +#include + +namespace mediaelch { +namespace scraper { + +class TheTvDbImagesConfiguration : public QObject, public ScraperConfiguration +{ + Q_OBJECT +public: + explicit TheTvDbImagesConfiguration(Settings& settings); + ~TheTvDbImagesConfiguration() override = default; + + void init() override; + + ELCH_NODISCARD static mediaelch::Locale defaultLocale(); + ELCH_NODISCARD static QVector supportedLanguages(); + +signals: + void languageChanged(Locale language); + +public: + ELCH_NODISCARD Locale language() override; + void setLanguage(const Locale& value) override; +}; + +} // namespace scraper +} // namespace mediaelch diff --git a/src/ui/image/ImageDialog.cpp b/src/ui/image/ImageDialog.cpp index 9fb9d658e3..34cbda7d65 100644 --- a/src/ui/image/ImageDialog.cpp +++ b/src/ui/image/ImageDialog.cpp @@ -7,7 +7,6 @@ #include "data/music/Artist.h" #include "data/tv_show/TvShow.h" #include "data/tv_show/TvShowEpisode.h" -#include "globals/Helper.h" #include "globals/Manager.h" #include "log/Log.h" #include "media/NameFormatter.h" @@ -18,7 +17,6 @@ #include #include -#include #include #include #include @@ -672,8 +670,14 @@ void ImageDialog::onProviderChanged(int index) mediaelch::ScraperConfiguration* providerSettings = Manager::instance()->scrapers().imageProviderConfig(provider->meta().identifier); MediaElch_Assert(providerSettings != nullptr); - ui->comboLanguage->setupLanguages(provider->meta().supportedLanguages, providerSettings->language()); - ui->comboLanguage->setEnabled(true); + if (providerSettings->language() == mediaelch::Locale::NoLocale) { + // can happen if there is a mismatch between configuration class and "supportedLanguages". + ui->comboLanguage->setInvalid(); + ui->comboLanguage->setEnabled(false); + } else { + ui->comboLanguage->setupLanguages(provider->meta().supportedLanguages, providerSettings->language()); + ui->comboLanguage->setEnabled(true); + } } if (isDefaultProvider) { diff --git a/src/ui/scrapers/CMakeLists.txt b/src/ui/scrapers/CMakeLists.txt index 1205566b48..499381b735 100644 --- a/src/ui/scrapers/CMakeLists.txt +++ b/src/ui/scrapers/CMakeLists.txt @@ -12,6 +12,7 @@ add_library( music/UniversalMusicConfigurationView.cpp concert/TmdbConcertConfigurationView.cpp image/FanartTvConfigurationView.cpp + image/TheTvDbImagesConfigurationView.cpp ) target_link_libraries( diff --git a/src/ui/scrapers/ScraperManager.cpp b/src/ui/scrapers/ScraperManager.cpp index d2ea7108fe..10a1a86fe1 100644 --- a/src/ui/scrapers/ScraperManager.cpp +++ b/src/ui/scrapers/ScraperManager.cpp @@ -10,6 +10,7 @@ #include "scrapers/image/FanartTvMusic.h" #include "scrapers/image/FanartTvMusicArtists.h" #include "scrapers/image/TheTvDbImages.h" +#include "scrapers/image/TheTvDbImagesConfiguration.h" #include "scrapers/image/TmdbImages.h" #include "scrapers/movie/MovieScraper.h" #include "scrapers/movie/adultdvdempire/AdultDvdEmpire.h" @@ -37,6 +38,7 @@ #include "settings/Settings.h" #include "ui/scrapers/concert/TmdbConcertConfigurationView.h" #include "ui/scrapers/image/FanartTvConfigurationView.h" +#include "ui/scrapers/image/TheTvDbImagesConfigurationView.h" #include "ui/scrapers/movie/AebnConfigurationView.h" #include "ui/scrapers/movie/ImdbMovieConfigurationView.h" #include "ui/scrapers/movie/TmdbMovieConfigurationView.h" @@ -456,9 +458,12 @@ void ScraperManager::initImageProviders() } { ManagedImageProvider provider; - auto providerConfig = std::make_unique(TheTvDbImages::ID, m_settings); + auto providerConfig = std::make_unique(m_settings); providerConfig->init(); provider.m_scraper = std::make_unique(nullptr); + provider.m_viewFactory = [config = providerConfig.get()]() { + return new TheTvDbImagesConfigurationView(*config); + }; provider.m_config = std::move(providerConfig); m_imageProviders.push_back(std::move(provider)); diff --git a/src/ui/scrapers/image/TheTvDbImagesConfigurationView.cpp b/src/ui/scrapers/image/TheTvDbImagesConfigurationView.cpp new file mode 100644 index 0000000000..b24b255a69 --- /dev/null +++ b/src/ui/scrapers/image/TheTvDbImagesConfigurationView.cpp @@ -0,0 +1,35 @@ +#include "ui/scrapers/image/TheTvDbImagesConfigurationView.h" + +#include +#include + +namespace mediaelch { +namespace scraper { + + +TheTvDbImagesConfigurationView::TheTvDbImagesConfigurationView(TheTvDbImagesConfiguration& settings) : + m_settings(settings) +{ + m_languageBox = new LanguageCombo(this); + m_languageBox->setupLanguages(m_settings.supportedLanguages(), m_settings.language()); + + auto* layout = new QGridLayout(this); + layout->addWidget(new QLabel(tr("Language")), 0, 0); + layout->addWidget(m_languageBox, 0, 1); + layout->setColumnStretch(2, 1); + layout->setContentsMargins(12, 0, 12, 12); + + + connect(m_languageBox, &LanguageCombo::languageChanged, this, [this]() { + m_settings.setLanguage(m_languageBox->currentLocale()); + }); + connect(&m_settings, &TheTvDbImagesConfiguration::languageChanged, this, [this](Locale language) { + const bool blocked = m_languageBox->blockSignals(true); // avoid triggering save-logic or infinite loop + m_languageBox->setLanguage(language); + m_languageBox->blockSignals(blocked); + }); +} + + +} // namespace scraper +} // namespace mediaelch diff --git a/src/ui/scrapers/image/TheTvDbImagesConfigurationView.h b/src/ui/scrapers/image/TheTvDbImagesConfigurationView.h new file mode 100644 index 0000000000..09004b5081 --- /dev/null +++ b/src/ui/scrapers/image/TheTvDbImagesConfigurationView.h @@ -0,0 +1,25 @@ +#pragma once + +#include "scrapers/image/TheTvDbImagesConfiguration.h" +#include "ui/small_widgets/LanguageCombo.h" + +#include + +namespace mediaelch { +namespace scraper { + +class TheTvDbImagesConfigurationView : public QWidget +{ + Q_OBJECT + +public: + explicit TheTvDbImagesConfigurationView(TheTvDbImagesConfiguration& settings); + ~TheTvDbImagesConfigurationView() override = default; + +private: + TheTvDbImagesConfiguration& m_settings; + LanguageCombo* m_languageBox{nullptr}; +}; + +} // namespace scraper +} // namespace mediaelch