1 /* LyricServer.cpp */
2 
3 /* Copyright (C) 2011-2020 Michael Lugmair (Lucio Carreras)
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include "LyricServer.h"
22 #include "LyricServerJsonWriter.h"
23 #include <QJsonDocument>
24 #include <QJsonObject>
25 #include <QJsonArray>
26 #include <QJsonValue>
27 
28 namespace Lyrics
29 {
30 	struct Server::Private
31 	{
32 		QString name;
33 		QString address;
34 		Server::Replacements replacements;
35 		QString directUrlTemplate;
36 		Server::StartEndTags startEndTag;
37 		bool isStartTagIncluded = false;
38 		bool isEndTagIncluded = false;
39 		bool isNumeric = false;
40 		bool isLowercase = false;
41 		QString errorString;
42 
43 		QString searchResultRegex;
44 		QString searchResultUrlTemplate;
45 		QString searchUrlTemplate;
46 	};
47 
Server()48 	Server::Server()
49 	{
50 		m = Pimpl::make<Private>();
51 	}
52 
53 	Server::~Server() = default;
54 
canFetchDirectly() const55 	bool Server::canFetchDirectly() const
56 	{
57 		return !(m->address.isEmpty() || m->directUrlTemplate.isEmpty() || m->startEndTag.isEmpty());
58 	}
59 
canSearch() const60 	bool Server::canSearch() const
61 	{
62 		return !(m->address.isEmpty() || m->searchResultRegex.isEmpty() || m->searchResultUrlTemplate.isEmpty() ||
63 		         m->searchUrlTemplate.isEmpty());
64 	}
65 
name() const66 	QString Server::name() const
67 	{
68 		return m->name;
69 	}
70 
setName(const QString & name)71 	void Server::setName(const QString& name)
72 	{
73 		m->name = name;
74 	}
75 
address() const76 	QString Server::address() const
77 	{
78 		return m->address;
79 	}
80 
setAddress(const QString & address)81 	void Server::setAddress(const QString& address)
82 	{
83 		m->address = address;
84 	}
85 
replacements() const86 	Server::Replacements Server::replacements() const
87 	{
88 		return m->replacements;
89 	}
90 
setReplacements(const Server::Replacements & replacements)91 	void Server::setReplacements(const Server::Replacements& replacements)
92 	{
93 		m->replacements = replacements;
94 	}
95 
directUrlTemplate() const96 	QString Server::directUrlTemplate() const
97 	{
98 		return m->directUrlTemplate;
99 	}
100 
setDirectUrlTemplate(const QString & direct_url_template)101 	void Server::setDirectUrlTemplate(const QString& direct_url_template)
102 	{
103 		m->directUrlTemplate = direct_url_template;
104 	}
105 
startEndTag() const106 	Server::StartEndTags Server::startEndTag() const
107 	{
108 		return m->startEndTag;
109 	}
110 
setStartEndTag(const StartEndTags & start_end_tag)111 	void Server::setStartEndTag(const StartEndTags& start_end_tag)
112 	{
113 		m->startEndTag = start_end_tag;
114 	}
115 
isStartTagIncluded() const116 	bool Server::isStartTagIncluded() const
117 	{
118 		return m->isStartTagIncluded;
119 	}
120 
setIsStartTagIncluded(bool is_start_tag_included)121 	void Server::setIsStartTagIncluded(bool is_start_tag_included)
122 	{
123 		m->isStartTagIncluded = is_start_tag_included;
124 	}
125 
isEndTagIncluded() const126 	bool Server::isEndTagIncluded() const
127 	{
128 		return m->isEndTagIncluded;
129 	}
130 
setIsEndTagIncluded(bool isEndTagIncluded)131 	void Server::setIsEndTagIncluded(bool isEndTagIncluded)
132 	{
133 		m->isEndTagIncluded = isEndTagIncluded;
134 	}
135 
isNumeric() const136 	bool Server::isNumeric() const
137 	{
138 		return m->isNumeric;
139 	}
140 
setIsNumeric(bool isNumeric)141 	void Server::setIsNumeric(bool isNumeric)
142 	{
143 		m->isNumeric = isNumeric;
144 	}
145 
isLowercase() const146 	bool Server::isLowercase() const
147 	{
148 		return m->isLowercase;
149 	}
150 
setIsLowercase(bool isLowercase)151 	void Server::setIsLowercase(bool isLowercase)
152 	{
153 		m->isLowercase = isLowercase;
154 	}
155 
errorString() const156 	QString Server::errorString() const
157 	{
158 		return m->errorString;
159 	}
160 
setErrorString(const QString & errorString)161 	void Server::setErrorString(const QString& errorString)
162 	{
163 		m->errorString = errorString;
164 	}
165 
searchResultRegex() const166 	QString Server::searchResultRegex() const
167 	{
168 		return m->searchResultRegex;
169 	}
170 
setSearchResultRegex(const QString & searchResultRegex)171 	void Server::setSearchResultRegex(const QString& searchResultRegex)
172 	{
173 		m->searchResultRegex = searchResultRegex;
174 	}
175 
searchResultUrlTemplate() const176 	QString Server::searchResultUrlTemplate() const
177 	{
178 		return m->searchResultUrlTemplate;
179 	}
180 
setSearchResultUrlTemplate(const QString & searchResultUrlTemplate)181 	void Server::setSearchResultUrlTemplate(const QString& searchResultUrlTemplate)
182 	{
183 		m->searchResultUrlTemplate = searchResultUrlTemplate;
184 	}
185 
searchUrlTemplate() const186 	QString Server::searchUrlTemplate() const
187 	{
188 		return m->searchUrlTemplate;
189 	}
190 
setSearchUrlTemplate(const QString & searchUrlTemplate)191 	void Server::setSearchUrlTemplate(const QString& searchUrlTemplate)
192 	{
193 		m->searchUrlTemplate = searchUrlTemplate;
194 	}
195 
toJson()196 	QJsonObject Server::toJson()
197 	{
198 		return Lyrics::ServerJsonWriter::toJson(this);
199 	}
200 
fromJson(const QJsonObject & json)201 	Server* Server::fromJson(const QJsonObject& json)
202 	{
203 		return Lyrics::ServerJsonReader::fromJson(json);
204 	}
205 
applyReplacements(const QString & str) const206 	QString Server::applyReplacements(const QString& str) const
207 	{
208 		return applyReplacements(str, this->replacements());
209 	}
210 
applyReplacements(const QString & str,const Lyrics::Server::Replacements & replacements)211 	QString Server::applyReplacements(const QString& str, const Lyrics::Server::Replacements& replacements)
212 	{
213 		auto result = str;
214 
215 		for(const auto& replacement : replacements)
216 		{
217 			while(result.contains(replacement.first))
218 			{
219 				result.replace(replacement.first, replacement.second);
220 			}
221 		}
222 
223 		return result;
224 	}
225 }