|
6 | 6 | #include <QEventLoop> |
7 | 7 | #include <QFile> |
8 | 8 | #include <QFileInfo> |
| 9 | +#include <QMap> |
9 | 10 | #include <QRegularExpression> |
10 | 11 | #include <QString> |
11 | 12 | #include <QStringList> |
@@ -59,11 +60,10 @@ constexpr const char* kServertype = "Servertype"; |
59 | 60 | constexpr const char* kStreamDesc = "StreamDesc"; |
60 | 61 | constexpr const char* kStreamGenre = "StreamGenre"; |
61 | 62 | constexpr const char* kStreamName = "StreamName"; |
62 | | -constexpr const char* kStreamIRC = "StreamIRC"; |
63 | | -constexpr const char* kStreamAIM = "StreamAIM"; |
64 | | -constexpr const char* kStreamICQ = "StreamICQ"; |
65 | 63 | constexpr const char* kStreamPublic = "StreamPublic"; |
66 | 64 | constexpr const char* kStreamWebsite = "StreamWebsite"; |
| 65 | +constexpr const char* kStreamExtraMetadata = "StreamExtraMetadata"; |
| 66 | +constexpr const char* kStreamExtraMetadataEntry = "Entry"; |
67 | 67 |
|
68 | 68 | #ifdef __QTKEYCHAIN__ |
69 | 69 | constexpr const char* kKeychainPrefix = "Mixxx - "; |
@@ -188,37 +188,34 @@ bool BroadcastProfile::equals(BroadcastProfilePtr other) { |
188 | 188 | } |
189 | 189 |
|
190 | 190 | bool BroadcastProfile::valuesEquals(BroadcastProfilePtr other) { |
191 | | - if (getEnabled() == other->getEnabled() |
192 | | - && secureCredentialStorage() == other->secureCredentialStorage() |
193 | | - && getHost() == other->getHost() |
194 | | - && getPort() == other->getPort() |
195 | | - && getServertype() == other->getServertype() |
196 | | - && getLogin() == other->getLogin() |
197 | | - && getPassword() == other->getPassword() |
198 | | - && getEnableReconnect() == other->getEnableReconnect() |
199 | | - && getReconnectPeriod() == other->getReconnectPeriod() |
200 | | - && getLimitReconnects() == other->getLimitReconnects() |
201 | | - && getMaximumRetries() == other->getMaximumRetries() |
202 | | - && getNoDelayFirstReconnect() == other->getNoDelayFirstReconnect() |
203 | | - && getReconnectFirstDelay() == other->getReconnectFirstDelay() |
204 | | - && getFormat() == other->getFormat() |
205 | | - && getBitrate() == other->getBitrate() |
206 | | - && getChannels() == other->getChannels() |
207 | | - && getMountpoint() == other->getMountpoint() |
208 | | - && getStreamName() == other->getStreamName() |
209 | | - && getStreamDesc() == other->getStreamDesc() |
210 | | - && getStreamGenre() == other->getStreamGenre() |
211 | | - && getStreamPublic() == other->getStreamPublic() |
212 | | - && getStreamWebsite() == other->getStreamWebsite() |
213 | | - && getStreamIRC() == other->getStreamIRC() |
214 | | - && getStreamAIM() == other->getStreamAIM() |
215 | | - && getStreamICQ() == other->getStreamICQ() |
216 | | - && getEnableMetadata() == other->getEnableMetadata() |
217 | | - && getMetadataCharset() == other->getMetadataCharset() |
218 | | - && getCustomArtist() == other->getCustomArtist() |
219 | | - && getCustomTitle() == other->getCustomTitle() |
220 | | - && getMetadataFormat() == other->getMetadataFormat() |
221 | | - && getOggDynamicUpdate() == other->getOggDynamicUpdate()) { |
| 191 | + if (getEnabled() == other->getEnabled() && |
| 192 | + secureCredentialStorage() == other->secureCredentialStorage() && |
| 193 | + getHost() == other->getHost() && getPort() == other->getPort() && |
| 194 | + getServertype() == other->getServertype() && |
| 195 | + getLogin() == other->getLogin() && |
| 196 | + getPassword() == other->getPassword() && |
| 197 | + getEnableReconnect() == other->getEnableReconnect() && |
| 198 | + getReconnectPeriod() == other->getReconnectPeriod() && |
| 199 | + getLimitReconnects() == other->getLimitReconnects() && |
| 200 | + getMaximumRetries() == other->getMaximumRetries() && |
| 201 | + getNoDelayFirstReconnect() == other->getNoDelayFirstReconnect() && |
| 202 | + getReconnectFirstDelay() == other->getReconnectFirstDelay() && |
| 203 | + getFormat() == other->getFormat() && |
| 204 | + getBitrate() == other->getBitrate() && |
| 205 | + getChannels() == other->getChannels() && |
| 206 | + getMountpoint() == other->getMountpoint() && |
| 207 | + getStreamName() == other->getStreamName() && |
| 208 | + getStreamDesc() == other->getStreamDesc() && |
| 209 | + getStreamGenre() == other->getStreamGenre() && |
| 210 | + getStreamPublic() == other->getStreamPublic() && |
| 211 | + getStreamWebsite() == other->getStreamWebsite() && |
| 212 | + getStreamExtraMetadata() == other->getStreamExtraMetadata() && |
| 213 | + getEnableMetadata() == other->getEnableMetadata() && |
| 214 | + getMetadataCharset() == other->getMetadataCharset() && |
| 215 | + getCustomArtist() == other->getCustomArtist() && |
| 216 | + getCustomTitle() == other->getCustomTitle() && |
| 217 | + getMetadataFormat() == other->getMetadataFormat() && |
| 218 | + getOggDynamicUpdate() == other->getOggDynamicUpdate()) { |
222 | 219 | return true; |
223 | 220 | } |
224 | 221 |
|
@@ -261,10 +258,7 @@ void BroadcastProfile::copyValuesTo(BroadcastProfilePtr other) { |
261 | 258 | other->setStreamGenre(this->getStreamGenre()); |
262 | 259 | other->setStreamPublic(this->getStreamPublic()); |
263 | 260 | other->setStreamWebsite(this->getStreamWebsite()); |
264 | | - other->setStreamIRC(this->getStreamIRC()); |
265 | | - other->setStreamAIM(this->getStreamAIM()); |
266 | | - other->setStreamICQ(this->getStreamICQ()); |
267 | | - |
| 261 | + other->setStreamExtraMetadata(this->getStreamExtraMetadata()); |
268 | 262 | other->setEnableMetadata(this->getEnableMetadata()); |
269 | 263 | other->setMetadataCharset(this->getMetadataCharset()); |
270 | 264 | other->setCustomArtist(this->getCustomArtist()); |
@@ -295,9 +289,7 @@ void BroadcastProfile::adoptDefaultValues() { |
295 | 289 | m_streamName = kDefaultStreamName; |
296 | 290 | m_streamPublic = kDefaultStreamPublic; |
297 | 291 | m_streamWebsite = MIXXX_WEBSITE_URL; |
298 | | - m_streamIRC.clear(); |
299 | | - m_streamAIM.clear(); |
300 | | - m_streamICQ.clear(); |
| 292 | + m_streamExtraMetadata.clear(); |
301 | 293 |
|
302 | 294 | m_enableMetadata = kDefaultEnableMetadata; |
303 | 295 | m_metadataCharset = QString(); |
@@ -384,9 +376,24 @@ bool BroadcastProfile::loadValues(const QString& filename) { |
384 | 376 | m_streamGenre = selectCleanNodeString(doc, kStreamGenre, &fixedStrings); |
385 | 377 | m_streamPublic = (bool)XmlParse::selectNodeInt(doc, kStreamPublic); |
386 | 378 | m_streamWebsite = selectCleanNodeString(doc, kStreamWebsite, &fixedStrings); |
387 | | - m_streamIRC = selectCleanNodeString(doc, kStreamIRC, &fixedStrings); |
388 | | - m_streamAIM = selectCleanNodeString(doc, kStreamAIM, &fixedStrings); |
389 | | - m_streamICQ = selectCleanNodeString(doc, kStreamICQ, &fixedStrings); |
| 379 | + |
| 380 | + // Load extra metadata key/value pairs |
| 381 | + m_streamExtraMetadata.clear(); |
| 382 | + QDomElement extraMetaElem = XmlParse::selectNode(doc, kStreamExtraMetadata).toElement(); |
| 383 | + if (!extraMetaElem.isNull()) { |
| 384 | + QDomNodeList entries = extraMetaElem.elementsByTagName( |
| 385 | + QString::fromLatin1(kStreamExtraMetadataEntry)); |
| 386 | + for (int i = 0; i < entries.count(); i++) { |
| 387 | + QDomElement entry = entries.at(i).toElement(); |
| 388 | + if (!entry.isNull()) { |
| 389 | + QString key = entry.attribute(QStringLiteral("key")); |
| 390 | + QString value = removeControlCharacters(entry.text(), key, &fixedStrings); |
| 391 | + if (!key.isEmpty()) { |
| 392 | + m_streamExtraMetadata.insert(key, value); |
| 393 | + } |
| 394 | + } |
| 395 | + } |
| 396 | + } |
390 | 397 |
|
391 | 398 | m_format = selectCleanNodeString(doc, kFormat, &fixedStrings); |
392 | 399 | if (m_format == BROADCAST_FORMAT_OV_LEGACY) { |
@@ -463,9 +470,22 @@ bool BroadcastProfile::save(const QString& filename) { |
463 | 470 | XmlParse::addElement(doc, docRoot, kStreamPublic, |
464 | 471 | QString::number((int)m_streamPublic)); |
465 | 472 | XmlParse::addElement(doc, docRoot, kStreamWebsite, m_streamWebsite); |
466 | | - XmlParse::addElement(doc, docRoot, kStreamIRC, m_streamIRC); |
467 | | - XmlParse::addElement(doc, docRoot, kStreamAIM, m_streamAIM); |
468 | | - XmlParse::addElement(doc, docRoot, kStreamICQ, m_streamICQ); |
| 473 | + |
| 474 | + // Save extra metadata key/value pairs |
| 475 | + if (!m_streamExtraMetadata.isEmpty()) { |
| 476 | + QDomElement extraMetaElem = doc.createElement( |
| 477 | + QString::fromLatin1(kStreamExtraMetadata)); |
| 478 | + for (auto it = m_streamExtraMetadata.constBegin(); |
| 479 | + it != m_streamExtraMetadata.constEnd(); |
| 480 | + ++it) { |
| 481 | + QDomElement entry = doc.createElement( |
| 482 | + QString::fromLatin1(kStreamExtraMetadataEntry)); |
| 483 | + entry.setAttribute(QStringLiteral("key"), it.key()); |
| 484 | + entry.appendChild(doc.createTextNode(it.value())); |
| 485 | + extraMetaElem.appendChild(entry); |
| 486 | + } |
| 487 | + docRoot.appendChild(extraMetaElem); |
| 488 | + } |
469 | 489 |
|
470 | 490 | XmlParse::addElement(doc, docRoot, kFormat, m_format); |
471 | 491 | XmlParse::addElement(doc, docRoot, kBitrate, |
@@ -774,28 +794,12 @@ void BroadcastProfile::setStreamWebsite(const QString& value) { |
774 | 794 | m_streamWebsite = removeControlCharacters(value, kStreamWebsite); |
775 | 795 | } |
776 | 796 |
|
777 | | -QString BroadcastProfile::getStreamIRC() const { |
778 | | - return m_streamIRC; |
779 | | -} |
780 | | - |
781 | | -void BroadcastProfile::setStreamIRC(const QString& value) { |
782 | | - m_streamIRC = removeControlCharacters(value, kStreamIRC); |
783 | | -} |
784 | | - |
785 | | -QString BroadcastProfile::getStreamAIM() const { |
786 | | - return m_streamAIM; |
787 | | -} |
788 | | - |
789 | | -void BroadcastProfile::setStreamAIM(const QString& value) { |
790 | | - m_streamAIM = removeControlCharacters(value, kStreamAIM); |
791 | | -} |
792 | | - |
793 | | -QString BroadcastProfile::getStreamICQ() const { |
794 | | - return m_streamICQ; |
| 797 | +QMap<QString, QString> BroadcastProfile::getStreamExtraMetadata() const { |
| 798 | + return m_streamExtraMetadata; |
795 | 799 | } |
796 | 800 |
|
797 | | -void BroadcastProfile::setStreamICQ(const QString& value) { |
798 | | - m_streamICQ = removeControlCharacters(value, kStreamICQ); |
| 801 | +void BroadcastProfile::setStreamExtraMetadata(const QMap<QString, QString>& metadata) { |
| 802 | + m_streamExtraMetadata = metadata; |
799 | 803 | } |
800 | 804 |
|
801 | 805 | QString BroadcastProfile::getFormat() const { |
|
0 commit comments