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 }