Skip to content
This repository has been archived by the owner on May 3, 2019. It is now read-only.

Commit

Permalink
#115 Filter plugin by support platform
Browse files Browse the repository at this point in the history
  • Loading branch information
ColinDuquesnoy committed Sep 17, 2017
1 parent 94e688a commit ebc9cb2
Show file tree
Hide file tree
Showing 18 changed files with 64 additions and 79 deletions.
39 changes: 16 additions & 23 deletions docs/developers/PlantUml/FilterPluginsByPlatform.puml
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand 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 {
Expand All @@ -32,24 +33,20 @@ package MellowPlayer::Infrastructure {
}
TokenizedFilters ..> FilterConverter: <<use>>

interface IPlatformFilterFactory

class PlatformFilterFactory {
+ Create(Filter filter): unique_ptr<IPlatformFilter>
}
IPlatformFilterFactory <|-- PlatformFilterFactory
PlatformFilterFactory ..> IPlatformFilter: <<create>>
PlatformFilterFactory .left.> IPlatformFilter: <<create>>

class PlatformFilters {
+ match(QString): bool
--
- filterFactory_: IPlatformFilterFactory
- filterFactory_: PlatformFilterFactory
}
IPlatformFilters <|-- PlatformFilters
PlatformFilters .left.> TokenizedFilters : <<use>>
PlatformFilters -right-> IPlatformFilterFactory
PlatformFilters ..> TokenizedFilters : <<use>>
PlatformFilters ..> PlatformFilterFactory : <<use>>

PlatformFilters .left.> IPlatformFilter: <<match>>
PlatformFilters ..> IPlatformFilter: <<match>>

interface IPlatformFilter {
match(): bool
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,9 @@ namespace MellowPlayer::Infrastructure
{
class IPlatformFilter;

class IPlatformFilterFactory
class PlatformFilterFactory
{
public:
virtual std::unique_ptr<IPlatformFilter> create(Filter filter) const = 0;
};

class PlatformFilterFactory: public IPlatformFilterFactory
{
public:
std::unique_ptr<IPlatformFilter> create(Filter filter) const override;
std::unique_ptr<IPlatformFilter> create(Filter filter) const;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -98,12 +103,19 @@ unique_ptr<StreamingService> 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<StreamingService>(metadata, theme);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <MellowPlayer/Application/StreamingServices/IStreamingServiceLoader.hpp>
#include <MellowPlayer/Infrastructure/Platform/Filters/PlatformFilters.hpp>

namespace MellowPlayer::Application
{
Expand Down Expand Up @@ -33,5 +34,6 @@ namespace MellowPlayer::Infrastructure
std::shared_ptr<Application::StreamingService>& toCheck) const;

Application::ILogger& logger_;
PlatformFilters platformFilters_;
};
}
2 changes: 1 addition & 1 deletion plugins/8tracks/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/deezer/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/googleplaymusic/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/hearthisat/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/mixcloud/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/pocketcasts/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/soundcloud/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/spotify/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/tidal/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/tunein/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion plugins/youtube/metadata.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down

0 comments on commit ebc9cb2

Please sign in to comment.