From ebc9cb24da8e5391af3a673b0ece77d42fd90e8a Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Sun, 17 Sep 2017 16:58:51 +0200 Subject: [PATCH] #115 Filter plugin by support platform --- .../PlantUml/FilterPluginsByPlatform.puml | 39 ++++++++----------- .../Filters/PlatformFilterFactory.hpp | 10 +---- .../Platform/Filters/PlatformFilters.cpp | 14 +++---- .../Platform/Filters/PlatformFilters.hpp | 17 +------- .../StreamingServiceLoader.cpp | 36 +++++++++++------ .../StreamingServiceLoader.hpp | 2 + plugins/8tracks/metadata.ini | 2 +- plugins/deezer/metadata.ini | 2 +- plugins/googleplaymusic/metadata.ini | 2 +- plugins/hearthisat/metadata.ini | 2 +- plugins/mixcloud/metadata.ini | 2 +- plugins/pocketcasts/metadata.ini | 2 +- plugins/soundcloud/metadata.ini | 2 +- plugins/spotify/metadata.ini | 2 +- plugins/tidal/metadata.ini | 2 +- plugins/tunein/metadata.ini | 2 +- plugins/youtube/metadata.ini | 2 +- .../PlatformFilters/PlatformFiltersTests.cpp | 3 +- 18 files changed, 64 insertions(+), 79 deletions(-) diff --git a/docs/developers/PlantUml/FilterPluginsByPlatform.puml b/docs/developers/PlantUml/FilterPluginsByPlatform.puml index 9340403e..ac92a45b 100644 --- a/docs/developers/PlantUml/FilterPluginsByPlatform.puml +++ b/docs/developers/PlantUml/FilterPluginsByPlatform.puml @@ -3,13 +3,9 @@ package MellowPlayer::Infrastructure { class StreamingServiceLoader { + load() - - filters_: IPlatformFilters - } - StreamingServiceLoader -right-> IPlatformFilters: filters_ - - interface IPlatformFilters { - match(QString) bool + - filters_: PlatformFilters } + StreamingServiceLoader -right-> PlatformFilters: filters_ enum Filters { All, @@ -20,8 +16,13 @@ package MellowPlayer::Infrastructure { } class FilterConverter { - QString toString(Filter); - Filter fromString(filter); + + QString toString(Filter); + + Filter fromString(filter); + - linux_ : QString + - appImage_ : QString + - windows_ : QString + - osx_ : QString + - all_ : QString } class TokenizedFilters { @@ -32,24 +33,20 @@ package MellowPlayer::Infrastructure { } TokenizedFilters ..> FilterConverter: <> - interface IPlatformFilterFactory - class PlatformFilterFactory { + Create(Filter filter): unique_ptr } - IPlatformFilterFactory <|-- PlatformFilterFactory - PlatformFilterFactory ..> IPlatformFilter: <> + PlatformFilterFactory .left.> IPlatformFilter: <> class PlatformFilters { + match(QString): bool -- - - filterFactory_: IPlatformFilterFactory + - filterFactory_: PlatformFilterFactory } - IPlatformFilters <|-- PlatformFilters - PlatformFilters .left.> TokenizedFilters : <> - PlatformFilters -right-> IPlatformFilterFactory + PlatformFilters ..> TokenizedFilters : <> + PlatformFilters ..> PlatformFilterFactory : <> - PlatformFilters .left.> IPlatformFilter: <> + PlatformFilters ..> IPlatformFilter: <> interface IPlatformFilter { match(): bool @@ -60,35 +57,31 @@ package MellowPlayer::Infrastructure { } IPlatformFilter <|-- AllFilter note top - Always return true + Always returns true end note class LinuxFilterBase { # isAppImage_ + {abstract} match(): bool } - IPlatformFilter <|-right- LinuxFilterBase + IPlatformFilter <|-- LinuxFilterBase class LinuxFilter { - # isAppImage_ + match(): bool } LinuxFilterBase <|-- LinuxFilter class AppImageFilter { - # isAppImage_ + match(): bool } LinuxFilterBase <|-- AppImageFilter class OsxFilter { - - isOsx_: bool + match(): bool } IPlatformFilter <|-- OsxFilter class WindowsFilter { - - isWindows_: bool + match(): bool } IPlatformFilter <|-- WindowsFilter diff --git a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilterFactory.hpp b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilterFactory.hpp index e0d121e3..f1709b9a 100644 --- a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilterFactory.hpp +++ b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilterFactory.hpp @@ -6,15 +6,9 @@ namespace MellowPlayer::Infrastructure { class IPlatformFilter; - class IPlatformFilterFactory + class PlatformFilterFactory { public: - virtual std::unique_ptr create(Filter filter) const = 0; - }; - - class PlatformFilterFactory: public IPlatformFilterFactory - { - public: - std::unique_ptr create(Filter filter) const override; + std::unique_ptr create(Filter filter) const; }; } diff --git a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.cpp b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.cpp index 35cb07e4..308da3c0 100644 --- a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.cpp +++ b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.cpp @@ -5,19 +5,17 @@ using namespace MellowPlayer::Infrastructure; -PlatformFilters::PlatformFilters(IPlatformFilterFactory& filterFactory): filtersFactory_(filterFactory) -{ - -} - bool PlatformFilters::match(const QString& filtersString) const { - for(auto filter: TokenizedFilters(filtersString)) { - auto platformFilter = filtersFactory_.create(filter); + PlatformFilterFactory filtersFactory; + TokenizedFilters filters(filtersString); + + for(auto filter: filters) { + auto platformFilter = filtersFactory.create(filter); if (platformFilter->match()) return true; } - + return false; } diff --git a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.hpp b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.hpp index 49a411d6..01d947fb 100644 --- a/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.hpp +++ b/lib/MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.hpp @@ -4,22 +4,9 @@ namespace MellowPlayer::Infrastructure { - class IPlatformFilterFactory; - - class IPlatformFilters - { - public: - virtual ~IPlatformFilters() = default; - virtual bool match(const QString& filters) const = 0; - }; - - class PlatformFilters: public IPlatformFilters + class PlatformFilters { public: - explicit PlatformFilters(IPlatformFilterFactory& filterFactory); - bool match(const QString& filters) const override; - - private: - IPlatformFilterFactory& filtersFactory_; + bool match(const QString& filters) const; }; } diff --git a/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.cpp b/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.cpp index defcda97..96348740 100644 --- a/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.cpp +++ b/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.cpp @@ -73,16 +73,21 @@ StreamingServiceMetadata StreamingServiceLoader::readMetadata(const QString& fil { QSettings meta(filePath, QSettings::IniFormat); - StreamingServiceMetadata serviceMetadata; - serviceMetadata.author = meta.value("author").toString(); - serviceMetadata.authorWebsite = meta.value("author_website").toString(); - serviceMetadata.logoPath = QFileInfo(QFileInfo(filePath).dir(), meta.value("icon").toString()).absoluteFilePath(); - serviceMetadata.name = meta.value("name").toString(); - serviceMetadata.requireProprietaryCodecs = meta.value("require_proprietary_codecs").toBool(); - serviceMetadata.url = meta.value("url").toString(); - serviceMetadata.version = meta.value("version").toString(); - - return serviceMetadata; + QString supportedPlatforms = meta.value("supported_platforms").toString(); + + if (platformFilters_.match(supportedPlatforms)) { + StreamingServiceMetadata serviceMetadata; + serviceMetadata.author = meta.value("author").toString(); + serviceMetadata.authorWebsite = meta.value("author_website").toString(); + serviceMetadata.logoPath = QFileInfo(QFileInfo(filePath).dir(), meta.value("icon").toString()).absoluteFilePath(); + serviceMetadata.name = meta.value("name").toString(); + serviceMetadata.url = meta.value("url").toString(); + serviceMetadata.version = meta.value("version").toString(); + + return serviceMetadata; + } + else + throw runtime_error("plugin not supported"); } Theme StreamingServiceLoader::readTheme(const QString& filePath) @@ -98,12 +103,19 @@ unique_ptr StreamingServiceLoader::loadService(const QString& QString scriptPath = findFileByExtension(directory, "js"); QString themePath = findFileByExtension(directory, "json"); QString locale = QLocale::system().name().split("_")[0]; - StreamingServiceMetadata metadata = readMetadata(metadataPath); + StreamingServiceMetadata metadata; + try { + metadata = readMetadata(metadataPath); + } + catch (std::runtime_error& error) { + LOG_INFO(logger_, "plugin is not supported on this platform"); + return nullptr; + } + metadata.pluginDirectory = directory; metadata.script = readFileContent(scriptPath); metadata.scriptPath = scriptPath; Theme theme = readTheme(themePath); - return make_unique(metadata, theme); } diff --git a/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.hpp b/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.hpp index 737234c3..a177d006 100644 --- a/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.hpp +++ b/lib/MellowPlayer/Infrastructure/StreamingServices/StreamingServiceLoader.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include namespace MellowPlayer::Application { @@ -33,5 +34,6 @@ namespace MellowPlayer::Infrastructure std::shared_ptr& toCheck) const; Application::ILogger& logger_; + PlatformFilters platformFilters_; }; } diff --git a/plugins/8tracks/metadata.ini b/plugins/8tracks/metadata.ini index 3c8aa5b8..363a8720 100644 --- a/plugins/8tracks/metadata.ini +++ b/plugins/8tracks/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=8tracks -require_proprietary_codecs=false +supported_platforms=All url=https://8tracks.com version=3.0 diff --git a/plugins/deezer/metadata.ini b/plugins/deezer/metadata.ini index 04994bb6..bdffedae 100644 --- a/plugins/deezer/metadata.ini +++ b/plugins/deezer/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=Deezer -require_proprietary_codecs=false +supported_platforms=All url=https://deezer.com version=3.0 diff --git a/plugins/googleplaymusic/metadata.ini b/plugins/googleplaymusic/metadata.ini index c234f442..daf3da6a 100644 --- a/plugins/googleplaymusic/metadata.ini +++ b/plugins/googleplaymusic/metadata.ini @@ -2,6 +2,6 @@ author=Conor Anderson author_website=https://conr.ca/ icon=logo.svg name=Google Play Music -require_proprietary_codecs=false +supported_platforms=All url=https://play.google.com/music/listen version=2.0 diff --git a/plugins/hearthisat/metadata.ini b/plugins/hearthisat/metadata.ini index 9a866337..e07850a8 100644 --- a/plugins/hearthisat/metadata.ini +++ b/plugins/hearthisat/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=HearThisAt -require_proprietary_codecs=false +supported_platforms=All url=https://hearthis.at/ version=1.0 diff --git a/plugins/mixcloud/metadata.ini b/plugins/mixcloud/metadata.ini index 7fa047e5..0d73180f 100644 --- a/plugins/mixcloud/metadata.ini +++ b/plugins/mixcloud/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=Mixcloud -require_proprietary_codecs=true +supported_platforms=Linux url=https://mixcloud.com version=3.0 diff --git a/plugins/pocketcasts/metadata.ini b/plugins/pocketcasts/metadata.ini index 3735b7b0..cdeab7e6 100644 --- a/plugins/pocketcasts/metadata.ini +++ b/plugins/pocketcasts/metadata.ini @@ -2,6 +2,6 @@ author=Lukas Kolletzki author_website=https://github.com/kolletzki icon=logo.svg name=Pocket Casts -require_proprietary_codecs=false +supported_platforms=Linux url=https://play.pocketcasts.com/ version=1.0 diff --git a/plugins/soundcloud/metadata.ini b/plugins/soundcloud/metadata.ini index 13c8f92a..791d0768 100644 --- a/plugins/soundcloud/metadata.ini +++ b/plugins/soundcloud/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=http://github.com/ColinDuquesnoy icon=logo.svg name=Soundcloud -require_proprietary_codecs=true +supported_platforms=Linux url=https://soundcloud.com version=3.0 diff --git a/plugins/spotify/metadata.ini b/plugins/spotify/metadata.ini index 76e0db2d..e9fb5275 100644 --- a/plugins/spotify/metadata.ini +++ b/plugins/spotify/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=Spotify -require_proprietary_codecs=true +supported_platforms=Linux url=https://open.spotify.com/ version=3.0 diff --git a/plugins/tidal/metadata.ini b/plugins/tidal/metadata.ini index cc77e632..4b2bc849 100644 --- a/plugins/tidal/metadata.ini +++ b/plugins/tidal/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=Tidal -require_proprietary_codecs=false +supported_platforms=All url=https://listen.tidal.com/ version=1.0 diff --git a/plugins/tunein/metadata.ini b/plugins/tunein/metadata.ini index cdac696e..4d4d7bf8 100644 --- a/plugins/tunein/metadata.ini +++ b/plugins/tunein/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=TuneIn -require_proprietary_codecs=false +supported_platforms=All url=https://tunein.com/ version=3.0 diff --git a/plugins/youtube/metadata.ini b/plugins/youtube/metadata.ini index 79ae852a..eac18597 100644 --- a/plugins/youtube/metadata.ini +++ b/plugins/youtube/metadata.ini @@ -2,6 +2,6 @@ author=Colin Duquesnoy author_website=https://github.com/ColinDuquesnoy icon=logo.svg name=Youtube -require_proprietary_codecs=false +supported_platforms=All url=https://youtube.com version=1.0 diff --git a/tests/UnitTests/Infrastructure/PlatformFilters/PlatformFiltersTests.cpp b/tests/UnitTests/Infrastructure/PlatformFilters/PlatformFiltersTests.cpp index 0e9a3d93..4be4eadf 100644 --- a/tests/UnitTests/Infrastructure/PlatformFilters/PlatformFiltersTests.cpp +++ b/tests/UnitTests/Infrastructure/PlatformFilters/PlatformFiltersTests.cpp @@ -9,8 +9,7 @@ using namespace MellowPlayer::Infrastructure; SCENARIO("PlatformFiltersTests") { GIVEN("a PlatformFilters instance") { - PlatformFilterFactory factory; - PlatformFilters filters(factory); + PlatformFilters filters; WHEN("filter is 'All'") { QString filter = "All";